FilterRule.ByRuleType input issues

The 2020 version of this is massively different than 2019 and earlier. This is working with one Paramter and value. I’m going to try to get my multi-parameter one working but I think I might have to add the values directly to the python script to due to how filters are made now(Probably not but it’s above my head I think).

I’ve left the 2019 version in there and commented it out:

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

from System.Collections.Generic import List

doc = DocumentManager.Instance.CurrentDBDocument

# Inputs
param_id = IN[0]
rule_value = ElementId(IN[1])
cat = UnwrapElement(IN[2])
filter_name = IN[3]

# Get Parameter's Id
elem_id = ElementId(param_id)

# Get Categories'  Id
cat_id = []
for catid in cat:
	cat_id.append(catid.Id)

# Convert Python list to .NET List<ElementId>
cat_ids_list = List[ElementId](cat_id)

#####2019 rules################################
# Create Rules
# Change Create___Rule section for rule type
# Add new rules by copying changing rule type and increasing integer
#rule1 = ParameterFilterRuleFactory.CreateEqualsRule(elem_id, rule_value)

# Convert single FitlerRule to List<FilterRule>
#rules = List[FilterRule]([rule1])
###############################################


#####2020 Rules################################
#Parameter to Test ELEM_PARTITION_PARAM = Workset creates the FitlerableValueProvider
pWorkset = ParameterValueProvider(elem_id)

#Construct Filter Rule/Test
xWorkset = FilterElementIdRule(pWorkset, FilterNumericEquals(), rule_value)

#####2019 Create actual Filter with rules, cat, and name from above######
#TransactionManager.Instance.EnsureInTransaction(doc)
#pfe = ParameterFilterElement.Create(doc, filter_name , cat_ids_list, rules)
#TransactionManager.Instance.TransactionTaskDone()
########################################################

#####2020 Create Filter Rule############################
TransactionManager.Instance.EnsureInTransaction(doc)
demolitionworkset = []
demolitionworkset.Add(ElementParameterFilter(xWorkset))
icoldemolitionworkset = List[ElementFilter](demolitionworkset)
anddemolitionworksetfilter=LogicalAndFilter(icoldemolitionworkset)

#Make Acutal Filter
pfedemolitionworkset = ParameterFilterElement.Create(doc, filter_name, cat_ids_list, anddemolitionworksetfilter)
TransactionManager.Instance.TransactionTaskDone()

OUT = pfedemolitionworkset, pfedemolitionworkset.Id, elem_id

If anyone is interested here is how I got it to work with multiple inputs. There is still some manualish code work that needs to be done when used like creating more ParameterValueProviders, FilterElementIDRules, and appending them together. I believe you can nest the logicalandfilter into an logicalorfilter or vice versa to make more complicated filters. I would like to make a version one day that works with any length of list and be able to have input for the rule type.

import clr
clr.AddReference('RevitAPI')
from Autodesk.Revit.DB import *

clr.AddReference('RevitServices')
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

from System.Collections.Generic import List

doc = DocumentManager.Instance.CurrentDBDocument

# Inputs
param = IN[0]
value = IN[1]
cat = UnwrapElement(IN[2])
filter_name = IN[3]

# Get Parameter's Id
elem_id = []
for elemid in param:
	elem_id.append(ElementId(elemid))
	
# Get Rule Value
rule_value = []
for ruleValue in value:
	rule_value.append(ElementId(ruleValue))

# Get Categories'  Id
cat_id = []
for catid in cat:
	cat_id.append(catid.Id)

# Convert Python list to .NET List<ElementId>
cat_ids_list = List[ElementId](cat_id)

#Parameter to Test 
p1 = ParameterValueProvider(elem_id[0])
p2 = ParameterValueProvider(elem_id[1])

#Construct Filter Rule/Test
x1 = FilterElementIdRule(p1, FilterNumericEquals(), rule_value[0])
x2 = FilterElementIdRule(p2, FilterNumericEquals(), rule_value[1])

#Create Filter Rule
TransactionManager.Instance.EnsureInTransaction(doc)
xrule = []
xrule.Add(ElementParameterFilter(x1))
xrule.Add(ElementParameterFilter(x2))
icolx = List[ElementFilter](xrule)
andx = LogicalAndFilter(icolx)

#Make Acutal Filter
pfex = ParameterFilterElement.Create(doc, filter_name, cat_ids_list, andx)
TransactionManager.Instance.TransactionTaskDone()

OUT = pfex, pfex.Id, elem_id

Check out this post it helped me out a lot:

2 Likes