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: