def action(doc, curview, filter_class, eq_symbol): walls = \ DB.FilteredElementCollector(doc,curview.Id)\ .OfCategory(DB.BuiltInCategory.OST_Walls)\ .WhereElementIsNotElementType()\ .ToElements() if walls: target_parameter = DB.BuiltInParameter.CURVE_ELEM_LENGTH cur_units = get_type(walls[0], target_parameter) length = float( forms.ask_for_string("Enter length in {0}".format(cur_units))) length_feet = convert_to_internal(length, cur_units) param_filter = filter_rule(target_parameter, filter_class, length_feet) same_cat_elements = \ DB.FilteredElementCollector(doc,curview.Id)\ .OfCategory(DB.BuiltInCategory.OST_Walls)\ .WhereElementIsNotElementType()\ .WherePasses(param_filter)\ .ToElements() filered_elements = [i.Id for i in same_cat_elements] num_walls = len(filered_elements) revit.get_selection().set_to(filered_elements) print_output(num_walls, length, cur_units, eq_symbol) else: forms.alert("No wall found in current view", exitscript=True)
def write_to_excel(): """Option to write to excel by reading existing sheets groups from excel""" sheet_group_para = str( forms.ask_for_string("Sheet Group", prompt='Enter unique sheet group parameter name', title=dest)) title = [ "Sheet Number", "Sheet Name", sheet_group_para, "Approved By", "Designed By", "Reviewed By", "Drawn By", "Date" ] try: workbook = xlsxwriter.Workbook(dest) worksheet = workbook.add_worksheet() # writing title into excel for i, v in enumerate(title): worksheet.write(0, i, v) read_sheets(sheet_group_para) row = 1 zipped_lists = zip(sheet_num, sheet_name, sheet_group, sheet_approved, sheet_designed, sheet_checked, sheet_drawn, sheet_issue) sorted_zipped_lists = sorted(zipped_lists) for inpu in sorted_zipped_lists: worksheet.write(row, 0, inpu[0]) worksheet.write(row, 1, inpu[1]) worksheet.write(row, 2, inpu[2]) worksheet.write(row, 3, inpu[3]) worksheet.write(row, 4, inpu[4]) worksheet.write(row, 5, inpu[5]) worksheet.write(row, 6, inpu[6]) worksheet.write(row, 7, inpu[7]) row += 1 column = 0 for col in [ sheet_num, sheet_name, sheet_group, sheet_approved, sheet_designed, sheet_checked, sheet_drawn, sheet_issue ]: width = max_width(col) worksheet.set_column(column, column, width) #( first column,last_column,width) column += 1 workbook.close() open_excel() except Exception as ex: error = str(ex) if "len() of unsized object" in error: forms.alert("{0} parameter has no value".format(sheet_group_para), exitscript=True) elif "[Errno 32] The process cannot access the file " in error: forms.alert("Close the open excel Sheet_groups and try again", exitscript=True) elif "'NoneType' object has no attribute 'AsString'" in error: forms.alert("Sheet Group parameter not defined", exitscript=True) else: print(traceback.format_exc())
def get_adder_number_from_user(count): prompt = 'Выбрано [{}]. Введите число, которое нужно добавить к марке:'.format(count) user_number = ask_for_string(default='0', prompt=prompt, title='Add number to mark') if user_number is None: raise UserCancelOperation adder_number = int(user_number) logger.debug('Get adder number from user [{}]'.format(adder_number)) return adder_number
def rename_tag(self, sender, args): if self.selected_tags: self.Close() new_tag = forms.ask_for_string(default=self.selected_tags[0].name, prompt='Enter new tag name:', title='Tag Manager') if new_tag: try: with revit.Transaction('Rename Tag', log_errors=False): tagsmgr.rename_tag(self.selected_tags[0], new_tag, self._target_elements) except Exception as e: forms.alert(getattr(e, 'msg', str(e)))
cat).WhereElementIsNotElementType().ToElements() data = list() for e in collector: try: room = linkDoc.GetRoomAtPoint(e.GetSpatialElementCalculationPoint(), p) except: room = linkDoc.GetRoomAtPoint(e.Location.Point, p) if room: number = room.LookupParameter("Number").AsString( ) if room.LookupParameter("Number") else "No number" name = room.LookupParameter("Name").AsString() if room.LookupParameter( "Name") else "No name" line = number + "-" + name data.append(line) else: data.append("Not in a room") parName = forms.ask_for_string( default='Parameter Name', prompt='In which parameter do you want to store the location information?', title='Enter Instance Parameter Name') t = Transaction(doc, "Instance Room Locations") t.Start() for e, d in zip(collector, data): e.LookupParameter(parName).Set(d) t.Commit()
ttitle = test_title.format('Filter Func') print(ttitle) kwargs['title'] = ttitle kwargs['multiple'] = True if 'filterfunc' not in kwargs: kwargs['filterfunc'] = lambda x: filterfuncstr in str(x) selection = forms_func(*args, **kwargs) if selection: print(selection) else: print('No selection...') print( forms.ask_for_string(default='test default', prompt='test prompt', title='test title')) print( forms.ask_for_one_item(['test item 1', 'test item 2', 'test item 3'], default='test item 2', prompt='test prompt', title='test title')) print( forms.ask_for_date(default='2018/11/09', prompt='test prompt', title='test title')) print(forms.select_swatch(title='test title', button_name='Test button name'))
from pyrevit.framework import List doc =__revit__.ActiveUIDocument.Document uidoc =__revit__.ActiveUIDocument # make sure active view is not a sheet curview = doc.ActiveView if isinstance(curview, DB.ViewSheet): forms.alert("You're on a Sheet. Activate a model view please.", exitscript=True) try: wall_id = [] target_tag = str(forms.ask_for_string("Enter tag name")) wall_id_list = None # Creating a dictionary options_category = {'Structural Columns': DB.BuiltInCategory.OST_StructuralColumns, 'Walls': DB.BuiltInCategory.OST_Walls, 'Structural Framing': DB.BuiltInCategory.OST_StructuralFraming, 'Floors': DB.BuiltInCategory.OST_Floors, 'Foundation':DB.BuiltInCategory.OST_StructuralFoundation } selected_switch_category = \ forms.CommandSwitchWindow.show(sorted(options_category.keys()), message='Search for tag {0} in category:'.format(target_tag))
import clr, re clr.AddReference('RevitAPI') clr.AddReference("System") from Autodesk.Revit.DB import FilteredElementCollector, Transaction, ImportInstance, BuiltInCategory, \ ModelPathUtils, SaveAsOptions, WorksharingSaveAsOptions, Level, FilledRegionType, FamilySymbol, GraphicsStyleType, \ CurveElement, Color, DimensionType, BuiltInParameter, Dimension from Autodesk.Revit.UI import UIApplication clr. AddReferenceByPartialName('PresentationCore') clr.AddReferenceByPartialName('PresentationFramework') clr.AddReferenceByPartialName('System.Windows.Forms') clr.AddReference('RevitAPIUI') __doc__ = 'Add custom prefix to families.' # Ask for string input from user prefix = forms.ask_for_string(default='', prompt='Please input custom prefix', title='Add Prefix') cateName = [] families = FilteredElementCollector(doc).OfClass(FamilySymbol).ToElements() for f in families: cate = f.Family.FamilyCategory.Name if not cate in cateName: cateName.append(cate) n ''' def SetDimensionStyle(doc, source, destination): elements = FilteredElementCollector(doc).OfClass(Dimension).ToElements() for i in elements: if i.LookupParameter('Type').AsValueString() == source: i.LookupParameter('Type').Set(destination.Id)
def ask_for_starting_number(category_name): """Ask user for starting number.""" return forms.ask_for_string(prompt="Enter starting number", title="ReNumber {}".format(category_name))
return size_set def convert_to_internal(value, unit="mm"): return UnitUtils.ConvertToInternalUnits( float(value), LENGTH_UNIT ) csv_path = forms.pick_file(file_ext="csv") if csv_path: with revit.Transaction("Create PipeType from csv"): name = forms.ask_for_string( default="ScheduleName", prompt="Enter a schedule name eg. SDR6 or EN10217-1 serie 2", title="PipeTypeCreation", ) schedule_id = PipeScheduleType.Create(doc, name).Id size_set = read_csv(csv_path) materials = [ (material.Name, material.Id) for material in FilteredElementCollector(doc).OfClass(Material) ] material = forms.SelectFromList.show( materials, multiselect=False, button_name="Select material", title="PipeTypeCreation",
__author__ = 'Carlos Romero Carballo' import clr clr.AddReference('RevitAPI') from Autodesk.Revit.DB import * from pyrevit import forms doc = __revit__.ActiveUIDocument.Document uidoc = __revit__.ActiveUIDocument default_filter_name = forms.ask_for_string( default='View All', prompt='Enter Phase Filter name:', title='Phase Filter Reset' ) old_filters = FilteredElementCollector(doc).OfClass(PhaseFilter).ToElements() old_filters_names = [filter.Name for filter in old_filters] t = Transaction(doc,"Phase Filter Reset") t.Start() if default_filter_name in old_filters_names: [doc.Delete(filter.Id) for filter in old_filters if filter.Name != default_filter_name] else: new_filter = PhaseFilter.Create(doc,default_filter_name) [new_filter.SetPhaseStatusPresentation(eval("ElementOnPhaseStatus." + categ),PhaseStatusPresentation.ShowOverriden)\ for categ in ["New","Existing","Demolished","Temporary"]] [doc.Delete(filter.Id) for filter in old_filters]
# Getting selection from user __context__ = 'Selection' doc = __revit__.ActiveUIDocument.Document elements = revit.get_selection() # get selection of familytypes if elements: # if elements under different category are selected null is returned cat_id = list(set([ele.Category.Id for ele in elements if ele.Category]))[0] element_types = DB.FilteredElementCollector(doc).OfCategoryId( cat_id).WhereElementIsElementType().ToElements() num = int(forms.ask_for_string("Enter number of duplicates")) name_list = [DB.Element.Name.__get__(ele) for ele in element_types] with DB.Transaction(doc, 'Change Name') as t: try: t.Start() duplicate_counter = 1 for ele in elements: name = DB.Element.Name.__get__(ele) for i in range(num): new_name = name + " ({})".format(duplicate_counter) if new_name not in name_list: if DB.NamingUtils.IsValidName(new_name): ele.Duplicate(new_name) else: forms.alert(
# Getting selection from user __context__ = 'Selection' doc =__revit__.ActiveUIDocument.Document print_mgr = revit.doc.PrintManager print_settings = [revit.doc.GetElement(x) for x in revit.doc.GetPrintSettingIds()] #List of print settings like A1,A3,.. selected_print_setting = print_mgr.PrintSetup.InSession #If no print setting defined we can use default <in-session> printers = list(Drawing.Printing.PrinterSettings.InstalledPrinters) # list of printers like Adobe PDF,Blubeam PDF printers = sorted(printers) selected_printer = printers[0] select_sheets = revit.get_selection() # get selection of sheets sheetsetname = forms.ask_for_string("Sheet set name",prompt='Enter Name of new sheet set',title="Set creator") if sheetsetname == "" or sheetsetname == "Sheet set name": sheetsetname = "Default set-1" with DB.Transaction(doc, 'Add range') as t: t.Start() print_mgr.PrintSetup.CurrentPrintSetting = selected_print_setting print_mgr.SelectNewPrintDriver(selected_printer) print_mgr.PrintRange = DB.PrintRange.Select t.Commit() # add non-printable char in front of sheet Numbers # to push revit to sort them per user sheet_set = DB.ViewSet() original_sheetnums = [] with DB.Transaction(doc,'Add Sheets') as tg:
message='Pick only elements of type:' ) # vals = list(set(map(lambda x: revitron.Parameter(x, selected_param).getValueString(), scope))) vals = list( set(map(lambda x: x.parameters[selected_param].value_string, scope))) vals.append('*other') selected_value = \ forms.CommandSwitchWindow.show( sorted(vals), message='Pick only elements of type:' ) if selected_value == '*other': selected_value = \ forms.ask_for_string( default='some-tag', prompt='Enter new tag name:', title='Tag Manager' ) # ids = revitron.Filter(list(scope)).noTypes().byStringContains(selected_param, selected_value).getElementIds() col = db.Collector(scope, of_category=selected_category, where=lambda x: selected_value in x.parameters[ selected_param].value_string) revitron.Selection.set(ids)
TaskDialog.Show('CHENGYING GONG', msg) selection = Selection.get_selected_elements(doc) # convenience variable for first element in selection if len(selection): s0 = selection[0] selection = Selection.get_selected_elements(doc) output = [] value1 = [] value2 = [] id = [] # Input Parameter Name parameter1 = forms.ask_for_string(default='', prompt='Please input Original Parameter', title='Parameter Mapper') parameter2 = forms.ask_for_string(default='', prompt='Please input Destination Parameter', title='Parameter Mapper') # Transaction Start for x in selection: t = Transaction(doc, "Map Parameters") t.Start() v1 = x.LookupParameter(parameter1) v2 = x.LookupParameter(parameter2) if v1 is None: output = alert("The first input is not a valid parameter.") pass
# coding=utf8 from Autodesk.Revit.DB import FilteredElementCollector, BuiltInParameter, ElementId from pyrevit import script, forms, revit logger = script.get_logger() uidoc = __revit__.ActiveUIDocument doc = uidoc.Document text_ids = forms.ask_for_string( default="GlobalId", prompt="Enter comma separated GlobalId eg. 2N4yNZJ_XDjPMRumXBulXA, 2N4yNZJ_XDjPMRumXBulXD", title="Select by GlobalId", ) if text_ids: ifc_globalids = { ifc_globalid.strip(): ElementId(-1) for ifc_globalid in text_ids.split(",") } for element in ( FilteredElementCollector(doc) .WhereElementIsNotElementType() .WhereElementIsViewIndependent() .ToElements() ): globalid_parameter = element.get_Parameter(BuiltInParameter.IFC_GUID) if not globalid_parameter: continue ifc_guid = globalid_parameter.AsString() for ifc_globalid in ifc_globalids.keys(): if ifc_guid == ifc_globalid:
if selected_views: myviewset = DB.ViewSet() for el in selected_views: myviewset.Insert(el) if myviewset.IsEmpty: forms.alert('At least one view must be selected.') else: # Ask for a print set name and check if need to be replaced sheetsetname = None while not sheetsetname\ or (sheetsetname in print_sets_names_existing and not forms.alert("Replace existing Print Set?", yes=True, no=True)): sheetsetname = forms.ask_for_string( default=print_sets_names_existing[-1]\ if print_sets_names_existing else 'ViewPrintSet', prompt="Give new Print Set a Name:") if not sheetsetname: script.exit() # Collect existing sheet sets viewsheetsets = DB.FilteredElementCollector(revit.doc)\ .OfClass(framework.get_type(DB.ViewSheetSet))\ .WhereElementIsNotElementType()\ .ToElements() allviewsheetsets = {vss.Name: vss for vss in viewsheetsets} with revit.Transaction('Created Print Set'): # Delete existing matching sheet set if sheetsetname in allviewsheetsets.keys():
if with_detailing: dupop = DB.ViewDuplicateOption.WithDetailing else: dupop = DB.ViewDuplicateOption.Duplicate try: el.Duplicate(dupop) except Exception as duplerr: logger.error('Error duplicating view "{}" | {}'.format( revit.query.get_name(el), duplerr)) try: selected_views = forms.select_views(filterfunc=duplicableview) num = int(forms.ask_for_string("Enter number of views")) if selected_views: selected_option = \ forms.CommandSwitchWindow.show( ['WITH Detailing', 'WITHOUT Detailing'], message='Select duplication option:' ) if selected_option: duplicate_views(selected_views, num, with_detailing=True if selected_option == 'WITH Detailing' else False) except:
from pyrevit.framework import List from pyrevit import revit, DB from pyrevit import forms #getting selection from user # __context__ = 'Selection' doc = __revit__.ActiveUIDocument.Document uidoc = __revit__.ActiveUIDocument curview = doc.ActiveView # gets current view if isinstance(curview, DB.ViewSheet): forms.alert("You're on a Sheet. Activate a model view please.", exitscript=True) length_feet = float(forms.ask_for_string( "Enter length in meters")) / 0.3048 # sometimes revit interprets 1 > 1.0 target_parameter = DB.BuiltInParameter.CURVE_ELEM_LENGTH # FAMILY_TOP_LEVEL_PARAM, FAMILY_BASE_LEVEL_PARAM param_id = DB.ElementId(target_parameter) param_prov = DB.ParameterValueProvider(param_id) param_equality = DB.FilterNumericEquals() # equality class value_rule = DB.FilterDoubleRule(param_prov, param_equality, length_feet, 1e-3 / 0.3048) # tolerance of 1 mm param_filter = DB.ElementParameterFilter(value_rule) same_cat_elements = \ DB.FilteredElementCollector(doc,curview.Id)\ .OfCategory(DB.BuiltInCategory.OST_Walls)\ .WhereElementIsNotElementType()\ .WherePasses(param_filter)\ .ToElements()
from Autodesk.Revit.DB import FilteredElementCollector, BuiltInCategory, Transaction, TransactionGroup, BuiltInParameter, ElementId doc = __revit__.ActiveUIDocument.Document uidoc = __revit__.ActiveUIDocument sel = [ el for el in [doc.GetElement(id) for id in uidoc.Selection.GetElementIds()] if el.Category.Name == 'Текстовые примечания' ] num = 1 if __shiftclick__: from pyrevit import forms num = forms.ask_for_string(default='1', prompt='Введите начальное значение', title='Нумеровать текст') num = int(num) t = Transaction(doc, "Нумеровать текст") t.Start() for el in sel: el.Text = str(num) num += 1 t.Commit() # def natural_sorted(list, key=lambda s: s): # """ # Sort the list into natural alphanumeric order. # """