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)
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)
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 ) )
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)
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))
# 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
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