Пример #1
0
    def get_symbols(self):
        """
        Loads family in a fake transaction to return all symbols.

        Returns
        -------
        set()
            Set of family symbols

        Remark
        ------
        Uses SmartSortableFamilySymbol for effective sorting
        """
        logger.debug('Fake loading family: {}'.format(self.name))
        symbol_set = set()
        with revit.ErrorSwallower():
            # DryTransaction will rollback all the changes
            with revit.DryTransaction('Fake load'):
                ret_ref = clr.Reference[DB.Family]()
                revit.doc.LoadFamily(self.path, ret_ref)
                loaded_fam = ret_ref.Value
                # Get the symbols
                for symbol_id in loaded_fam.GetFamilySymbolIds():
                    symbol = revit.doc.GetElement(symbol_id)
                    symbol_name = revit.query.get_name(symbol)
                    sortable_sym = SmartSortableFamilySymbol(symbol_name)
                    logger.debug('Importable Symbol: {}'.format(sortable_sym))
                    symbol_set.add(sortable_sym)
        return sorted(symbol_set)
Пример #2
0
    def _print_sheets_in_order(self, target_sheets):
        # make sure we can access the print config
        print_mgr = self._get_printmanager()
        if not print_mgr:
            return
        print_mgr.PrintToFile = True
        per_sheet_psettings = self.selected_print_setting.allows_variable_paper
        with revit.DryTransaction('Set Printer Settings',
                                  doc=self.selected_doc):
            if not per_sheet_psettings:
                print_mgr.PrintSetup.CurrentPrintSetting = \
                    self.selected_print_setting.print_settings
            print_mgr.SelectNewPrintDriver(self.selected_printer)
            print_mgr.PrintRange = DB.PrintRange.Current
            for sheet in target_sheets:
                if sheet.printable:
                    if sheet.print_filename:
                        print_mgr.PrintToFileName = \
                            op.join(USER_DESKTOP, sheet.print_filename)

                        # set the per-sheet print settings if required
                        if per_sheet_psettings:
                            print_mgr.PrintSetup.CurrentPrintSetting = \
                                sheet.print_settings

                        print_mgr.SubmitPrint(sheet.revit_sheet)
                    else:
                        logger.debug(
                            'Sheet %s does not have a valid file name.',
                            sheet.number)
                else:
                    logger.debug('Sheet %s is not printable. Skipping print.',
                                 sheet.number)
Пример #3
0
    def copy(self):
        viewports = revit.get_selection().include(DB.Viewport)
        if len(viewports) != 1:
            raise Exception('Exactly one viewport must be selected')
        viewport = viewports[0]
        view = revit.doc.GetElement(viewport.ViewId)

        title_block_pt = \
            ViewportPlacementAction.get_title_block_placement(viewport)

        if view.ViewType in [DB.ViewType.DraftingView, DB.ViewType.Legend]:
            alignment = ALIGNMENT_CROPBOX
        else:
            alignment = forms.CommandSwitchWindow.show(
                ALIGNMENT_OPTIONS_COPY,
                message='Select Alignment Option')

        if not alignment:
            return

        with revit.DryTransaction('Activate & Read Cropbox, Copy Center'):
            if alignment == ALIGNMENT_BASEPOINT:
                revit.update.set_crop_region(
                    view,
                    ViewportPlacementAction.zero_cropbox(view)
                    )
            # use cropbox as alignment if it active
            if alignment == ALIGNMENT_BASEPOINT or view.CropBoxActive:
                ViewportPlacementAction.activate_cropbox(view)
                ViewportPlacementAction.hide_all_elements(view)
                revit.doc.Regenerate()

            if alignment == ALIGNMENT_CROPBOX:
                outline = view.Outline
                offset_uv = (outline.Max - outline.Min) / 2
            center = viewport.GetBoxCenter() - title_block_pt

        script.store_data(
            slot_name=self.__class__.__name__,
            data=ViewportPlacementData(
                alignment=alignment,
                center=center,
                offset_uv=offset_uv if alignment == ALIGNMENT_CROPBOX else None
            )
        )
Пример #4
0
    def _print_sheets_in_order(self):
        # make sure we can access the print config
        print_mgr = self._get_printmanager()
        if not print_mgr:
            return
        print_mgr.PrintToFile = True
        with revit.DryTransaction('Set Printer Settings'):
            print_mgr.PrintSetup.CurrentPrintSetting = \
                self.selected_print_setting
            print_mgr.SelectNewPrintDriver(self.selected_printer)
            print_mgr.PrintRange = DB.PrintRange.Current
            for sheet in self.sheet_list:
                output_fname = \
                    coreutils.cleanup_filename('{:05} {} - {}.pdf'
                                            .format(sheet.print_index,
                                                    sheet.number,
                                                    sheet.name))

                print_mgr.PrintToFileName = op.join(USER_DESKTOP, output_fname)
                if sheet.printable:
                    print_mgr.SubmitPrint(sheet.revit_sheet)
                else:
                    logger.debug('Sheet %s is not printable. Skipping print.',
                                 sheet.number)
Пример #5
0
from pyrevit import script
from pyrevit import revit


__context__ = 'selection'
__helpurl__ = 'https://www.youtube.com/watch?v=4IlvCkoOolw'
__doc__ = 'Lists all the elements that are tied to the selected element.'\
          ' For example elements tags or dimensions.'


selection = revit.get_selection()
output = script.get_output()


if not selection.is_empty:
    print("Searching for all objects tied to ELEMENT ID: {0}..."
          .format(selection.first.Id))
    with revit.DryTransaction("Search for linked elements"):
        linked_elements_list = revit.doc.Delete(selection.first.Id)

    for elId in linked_elements_list:
        el = revit.doc.GetElement(elId)
        if el and elId in selection.element_ids:
            elid_link = output.linkify(elId)
            print("ID: {0}\t\tTYPE: {1} ( selected object )"
                  .format(elid_link, el.GetType().Name))
        elif el:
            elid_link = output.linkify(elId)
            print("ID: {0}\t\tTYPE: {1}"
                  .format(elid_link, el.GetType().Name))
Пример #6
0
# get family document and verify the file exists
fam_doc = revit.doc.EditFamily(fam_symbol)
fam_doc_path = fam_doc.PathName
if not op.exists(fam_doc_path):
    forms.alert(
        'Can not file original family file at\n{}'.format(fam_doc_path))
    logger.debug(
        'Can not file original family file at {}'.format(fam_doc_path))
    script.exit()
else:
    logger.debug('Loading family from: {}'.format(fam_doc_path))

# fake load the family so we can get the symbols
symbol_list = set()
with revit.DryTransaction('Fake load'):
    # remove existing family so we can load the original
    revit.doc.Delete(fam_symbol.Id)
    # now load the original
    ret_ref = clr.Reference[DB.Family]()
    revit.doc.LoadFamily(fam_doc_path, ret_ref)
    loaded_fam = ret_ref.Value
    # get the symbols from the original
    for sym_id in loaded_fam.GetFamilySymbolIds():
        fam_sym = revit.doc.GetElement(sym_id)
        fam_sym_name = revit.ElementWrapper(fam_sym).name
        sortable_sym = SmartSortableFamilyType(fam_sym_name)
        logger.debug('Importable Type: {}'.format(sortable_sym))
        symbol_list.add(sortable_sym)
    # okay. we have all the symbols.
    # DryTransaction will rollback all the changes
Пример #7
0
    def find_linked_elements(self):
        with revit.DryTransaction("Search for linked elements",
                                  clear_after_rollback=True):
            linked_element_ids = revit.doc.Delete(self._rvt_type.Id)

        return linked_element_ids