def is_file_available(file_name, file_ext, universal=False): if universal: full_filename = op.join(PYREVIT_APP_DIR, make_canonical_name(file_name, file_ext)) else: full_filename = op.join(PYREVIT_VERSION_APP_DIR, make_canonical_name(file_name, file_ext)) if op.exists(full_filename): return full_filename else: return False
def _get_addin_dll_file(addin_filename): addin_file = op.join( ADDIN_DIR, make_canonical_name(addin_filename, ASSEMBLY_FILE_TYPE)) if op.exists(addin_file): return addin_file return None
def _get_addin_dll(addin_filename): # finding dlls in addins directory addin_file = \ op.join(ADDIN_DIR, coreutils.make_canonical_name(addin_filename, loader.ASSEMBLY_FILE_TYPE)) logger.debug('Dll requested: {}'.format(addin_file)) if op.exists(addin_file): return addin_file
def _get_pyrevitloader_dll(addin_filename): # finding dlls in specific PyRevitLoader directory addin_file = \ op.join(PYREVITLOADER_DIR, coreutils.make_canonical_name(addin_filename, loader.ASSEMBLY_FILE_TYPE)) logger.debug('Dll requested: {}'.format(addin_file)) if op.exists(addin_file): return addin_file
def _get_framework_module(fw_module): # start with the newest sdk folder and work backwards trying to find the dll for sdk_folder in reversed(FRAMEWORK_DIRS): fw_module_file = op.join( DOTNET_SDK_DIR, sdk_folder, make_canonical_name(fw_module, ASSEMBLY_FILE_TYPE)) if op.exists(fw_module_file): sys.path.append(op.join(DOTNET_SDK_DIR, sdk_folder)) return fw_module_file return None
def is_file_available(file_name, file_ext, universal=False): """Check if given file is available within appdata directory. Args: file_name (str): file name file_ext (str): file extension universal (bool): Check against universal data files Returns: str: file path if file is available """ if universal: full_filename = op.join(pyrevit.PYREVIT_APP_DIR, make_canonical_name(file_name, file_ext)) else: full_filename = op.join(pyrevit.PYREVIT_VERSION_APP_DIR, make_canonical_name(file_name, file_ext)) if op.exists(full_filename): return full_filename else: return False
def _create_asm_file(extension, ext_asm_file_name, ext_asm_file_path): # check to see if any older assemblies have been loaded for this package ext_asm_full_file_name = make_canonical_name(ext_asm_file_name, ASSEMBLY_FILE_TYPE) # this means that we currently have this package loaded and # we're reloading a new version is_reloading_pkg = _is_any_ext_asm_loaded(extension) # create assembly logger.debug('Building assembly for package: {}'.format(extension)) pyrvt_ver_int_tuple = get_pyrevit_version().as_int_tuple() win_asm_name = AssemblyName(Name=ext_asm_file_name, Version=Version(pyrvt_ver_int_tuple[0], pyrvt_ver_int_tuple[1], pyrvt_ver_int_tuple[2])) logger.debug('Generated assembly name for this package: {0}'.format( ext_asm_file_name)) logger.debug( 'Generated windows assembly name for this package: {0}'.format( win_asm_name)) logger.debug('Generated assembly file name for this package: {0}'.format( ext_asm_full_file_name)) # get assembly builder asm_builder = AppDomain.CurrentDomain.DefineDynamicAssembly( win_asm_name, AssemblyBuilderAccess.RunAndSave, op.dirname(ext_asm_file_path)) # get module builder module_builder = asm_builder.DefineDynamicModule(ext_asm_file_name, ext_asm_full_file_name) # create classes that could be called from any button (shared classes) # currently only default availability class is implemented. # Default availability class is for resetting buttons back to normal # context state (when reloading and after their context # has changed during a session). make_shared_types(module_builder) # create command classes for cmd_component in extension.get_all_commands(): # create command executor class for this command logger.debug('Creating types for command: {}'.format(cmd_component)) make_cmd_types(extension, cmd_component, module_builder) # save final assembly asm_builder.Save(ext_asm_full_file_name) load_asm_file(ext_asm_file_path) logger.debug('Executer assembly saved.') return ExtensionAssemblyInfo(ext_asm_file_name, ext_asm_file_path, is_reloading_pkg)
def _get_framework_sdk_module(fw_module): # start with the newest sdk folder and # work backwards trying to find the dll for sdk_folder in DOTNET_TARGETPACK_DIRS: fw_module_file = op.join( DOTNET_SDK_DIR, sdk_folder, coreutils.make_canonical_name(fw_module, framework.ASSEMBLY_FILE_TYPE)) mlogger.debug('Searching for sdk: %s', fw_module_file) if op.exists(fw_module_file): mlogger.debug('Found sdk: %s', fw_module_file) sys.path.append(op.join(DOTNET_SDK_DIR, sdk_folder)) return fw_module_file return None
def _get_framework_module(fw_module): # start with the newest sdk folder and # work backwards trying to find the dll for fw_folder in DOTNET_FRAMEWORK_DIRS: fw_module_file = op.join(DOTNET_DIR, fw_folder, make_canonical_name(fw_module, ASSEMBLY_FILE_TYPE)) mlogger.debug('Searching for installed: %s', fw_module_file) if op.exists(fw_module_file): mlogger.debug('Found installed: %s', fw_module_file) sys.path.append(op.join(DOTNET_DIR, fw_folder)) return fw_module_file return None
def _create_asm_file(extension, ext_asm_file_name, ext_asm_file_path): # check to see if any older assemblies have been loaded for this package ext_asm_full_file_name = \ coreutils.make_canonical_name(ext_asm_file_name, framework.ASSEMBLY_FILE_TYPE) # this means that we currently have this package loaded and # we're reloading a new version is_reloading_pkg = _is_any_ext_asm_loaded(extension) # create assembly mlogger.debug('Building assembly for package: %s', extension) pyrvt_ver_int_tuple = get_pyrevit_version().as_int_tuple() win_asm_name = AssemblyName(Name=ext_asm_file_name, Version=Version(pyrvt_ver_int_tuple[0], pyrvt_ver_int_tuple[1], pyrvt_ver_int_tuple[2])) mlogger.debug('Generated assembly name for this package: %s', ext_asm_file_name) mlogger.debug('Generated windows assembly name for this package: %s', win_asm_name) mlogger.debug('Generated assembly file name for this package: %s', ext_asm_full_file_name) # get assembly builder asm_builder = AppDomain.CurrentDomain.DefineDynamicAssembly( win_asm_name, AssemblyBuilderAccess.RunAndSave, op.dirname(ext_asm_file_path)) # get module builder module_builder = asm_builder.DefineDynamicModule(ext_asm_file_name, ext_asm_full_file_name) # create command classes for cmd_component in extension.get_all_commands(): # create command executor class for this command mlogger.debug('Creating types for command: %s', cmd_component) typemaker.make_bundle_types(extension, cmd_component, module_builder) # save final assembly asm_builder.Save(ext_asm_full_file_name) assmutils.load_asm_file(ext_asm_file_path) mlogger.debug('Executer assembly saved.') return ExtensionAssemblyInfo(ext_asm_file_name, ext_asm_file_path, is_reloading_pkg)
FRAMEWORK_DIRS = None logger.debug( 'Dotnet SDK is not installed. | {}'.format(dotnet_sdk_err)) else: LOADER_DIR = ADDIN_DIR = ADDIN_RESOURCE_DIR = INTERFACE_TYPES_DIR = None DOTNET_SDK_DIR = FRAMEWORK_DIRS = None # base classes for pyRevit commands ------------------------------------------------------------------------------------ LOADER_BASE_NAMESPACE = 'PyRevitBaseClasses' # template python command class CMD_EXECUTOR_TYPE_NAME = '{}.{}'.format(LOADER_BASE_NAMESPACE, 'PyRevitCommand') # template python command availability class CMD_AVAIL_TYPE_NAME = make_canonical_name(LOADER_BASE_NAMESPACE, 'PyRevitCommandDefaultAvail') CMD_AVAIL_TYPE_NAME_CATEGORY = make_canonical_name( LOADER_BASE_NAMESPACE, 'PyRevitCommandCategoryAvail') CMD_AVAIL_TYPE_NAME_SELECTION = make_canonical_name( LOADER_BASE_NAMESPACE, 'PyRevitCommandSelectionAvail') source_file_filter = '(\.cs)' if not EXEC_PARAMS.doc_mode: BASE_TYPES_DIR_HASH = calculate_dir_hash( INTERFACE_TYPES_DIR, '', source_file_filter)[:HASH_CUTOFF_LENGTH] BASE_TYPES_ASM_FILE_ID = '{}_{}'.format(BASE_TYPES_DIR_HASH, LOADER_BASE_NAMESPACE) BASE_TYPES_ASM_FILE = appdata.get_data_file(BASE_TYPES_ASM_FILE_ID, ASSEMBLY_FILE_TYPE) # taking the name of the generated data file and use it as assembly name
except Exception as dotnet_sdk_err: FRAMEWORK_DIRS = [] mlogger.debug('Dotnet SDK is not installed. | %s', dotnet_sdk_err) else: INTERFACE_TYPES_DIR = DOTNET_SDK_DIR = FRAMEWORK_DIRS = None # base classes for pyRevit commands -------------------------------------------- LOADER_BASE_NAMESPACE = 'PyRevitBaseClasses' # template python command class CMD_EXECUTOR_TYPE_NAME = '{}.{}'\ .format(LOADER_BASE_NAMESPACE, 'PyRevitCommand') # template python command availability class CMD_AVAIL_TYPE_NAME = \ make_canonical_name(LOADER_BASE_NAMESPACE, 'PyRevitCommandDefaultAvail') CMD_AVAIL_TYPE_NAME_EXTENDED = \ make_canonical_name(LOADER_BASE_NAMESPACE, 'PyRevitCommandExtendedAvail') CMD_AVAIL_TYPE_NAME_SELECTION = \ make_canonical_name(LOADER_BASE_NAMESPACE, 'PyRevitCommandSelectionAvail') # template dynamobim command class DYNOCMD_EXECUTOR_TYPE_NAME = '{}.{}'\ .format(LOADER_BASE_NAMESPACE, 'PyRevitCommandDynamoBIM') SOURCE_FILE_EXT = '.cs' SOURCE_FILE_FILTER = r'(\.cs)' if not EXEC_PARAMS.doc_mode:
DOTNET_TARGETPACK_DIRS = [] mlogger.debug('Dotnet SDK is not installed. | %s', dotnet_sdk_err) else: DOTNET_DIR = INTERFACE_TYPES_DIR = DOTNET_SDK_DIR = \ DOTNET_FRAMEWORK_DIRS = DOTNET_TARGETPACK_DIRS = None # base classes for pyRevit commands -------------------------------------------- RUNTIME_NAMESPACE = 'PyRevitLabs.PyRevit.Runtime' # template python command class CMD_EXECUTOR_TYPE_NAME = '{}.{}'\ .format(RUNTIME_NAMESPACE, 'ScriptCommand') # template python command availability class CMD_AVAIL_TYPE_NAME_EXTENDED = \ coreutils.make_canonical_name(RUNTIME_NAMESPACE, 'ScriptCommandExtendedAvail') CMD_AVAIL_TYPE_NAME_SELECTION = \ coreutils.make_canonical_name(RUNTIME_NAMESPACE, 'ScriptCommandSelectionAvail') CMD_AVAIL_TYPE_NAME_ZERODOC = \ coreutils.make_canonical_name(RUNTIME_NAMESPACE, 'ScriptCommandZeroDocAvail') CMD_AVAIL_NAME_POSTFIX = '-avail' SOURCE_FILE_EXT = '.cs' SOURCE_FILE_FILTER = r'(\.cs)' if not EXEC_PARAMS.doc_mode: # get and load the active Cpython engine CPYTHON_ENGINE = user_config.get_active_cpython_engine() if CPYTHON_ENGINE: CPYTHON_ENGINE_ASSM = CPYTHON_ENGINE.AssemblyPath
def add_subsection(self, section_name): """Add subsection to section.""" return self._parser.add_section( coreutils.make_canonical_name(self._section_name, section_name) )