Select Multiple Types: in View/Model
Have you ever tried selecting a few elements with different types, clicking on your favorite shortcut SS/SA to select all and saw nothing happened? Well, here is your dream tool in Python.
First things first:
If you are new to pyRevit there are a few steps you have to do in order to create your new favorite button.
- You need to install pyRevit extension - this will allow you to create add-ins in Revit with python scripts.
- Then it would be good to create your own extension tab.
pyRevit releases on GitHub
Ehsan's Tutorial on creating extensions
Let me know if something is not clear and I will try to make it easier for newcomers to pyRevit world.
Scripts:
So here you will find the code that will create a custom add-in with pyRevit. You can switch between 2 tabs.
After you will create your buttons it's recommended to replace your old shortcuts for SS/SA to these new buttons. They are pretty good in terms of performance and I have not noticed any difference since I replaced them, and they can select more elements than standard ones.
- code
-
# -*- coding: utf-8 -*- __title__ = "Super Select multiple: all in the view" __author__ = "Erik Frits" __highlight__ = 'updated' __helpurl__ = "https://erikfrits.com/blog/super-select-multiple-elements-in-viewmodel/" __doc__ = """Version = 1.1 Date = 08.02.2021 _____________________________________________________________________ Description: This is an improved version of Built-In tool named: 'Select All Instances: Visible in View' [SS]. You can now select similar instances across the whole model with multiple selected elements. _____________________________________________________________________ How-to: Select a few instances in the model and run the script. Your selection should be updated to similar instances visible in the view. _____________________________________________________________________ Prerequisite: -Select a few elements before running the script. _____________________________________________________________________ Last update: - [13.04.2021] - 1.1 RELEASE - [13.04.2021] - added rules for DetailArc, DetailElipse, DetailCurve, DetailNurbSpline - [13.04.2021] - Fixed issue if nothing selected - [02.02.2021] - 1.0 RELEASE - [08.02.2021] - Selection tool works - [08.02.2021] - Selection rule added - [Refference Planes] - [08.02.2021] - Selection rule added - [RevisionClouds] - [08.02.2021] - Selection rule added - [PropertyLine] - [08.02.2021] - Selection rule added - [Lines] - [08.02.2021] - Selection rule added - [RoomSeparation/AreaBoundary] - [08.02.2021] - Imports reduced _____________________________________________________________________ To-do: - _____________________________________________________________________ You are welcome to give me a feedback about the tool if you will encounter any issues with it. E: [email protected] _____________________________________________________________________ """ #____________________________________________________________________ IMPORTS import clr clr.AddReference("System") from System.Collections.Generic import List # from Autodesk.Revit.DB import * from Autodesk.Revit.DB import ( ModelLine, DetailLine, PropertyLine, RevisionCloud, ReferencePlane, FilteredElementCollector, FilterNumericEquals, FilterElementIdRule, ElementFilter, ElementParameterFilter, LogicalOrFilter, ParameterValueProvider, BuiltInParameter, ElementId, DetailCurve, DetailArc, DetailEllipse, DetailNurbSpline, ModelCurve, ModelArc, ModelEllipse, ModelNurbSpline, ) uidoc = __revit__.ActiveUIDocument doc = uidoc.Document #____________________________________________________________________ FUNCTIONS def create_filter(key_parameter, element_value): """Function to create RevitAPI filter. :param key_parameter: e.g. BuiltInParameter.ELEM_CATEGORY_PARAM :param element_value: e.g. element.Category.Id :return: ElementParameterFilter """ f_parameter = ParameterValueProvider(ElementId(key_parameter)) f_parameter_value = element_value f_rule = FilterElementIdRule(f_parameter, FilterNumericEquals(), f_parameter_value) filter = ElementParameterFilter(f_rule) return filter #____________________________________________________________________ MAIN current_selection_ids = uidoc.Selection.GetElementIds() list_of_filters = List[ElementFilter]() for id in current_selection_ids: element = doc.GetElement(id) element_type = type(element) # Rule - [Lines] line_types = [DetailLine, DetailCurve, DetailArc, DetailEllipse, DetailNurbSpline, ModelLine , ModelCurve , ModelArc , ModelEllipse , ModelNurbSpline] if element_type in line_types: # *CATEGORY FILTER* RomSeparation(-2000066) / AreaBoundary(-2000079) if element.Category.Id == ElementId(-2000066) or element.Category.Id == ElementId(-2000079): filter = create_filter(key_parameter=BuiltInParameter.ELEM_CATEGORY_PARAM, element_value=element.Category.Id) list_of_filters.Add(filter) # *LINESTYLE FILTER* Other Lines else: filter = create_filter(key_parameter=BuiltInParameter.BUILDING_CURVE_GSTYLE, element_value=element.LineStyle.Id) list_of_filters.Add(filter) # Rule - [ReferencePlane] elif element_type == ReferencePlane: filter = create_filter(key_parameter=BuiltInParameter.CLINE_SUBCATEGORY, element_value=element.get_Parameter(BuiltInParameter.CLINE_SUBCATEGORY).AsElementId()) list_of_filters.Add(filter) # Rule - [PropertyLine] elif element_type == PropertyLine: filter = create_filter(key_parameter=BuiltInParameter.ELEM_CATEGORY_PARAM, element_value=element.Category.Id) list_of_filters.Add(filter) # Rule - [RevisionClouds] elif element_type == RevisionCloud: filter = create_filter(key_parameter=BuiltInParameter.REVISION_CLOUD_REVISION, element_value=element.get_Parameter(BuiltInParameter.REVISION_CLOUD_REVISION).AsElementId()) list_of_filters.Add(filter) # Rule - [Others] else: filter = create_filter(key_parameter=BuiltInParameter.ELEM_TYPE_PARAM, element_value=element.GetTypeId()) list_of_filters.Add(filter) if list_of_filters: multiple_filters = LogicalOrFilter(list_of_filters) elems = FilteredElementCollector(doc, doc.ActiveView.Id).WherePasses(multiple_filters).ToElementIds() # SET SELECTION if elems: uidoc.Selection.SetElementIds(List[ElementId](elems))
- code
-
# -*- coding: utf-8 -*- __title__ = "Super Select multiple: all in the model" __author__ = "Erik Frits" __highlight__ = 'updated' __helpurl__ = "https://erikfrits.com/blog/super-select-multiple-elements-in-viewmodel/" __doc__ = """Version = 1.1 Date = 08.02.2021 _____________________________________________________________________ Description: This is an improved version of BuiltIn tool named: 'Select All Instances: Visible in Model' [SA]. You can now select similar instances visible in the view with multiple selected elements. _____________________________________________________________________ How-to: Select a few instances in the model and run the script. Your selection should be updated to similar instances visible in the model. _____________________________________________________________________ Prerequisite: -Select a few elements before running the script. _____________________________________________________________________ Last update: - [13.04.2021] - 1.1 RELEASE - [13.04.2021] - added rules for DetailArc, DetailElipse, DetailCurve, DetailNurbSpline - [13.04.2021] - Fixed issue if nothing selected - [02.02.2021] - 1.0 RELEASE - [08.02.2021] - Selection tool works - [08.02.2021] - Selection rule added - [Refference Planes] - [08.02.2021] - Selection rule added - [RevisionClouds] - [08.02.2021] - Selection rule added - [PropertyLine] - [08.02.2021] - Selection rule added - [Lines] - [08.02.2021] - Selection rule added - [RoomSeparation/AreaBoundary] - [08.02.2021] - Imports reduced _____________________________________________________________________ To-do: - _____________________________________________________________________ You are welcome to give me a feedback about the tool if you will encounter any issues with it. E: [email protected] _____________________________________________________________________ """ #____________________________________________________________________ IMPORTS import clr clr.AddReference("System") from System.Collections.Generic import List # from Autodesk.Revit.DB import * from Autodesk.Revit.DB import ( ModelLine, DetailLine, PropertyLine, RevisionCloud, ReferencePlane, FilteredElementCollector, FilterNumericEquals, FilterElementIdRule, ElementFilter, ElementParameterFilter, LogicalOrFilter, ParameterValueProvider, BuiltInParameter, ElementId, DetailCurve, DetailArc, DetailEllipse, DetailNurbSpline, ModelCurve, ModelArc, ModelEllipse, ModelNurbSpline, ) uidoc = __revit__.ActiveUIDocument doc = uidoc.Document #____________________________________________________________________ FUNCTIONS def create_filter(key_parameter, element_value): """Function to create RevitAPI filter.""" f_parameter = ParameterValueProvider(ElementId(key_parameter)) f_parameter_value = element_value #e.g. element.Category.Id f_rule = FilterElementIdRule(f_parameter, FilterNumericEquals(), f_parameter_value) filter = ElementParameterFilter(f_rule) return filter #____________________________________________________________________ MAIN current_selection_ids = uidoc.Selection.GetElementIds() list_of_filters = List[ElementFilter]() for id in current_selection_ids: element = doc.GetElement(id) element_type = type(element) # Rule - [Lines] line_types = [DetailLine, DetailCurve, DetailArc, DetailEllipse, DetailNurbSpline, ModelLine , ModelCurve , ModelArc , ModelEllipse , ModelNurbSpline] if element_type in line_types: # *CATEGORY FILTER* RoomSeparation(-2000066) / AreaBoundary(-2000079) if element.Category.Id == ElementId(-2000066) or element.Category.Id == ElementId(-2000079): filter = create_filter(key_parameter=BuiltInParameter.ELEM_CATEGORY_PARAM, element_value=element.Category.Id) list_of_filters.Add(filter) # *LINESTYLE FILTER* Other Lines else: filter = create_filter(key_parameter=BuiltInParameter.BUILDING_CURVE_GSTYLE, element_value=element.LineStyle.Id) list_of_filters.Add(filter) # Rule - [ReferencePlane] elif element_type == ReferencePlane: filter = create_filter(key_parameter=BuiltInParameter.CLINE_SUBCATEGORY, element_value=element.get_Parameter(BuiltInParameter.CLINE_SUBCATEGORY).AsElementId()) list_of_filters.Add(filter) # Rule - [PropertyLine] elif element_type == PropertyLine: filter = create_filter(key_parameter=BuiltInParameter.ELEM_CATEGORY_PARAM, element_value=element.Category.Id) list_of_filters.Add(filter) # Rule - [RevisionClouds] elif element_type == RevisionCloud: filter = create_filter(key_parameter=BuiltInParameter.REVISION_CLOUD_REVISION, element_value=element.get_Parameter(BuiltInParameter.REVISION_CLOUD_REVISION).AsElementId()) list_of_filters.Add(filter) # Rule - [Others] else: filter = create_filter(key_parameter=BuiltInParameter.ELEM_TYPE_PARAM, element_value=element.GetTypeId()) list_of_filters.Add(filter) if list_of_filters: multiple_filters = LogicalOrFilter(list_of_filters) elems = FilteredElementCollector(doc).WherePasses(multiple_filters).ToElementIds() # SET SELECTION if elems: uidoc.Selection.SetElementIds(List[ElementId](elems))
Any Suggestions?
Please let me know if you find any elements that do not work with the tool or in general if you will experience any issues.
Have fun with new Selection tools :).
Here are some of the articles that helped me with understanding Filters:
danimosite Tutorial for python
Ehsan YouTube Tutorial for python
Jeremy Tammik: Quick, Slow and LINQ Element Filtering
StackOverflow RevitAPI Filters for python
📩 Join Revit API Newsletter
Plus, get useful Revit API tips from the newsletter.