Esempio n. 1
0
def _generate_runtime_asm():
    source_list = []
    for source_file in _get_source_files():
        source_list.append(source_file)

    # now try to compile
    try:
        mlogger.debug('Compiling base types to: %s', RUNTIME_ASSM_FILE)
        res, msgs = labs.Common.CodeCompiler.CompileCSharp(
            sourceFiles=Array[str](source_list),
            outputPath=RUNTIME_ASSM_FILE,
            references=Array[str](get_references()),
            defines=Array[str](["REVIT{}".format(HOST_APP.version)]))
        # log results
        logfile = RUNTIME_ASSM_FILE.replace('.dll', '.log')
        with open(logfile, 'w') as lf:
            lf.write('\n'.join(msgs))
        # load compiled dll if successful
        if res:
            return assmutils.load_asm_file(RUNTIME_ASSM_FILE)
        # otherwise raise hell
        else:
            raise PyRevitException("Error compiling runtime")
    except PyRevitException as compile_err:
        errors = safe_strtype(compile_err).replace('Compile error: ', '')
        mlogger.critical('Can not compile base types code into assembly.\n%s',
                         errors)
        raise compile_err
Esempio n. 2
0
def _produce_asm_file(extension):
    # unique assembly filename for this package
    ext_asm_fileid = _make_ext_asm_fileid(extension)
    ext_asm_file_path = \
        appdata.get_data_file(file_id=ext_asm_fileid,
                              file_ext=framework.ASSEMBLY_FILE_TYPE)
    # make unique assembly name for this package
    ext_asm_file_name = coreutils.get_file_name(ext_asm_file_path)

    if _is_pyrevit_ext_already_loaded(ext_asm_file_name):
        mlogger.debug('Extension assembly is already loaded: %s',
                      ext_asm_file_name)
        _update_component_cmd_types(extension)
        return ExtensionAssemblyInfo(ext_asm_file_name, ext_asm_file_path,
                                     True)
    elif appdata.is_data_file_available(file_id=ext_asm_fileid,
                                        file_ext=framework.ASSEMBLY_FILE_TYPE):
        mlogger.debug('Extension assembly file already exists: %s',
                      ext_asm_file_path)
        try:
            loaded_assm = assmutils.load_asm_file(ext_asm_file_path)
            for asm_name in loaded_assm.GetReferencedAssemblies():
                mlogger.debug('Checking referenced assembly: %s', asm_name)
                ref_asm_file_path = \
                    appdata.is_file_available(
                        file_name=asm_name.Name,
                        file_ext=framework.ASSEMBLY_FILE_TYPE
                        )
                if ref_asm_file_path:
                    mlogger.debug('Loading referenced assembly: %s',
                                  ref_asm_file_path)
                    try:
                        assmutils.load_asm_file(ref_asm_file_path)
                    except Exception as load_err:
                        mlogger.error(
                            'Error loading referenced assembly: %s '
                            '| %s', ref_asm_file_path, load_err)

            _update_component_cmd_types(extension)
            return ExtensionAssemblyInfo(ext_asm_file_name, ext_asm_file_path,
                                         False)
        except Exception as ext_asm_load_err:
            mlogger.error('Error loading extension assembly: %s | %s',
                          ext_asm_file_path, ext_asm_load_err)
    else:
        return _create_asm_file(extension, ext_asm_file_name,
                                ext_asm_file_path)
Esempio n. 3
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)
Esempio n. 4
0
def _produce_ui_linkbutton(ui_maker_params):
    """

    Args:
        ui_maker_params (UIMakerParams): Standard parameters for making ui item
    """
    parent_ui_item = ui_maker_params.parent_ui
    parent = ui_maker_params.parent_cmp
    linkbutton = ui_maker_params.component
    ext_asm_info = ui_maker_params.asm_info

    if not linkbutton.is_supported:
        return None

    if linkbutton.is_beta and not ui_maker_params.create_beta_cmds:
        return None

    mlogger.debug('Producing button: %s', linkbutton)
    try:
        linked_asm = None
        # attemp to find the assembly file
        linked_asm_file = linkbutton.get_target_assembly()
        # if not found, search the loaded assemblies
        # this is usually a slower process
        if linked_asm_file:
            linked_asm = assmutils.load_asm_file(linked_asm_file)
        else:
            linked_asm_list = assmutils.find_loaded_asm(linkbutton.assembly)
            # cancel button creation if not found
            if not linked_asm_list:
                mlogger.error("Can not find target assembly for %s", linkbutton)
                return None
            linked_asm = linked_asm_list[0]

        parent_ui_item.create_push_button(
            button_name=linkbutton.name,
            asm_location=linked_asm.Location,
            class_name=_make_full_class_name(
                linked_asm.GetName().Name,
                linkbutton.command_class
                ),
            icon_path=linkbutton.icon_file or parent.icon_file,
            tooltip=_make_button_tooltip(linkbutton),
            tooltip_ext=_make_button_tooltip_ext(linkbutton,
                                                 ext_asm_info.name),
            tooltip_media=linkbutton.media_file,
            ctxhelpurl=linkbutton.help_url,
            avail_class_name=linkbutton.avail_class_name,
            update_if_exists=True,
            ui_title=_make_ui_title(linkbutton))
        linkbutton_ui = parent_ui_item.button(linkbutton.name)

        _set_highlights(linkbutton, linkbutton_ui)

        return linkbutton_ui
    except PyRevitException as err:
        mlogger.error('UI error: %s', err.msg)
        return None
