Thanks, I decided that python was the way to go as you suggested. I made both the filters and the overrides directly rather than using the nodes and modifying with some code.
Sharing my code (I’m sure it could be better, I’m a very basic beginner):
import sys
import clr
clr.AddReference(‘RevitAPI’)
clr.AddReference(‘RevitServices’)
from Autodesk.Revit.DB import *
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
from System.Collections.Generic import List
doc = DocumentManager.Instance.CurrentDBDocument
cats = ListElementId
cats.Add(ElementId(BuiltInCategory.OST_Ceilings))
names = IN[0]
clgType = IN[1]
clgHeights = IN[2]
color = IN[3]
pattern = UnwrapElement(IN[4])
view = UnwrapElement(IN[5])
#even out lists for zipping
typeNamesMulti =
clgHeightsFlat =
for index, x in enumerate(clgHeights):
for y in x:
typeNamesMulti.append(clgType[index])
clgHeightsFlat.append(y)
#make color overrides per type
prop =
for x in color:
ogs = OverrideGraphicSettings()
ogs.SetSurfaceBackgroundPatternColor(x)
ogs.SetSurfaceBackgroundPatternId(pattern.Id)
prop.append(ogs)
TransactionManager.Instance.EnsureInTransaction(doc)
for nam,tyNam,hOff, override in zip(names, typeNamesMulti, clgHeightsFlat, prop):
pvp = ParameterValueProvider(ElementId(BuiltInParameter.SYMBOL_NAME_PARAM))
rule_1 = FilterStringRule(pvp, FilterStringEquals(), tyNam)
pvp = ParameterValueProvider(ElementId(BuiltInParameter.CEILING_HEIGHTABOVELEVEL_PARAM))
rule_2 = FilterDoubleRule(pvp, FilterNumericEquals(), hOff, .0001)
rules = List[FilterRule]([rule_1, rule_2])
clg_filter = ElementParameterFilter(rules)
view_filter = ParameterFilterElement.Create(doc, nam, cats, clg_filter)
view.SetFilterOverrides(view_filter.Id,override)
TransactionManager.Instance.TransactionTaskDone()
OUT = “Done”