Expected FilterRule, got FilterRule

When I try to use an element that created from FilterRule.ByRuleType in Python Node, I got that error. Element has that type: Revit.Filter.FilterRule. How can I convert it to API type?
Thank you very much!

# Phython-Standard- und DesignScript-Bibliotheken laden
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
import System
from System.Collections.Generic import *
from System.Collections import *
clr.AddReference("System.Core")
clr.ImportExtensions(System.Linq)

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

clr.AddReference("RevitAPI","RevitServices")
from Autodesk.Revit.DB import *
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

filterRule = UnwrapElement(IN[0])
if not  hasattr(filterRule,"__iter__"):
	filterRule = [filterRule]
tempL = List[FilterRule]()
for i in filterRule:
	tempL.Add(i)
	
#ElementParameterFilter(tempL)
OUT = dir(tempL)

The basic question: How can I convert RevitNodes object to API object?

Hello
in this case it will be necessary to use reflection, the accessibility of the property ‘InternalFilterRule’ is limited

1 Like

Merci @c.poupin!

I tried everything and it did not help. I thought, there may be a workaround to solve that. It seems I have to invest time into ZeroTouch development.

try this :wink:

import clr
import sys
import System
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
import Autodesk.DesignScript.Geometry as DS

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

#import net library
from System.Collections.Generic import List

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

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument

clr.AddReference("System.Reflection")
from System.Reflection import BindingFlags

e = IN[0]

invokeObj = clr.GetClrType(e.GetType()).InvokeMember('InternalFilterRule', BindingFlags.InvokeMethod | BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, None, e, None)
elemFilter = DB.ElementParameterFilter(invokeObj)
OUT = invokeObj.GetType(), elemFilter
2 Likes

OMG! That is amazing! Thank a million time!
I saw that Invoke function on GitHub but I can’t C# or .Net very well. I knew, you could solve it! :smiley:

1 Like