Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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)
Exemplo n.º 11
0
        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
Exemplo n.º 12
0
    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:
Exemplo n.º 13
0
        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
Exemplo n.º 14
0
 def add_subsection(self, section_name):
     """Add subsection to section."""
     return self._parser.add_section(
         coreutils.make_canonical_name(self._section_name, section_name)
     )