Issues with Wrapping and Unwrapping Objects in Dynamo with Python

Hello everyone, I am currently and will be using Revit API for both Dynamo and Pyrevit. I have only just started studying for a few months, and I am facing issues when using Python script in Dynamo. Sometimes objects need to be wrapped and unwrapped between Dynamo and Revit. Basic objects seem to be unwrapped easily, but for some other objects, I have to use Conversion Methods like ToProtoType(), ToPoint(), and some others I am not familiar with, such as OverrideGraphicSettings… Is there any resource that comprehensively covers all these aspects so I can work more easily?


Although I found a workaround, here is an example. My Python code uses the same code and both inputs are OverrideGraphicSettings , but one is Autodesk.Revit.DB.OverrideGraphicSettings , and the other is Revit.Filter.OverrideGraphicSettings , one’s work and one’s not work. I am afraid that in the future, if I don’t fully understand it, I will encounter similar issues without a solution.

@tdontforgetmet

Dynamo

When your elements are come “in” (IN[0]) to access all proberties you have to unwrap Elements.

you can skip unwrapping when you collect in the code f.e.

# 🛒 collector
elements = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).WhereElementIsNotElementType().ToElements()

PyRevit

PyRevit for now is poor in geometry representation. But that can change, because it is a OpenSourceTool (There is no Asset Manager who freezes inovation). So for now you can only use Revit Geometry. You have to know well the geometry hierachy…

Your code will run faster and more stable in clean python.

In poth applications you have a different framing regarding transactions moduls and outputs. But it is easy to understand.

2 Likes

Start here Take Dynamo Further 🚀 | Dynamo Python Primer

2 Likes

Hi,

you can find some other information here

But in this case Revit.Filter.OverrideGraphicSettings is not an Element (UnwrapElement do not work), so it will be necessary to use reflection because the accessibility of the property ‘InternalOverrideGraphicSettings’ is restricted

here a workaround

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

def toList(x):
	if isinstance(x, (list, dict)) or \
			(hasattr(x, "GetType") and x.GetType().GetInterface("ICollection") is not None):
		return x
	else : return [x]

lst_dyn_ovg = toList(IN[0])

lst_rvt_ovg = []

for dyn_ovg in lst_dyn_ovg:
	invokeObj = clr.GetClrType(dyn_ovg.GetType()).InvokeMember('InternalOverrideGraphicSettings', 
												BindingFlags.InvokeMethod | BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, 
												None, 
												dyn_ovg, 
												None)
	lst_rvt_ovg.append(invokeObj)

OUT = lst_rvt_ovg

1 Like

hi @c.poupin
Thank you a lot, but could u tell me how you know from System.Reflection import BindingFlags
is the method for it , and where to learn all of these advanced thing, OMG so much thing need to know… i look at all your code in forum, so much thing really new for me

this one gonna help me alot but most of them i already know

1 Like

thank you @Draxl_Andreas and @Mike.Buttery , it’s gonna help me a lot

1 Like