Let’s look at how to use the FilterIntegerRule filter rule to filter integer type element parameters in VB.NET in this article. Supposing we’d like to find all walls which bind some rooms, what shall we do?
The following code does so in VB.NET:
Public Shared Function GetWallsRoomBound(ByVal doc As RvtDocument) As ICollection(Of Autodesk.Revit.DB.ElementId)
Dim provider As New Autodesk.Revit.DB.ParameterValueProvider(New Autodesk.Revit.DB.ElementId(CInt(BuiltInParameter.WALL_ATTR_ROOM_BOUNDING)))
Dim rule As New Autodesk.Revit.DB.FilterIntegerRule(provider, New Autodesk.Revit.DB.FilterNumericEquals(), 1)
Dim filter As New Autodesk.Revit.DB.ElementParameterFilter(rule)
Return (New Autodesk.Revit.DB.FilteredElementCollector(doc)).OfClass(GetType(Wall)).WherePasses(filter).ToElementIds()
End Function
A few highlights about the code:
• An ElementParameterFilter needs a filter rule, the FilterIntegerRule in this case.
• The FilterIntegerRule needs a parameter value provider (ParameterValueProvider) and a filter rule evaluator (FilterNumericRuleEvaluator), specifically the FilterNumericEquals.
• The FilterIntegerRule also needs a value for the integer parameter to compare with.
• The ParameterValueProvider needs an argument of parameter, as the wall room bounding parameter BuiltInParameter. WALL_ATTR_ROOM_BOUNDING in this case.
• The parameter is represented by an ElementId, which is the numeric value of the specified BuiltInParameter.
• A fast filter, ElementClassFilter, represented by its shortcut method (OfClass), is also used to narrow down the FilteredElementCollector first. It not only speeds up the search but also makes sure only walls are returned.
Curious people may ask: how did you figure out the WALL_ATTR_ROOM_BOUNDING of the BuiltInParameter enumerator is the right one to use as there are tons of built-in parameters there?
Good question! Though we still have to make some guess and do some experiment most of times to sort things like this out, a few RevitAddinCoder coders can help make the task a lot easier:
• Parameter Infoer Coder
• Parameter Categorizer Coder
• Parameter Retriever Coder
To use the method is very straightforward. Here is some test code in VB.NET:
…
Dim ids As ICollection(Of Autodesk.Revit.DB.ElementId) = GetWallsRoomBound(CachedDoc)
TaskDialog.Show("ElementParameterFilter Test", String.Format("{0} walls are binding rooms.", ids.Count))
…
ElementParameterFilter Creator of RevitAddinCoder can create the code automatically in no time.
Recent Comments