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 CSV file manager for families and re-exporting to a CSV file

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