コード例 #1
0
ファイル: asmmaker.py プロジェクト: BimRoss/pyRevit
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)
コード例 #2
0
def _update_component_cmd_types(extension):
    for cmd_component in extension.get_all_commands():
        make_cmd_types(extension, cmd_component, module_builder=None)