Esempio n. 5
0
def _get_reference_file(ref_name):
    mlogger.debug('Searching for dependency: %s', ref_name)
    # First try to find the dll in the project folder
    addin_file = framework.get_dll_file(ref_name)
    if addin_file:
        assmutils.load_asm_file(addin_file)
        return addin_file

    mlogger.debug('Dependency is not shipped: %s', ref_name)
    mlogger.debug('Searching for dependency in loaded assemblies: %s',
                  ref_name)
    # Lastly try to find location of assembly if already loaded
    loaded_asm = assmutils.find_loaded_asm(ref_name)
    if loaded_asm:
        return loaded_asm[0].Location

    mlogger.debug('Dependency is not loaded: %s', ref_name)
    mlogger.debug('Searching for dependency in installed frameworks: %s',
                  ref_name)
    # Then try to find the dll in windows installed framework files
    if DOTNET_DIR:
        fw_module_file = _get_framework_module(ref_name)
        if fw_module_file:
            return fw_module_file

    mlogger.debug('Dependency is not installed: %s', ref_name)
    mlogger.debug('Searching for dependency in installed frameworks sdks: %s',
                  ref_name)
    # Then try to find the dll in windows SDK
    if DOTNET_TARGETPACK_DIRS:
        fw_sdk_module_file = _get_framework_sdk_module(ref_name)
        if fw_sdk_module_file:
            return fw_sdk_module_file

    # if not worked raise critical error
    mlogger.critical('Can not find required reference assembly: %s', ref_name)
Esempio n. 6
0
def _generate_runtime_asm():
    source_list = []
    for source_file in _get_source_files():
        source_list.append(source_file)

    # now try to compile
    try:
        mlogger.debug('Compiling base types to: %s', RUNTIME_ASSM_FILE)
        compiler.compile_csharp(source_list,
                                RUNTIME_ASSM_FILE,
                                reference_list=get_references(),
                                resource_list=[])
        return assmutils.load_asm_file(RUNTIME_ASSM_FILE)

    except PyRevitException as compile_err:
        errors = safe_strtype(compile_err).replace('Compile error: ', '')
        mlogger.critical('Can not compile base types code into assembly.\n%s',
                         errors)
        raise compile_err
Esempio n. 7
0
def _get_runtime_asm():
    if appdata.is_data_file_available(file_id=RUNTIME_ASSM_FILE_ID,
                                      file_ext=framework.ASSEMBLY_FILE_TYPE):
        return assmutils.load_asm_file(RUNTIME_ASSM_FILE)
    else:
        return _generate_runtime_asm()
Esempio n. 8
0
    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
        mlogger.debug('Loading cpython engine: %s', CPYTHON_ENGINE_ASSM)
        assmutils.load_asm_file(CPYTHON_ENGINE_ASSM)
    else:
        raise PyRevitException('Can not find cpython engines.')

    # create a hash for the loader assembly
    # this hash is calculated based on:
    # - runtime csharp files
    # - runtime engine version
    # - cpython engine version
    BASE_TYPES_DIR_HASH = \
        coreutils.get_str_hash(
            coreutils.calculate_dir_hash(INTERFACE_TYPES_DIR, '', SOURCE_FILE_FILTER)
            + EXEC_PARAMS.engine_ver
            + str(CPYTHON_ENGINE.Version)
            )[:HASH_CUTOFF_LENGTH]
    RUNTIME_ASSM_FILE_ID = '{}_{}'\