Solved: Select all content on level - Autodesk Community - Revit Products

Solved: Select all content on level - Autodesk Community - Revit Products

##https://forums.autodesk.com/t5/revit-api-forum/select-all-content-on-level/td-p/10577273 """ Selects all elements that share the same Reference Level as the selected element. TESTED REVIT API: 2020.2.4 Author: Robert Perry Lackowski """ from Autodesk.Revit.DB import ElementLevelFilter, FilteredElementCollector from Autodesk.Revit.DB import Document, BuiltInParameter, BuiltInCategory, ElementFilter, ElementCategoryFilter, LogicalOrFilter, ElementIsElementTypeFilter, ElementId from Autodesk.Revit.Exceptions import OperationCanceledException # from pyrevit import DB doc = __revit__.ActiveUIDocument.Document uidoc = __revit__.ActiveUIDocument from rpw import ui import sys #Ask user to pick an object which has the desired reference level def pick_object(): from Autodesk.Revit.UI.Selection import ObjectType try: picked_object = uidoc.Selection.PickObject(ObjectType.Element, "Select an element.") if picked_object: return doc.GetElement(picked_object.ElementId) else: sys.exit() except: sys.exit() def get_level_id(elem): BIPs = [ BuiltInParameter.CURVE_LEVEL, BuiltInParameter.DPART_BASE_LEVEL_BY_ORIGINAL, BuiltInParameter.DPART_BASE_LEVEL, # BuiltInParameter.FABRICATION_LEVEL_PARAM, BuiltInParameter.FACEROOF_LEVEL_PARAM, BuiltInParameter.FAMILY_BASE_LEVEL_PARAM, BuiltInParameter.FAMILY_LEVEL_PARAM, BuiltInParameter.GROUP_LEVEL, BuiltInParameter.IMPORT_BASE_LEVEL, BuiltInParameter.INSTANCE_REFERENCE_LEVEL_PARAM, BuiltInParameter.INSTANCE_SCHEDULE_ONLY_LEVEL_PARAM, BuiltInParameter.LEVEL_PARAM, BuiltInParameter.MULTISTORY_STAIRS_REF_LEVEL, BuiltInParameter.PATH_OF_TRAVEL_LEVEL_NAME, BuiltInParameter.PLAN_VIEW_LEVEL, # BuiltInParameter.RBS_START_LEVEL_PARAM, BuiltInParameter.ROOF_BASE_LEVEL_PARAM, BuiltInParameter.ROOF_CONSTRAINT_LEVEL_PARAM, BuiltInParameter.ROOM_LEVEL_ID, BuiltInParameter.SCHEDULE_BASE_LEVEL_PARAM, BuiltInParameter.SCHEDULE_LEVEL_PARAM, BuiltInParameter.SLOPE_ARROW_LEVEL_END, # BuiltInParameter.SPACE_REFERENCE_LEVEL_PARAM, BuiltInParameter.STAIRS_BASE_LEVEL, BuiltInParameter.STAIRS_BASE_LEVEL_PARAM, BuiltInParameter.STAIRS_RAILING_BASE_LEVEL_PARAM, BuiltInParameter.STRUCTURAL_REFERENCE_LEVEL_ELEVATION, BuiltInParameter.SYSTEM_ZONE_LEVEL_ID, BuiltInParameter.TRUSS_ELEMENT_REFERENCE_LEVEL_PARAM, BuiltInParameter.VIEW_GRAPH_SCHED_BOTTOM_LEVEL, BuiltInParameter.VIEW_UNDERLAY_BOTTOM_ID, BuiltInParameter.WALL_BASE_CONSTRAINT, BuiltInParameter.WALL_SWEEP_LEVEL_PARAM # BuiltInParameter.ZONE_LEVEL_ID, ] level_id = None for BIP in BIPs: param = elem.get_Parameter(BIP) if param: # print "A common level parameter has been found:" + str(BIP) param_elem_id = param.AsElementId() if param_elem_id.Compare(ElementId.InvalidElementId) == 1: level_id = param_elem_id # print "match found on common level parameter " + str(BIP) + "Level ID: " + str(level_id) return level_id # print "No matching common level parameters found, checking for .LevelId" try: level_id = elem.LevelId if level_id.Compare(ElementId.InvalidElementId) == 1: # print "match found on .LevelId. Level ID: " + str(level_id) return level_id except: # print "No LevelId parameter on this element." pass # print "Still no matches. Try checking for .ReferenceLevel.Id" try: level_id = elem.ReferenceLevel.Id if level_id.Compare(ElementId.InvalidElementId) == 1: # print "match found on .ReferenceLevel.Id Level ID: " + str(level_id) return level_id except: # print "No ReferenceLevel parameter on this element." pass # print "No matches found. Returning None..." return None # print "get selected element, either from current selection or new selection" selection = ui.Selection() if selection: selected_element = selection[0] else: selected_element = pick_object() #print "Element selected: " + selected_element.Name # print "Search selected element for its reference level's element ID" target_level_id = get_level_id(selected_element) # print target_level_id if target_level_id is not None: #poor attempts at filtering FECs. Not filtered enough - they contain far too many elements. #all_elements = FilteredElementCollector(doc).ToElements() #all_elements = FilteredElementCollector(doc).WherePasses(LogicalOrFilter(ElementIsElementTypeFilter( False ), ElementIsElementTypeFilter( True ) ) ).ToElements() #Create a filter. If this script isn't selecting the elements you want, it's possible the category needs to be added to this list. BICs = [ BuiltInCategory.OST_CableTray, BuiltInCategory.OST_CableTrayFitting, BuiltInCategory.OST_Conduit, BuiltInCategory.OST_ConduitFitting, BuiltInCategory.OST_DuctCurves, BuiltInCategory.OST_DuctFitting, BuiltInCategory.OST_DuctTerminal, BuiltInCategory.OST_ElectricalEquipment, BuiltInCategory.OST_ElectricalFixtures, BuiltInCategory.OST_FloorOpening, BuiltInCategory.OST_Floors, BuiltInCategory.OST_FloorsDefault, BuiltInCategory.OST_LightingDevices, BuiltInCategory.OST_LightingFixtures, BuiltInCategory.OST_MechanicalEquipment, BuiltInCategory.OST_PipeCurves, BuiltInCategory.OST_PipeFitting, BuiltInCategory.OST_PlumbingFixtures, BuiltInCategory.OST_RoofOpening, BuiltInCategory.OST_Roofs, BuiltInCategory.OST_RoofsDefault, BuiltInCategory.OST_SpecialityEquipment, BuiltInCategory.OST_Sprinklers, BuiltInCategory.OST_StructuralStiffener, BuiltInCategory.OST_StructuralTruss, BuiltInCategory.OST_StructuralColumns, BuiltInCategory.OST_StructuralFraming, BuiltInCategory.OST_StructuralFramingSystem, BuiltInCategory.OST_StructuralFramingOther, BuiltInCategory.OST_StructuralFramingOpening, BuiltInCategory.OST_StructuralFoundation, BuiltInCategory.OST_Walls, BuiltInCategory.OST_Wire, ] category_filters = [] for BIC in BICs: category_filters.Add(ElementCategoryFilter(BIC)) final_filter = LogicalOrFilter(category_filters) #Apply filter to create list of elements all_elements = FilteredElementCollector(doc).WherePasses(final_filter).WhereElementIsNotElementType().WhereElementIsViewIndependent().ToElements() # print "Number of elements that passed collector filters:" + str(len(all_elements)) selection.clear() for elem in all_elements: elem_level_id = get_level_id(elem) if elem_level_id == target_level_id: selection.add(elem) selection.update() else: print "No level associated with element."

Comments

Popular posts from this blog

Revit area plans adding new types and references (Gross and rentable)

Powerpoint countdown and current time in slides VBA

Revit Python in Visual Studio Revit Stubs 2022 for Python Revit Intellisense