Created Filter to View

I’m not sure this exactly what you’re after, but you might be able to follow my logic:

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

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
import System
from System.Collections.Generic import List
doc = DocumentManager.Instance.CurrentDBDocument

cats = IN[0]
paramName = IN[1]
pValue = IN[2]
views = IN[3]
doc = DocumentManager.Instance.CurrentDBDocument
TransactionManager.Instance.EnsureInTransaction(doc)
castlst = []
for i in cats:
	castlst.append(ElementId(i.Id))

typedCatList = List[ElementId](castlst)
rules = []

builtInParams = System.Enum.GetValues(BuiltInParameter)
bipNames = []
outview = []
for i in builtInParams:
	bipNames.append(str(i))
bipDict = dict(zip(bipNames,builtInParams))
bips = [bipDict.get(p, "none") for p in paramName]
x = 0
TransactionManager.Instance.EnsureInTransaction(doc)
for view in views:
	for bip in bips:
		rules.append(ParameterFilterRuleFactory.CreateLessRule(ElementId(bip), pValue, 0.001))
		filter = ParameterFilterElement.Create(doc, 'Test'+str(x), typedCatList, rules)
		viewc = UnwrapElement(view)
		viewc.AddFilter(filter.Id)
		outview.append(viewc)
	x = x+1

TransactionManager.Instance.TransactionTaskDone()

OUT = outview

image

Hi @vanlion,

The following (and inelegant) script, add the same view filter to several views :

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

clr.AddReference("RevitNodes")
import Revit
clr.ImportExtensions(Revit.Elements)

clr.AddReference("RevitServices")
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
import System
from System.Collections.Generic import List
doc = DocumentManager.Instance.CurrentDBDocument


cats = IN[0]
paramName = IN[1]
pValue = IN[2]
views = UnwrapElement(IN[4])
doc = DocumentManager.Instance.CurrentDBDocument
TransactionManager.Instance.EnsureInTransaction(doc)
castlst = []
for i in cats:
	castlst.append(ElementId(i.Id))

typedCatList = List[ElementId](castlst)
rules = []

builtInParams = System.Enum.GetValues(BuiltInParameter)
bipNames = []
outview = []
for i in builtInParams:
	bipNames.append(str(i))
bipDict = dict(zip(bipNames,builtInParams))
bips = [bipDict.get(p, "none") for p in paramName]

TransactionManager.Instance.EnsureInTransaction(doc)

for bip in bips:
	rules.append(ParameterFilterRuleFactory.CreateLessRule(ElementId(bip), pValue, 0.001))
	filter = ParameterFilterElement.Create(doc, IN[3], typedCatList, rules)

for view in views:
	view.AddFilter(filter.Id)
	outview.append(views)
	
TransactionManager.Instance.TransactionTaskDone()

OUT = outview[0]

View%20Filter

4 Likes

You can also wrap it in a custom node and using lacing.

In fact, with a custom node with lacing on longest, the original script will try to create the same view filter again and again.

1 Like

Totally correct. I forgot we were creating the filter at the same time.

I’m not not able to test it at the moment. But i think this is the solution :slight_smile: