.ToRevitType() doesn't work in Revit 2023 (Dynamo 2.13)

Hi all,

I’m testing my script for Revit 2023 and something strange is happend:

import clr #.NET Laden
import sys #sys is de fundamentele Python bibliotheek
#de standaard IronPython-bibliotheken
#sys.path.append('C:\Program Files (x86)\IronPython 2.7\Lib') #Imports the
#standaard IronPython-bibliotheken, die alles dekken, van servers en
#encryptie tot reguliere expressies.
import System #The System namespace in de hoofdmap .NET
from System import Array #.NET class voor het verwerken van array-informatie
import System.Collections.Generic as MGen #Module kan nu benaderd worden met MGen.xxxx
#from System.Collections.Generic import * #Hiermee kunt u generieke afhandelen. Revit's API
#soms wil hard-getypte 'generieke' lijsten, genaamd ILists. Als je niet nodig hebt
#deze kunt u deze regel verwijderen.
clr.AddReference('ProtoGeometry')  #Een Dynamo-bibliotheek voor zijn proxygeometrie
#classes. Je hebt dit alleen nodig als je interactie hebt met geometrie.
import Autodesk.DesignScript.Geometry as AGeo #Module kan worden opgeroepen a=met AGeo.xxxx
#from Autodesk.DesignScript.Geometry import * #Laadt alles in Dynamo's
#geometriebibliotheek
clr.AddReference("RevitNodes") #Dynamo's nodes voor Revit
import Revit #Laad in de Revit-namespaces in RevitNodes
clr.ImportExtensions(Revit.Elements) #Meer laden van Dynamo's Revit-bibliotheken
clr.ImportExtensions(Revit.GeometryConversion) #Meer laden van Dynamo's
#Revit-bibliotheken. Je hebt dit alleen nodig als je interactie hebt met geometrie.
clr.AddReference("RevitServices") #Dynamo's classes voor het omgaan met Revit-documenten
import RevitServices 
from RevitServices.Persistence import DocumentManager #Een interne Dynamo class
#dat het document bijhoudt waaraan Dynamo momenteel is gekoppeld
from RevitServices.Transactions import TransactionManager #Een Dynamo class voor
#transacties openen en sluiten om de database van het Revit-document te wijzigen

clr.AddReference("RevitAPI") #Verwijzing naar Revit's API DLL's toevoegen
clr.AddReference("RevitAPIUI") #Verwijzing naar Revit's APIUI DLL's toevoegen

import Autodesk #Loads the Autodesk namespace
import Autodesk.Revit.DB as RDB #Loading Revit's API UI classes module kan nu worden aangeroepen met RDB.xxxx
#from Autodesk.Revit.DB import * #Loading Revit's API UI classes
import Autodesk.Revit.UI as RUI # Loading Revit's API UI classes als RUI.xxxx
#from Autodesk.Revit.UI import * #Loading Revit's API UI classes
import heapq
import collections as ct

doc = DocumentManager.Instance.CurrentDBDocument #Dit is het actieve Revit document
uiapp = DocumentManager.Instance.CurrentUIApplication #Een handle instellen voor het actieve Revit UI-document
app = uiapp.Application  #Een handle instellen op de momenteel geopende instantie van de Revit-toepassing
uidoc = uiapp.ActiveUIDocument #Een handle instellen op de momenteel geopende instantie van de Revit UI-toepassing
revit_version = int(doc.Application.VersionNumber)
# code omrekenen revit feet naar huidig ingestele document units
if revit_version >= 2022:
    ForgeLength = "autodesk.spec.aec:length-1.0.0"  # zie voor lijst ForgeTypeIds.xlsx in de map handleidingen
    ForgeTypeLength = RDB.ForgeTypeId(ForgeLength)
    getDocUnits = doc.GetUnits()
    getDisplayUnitsLength = getDocUnits.GetFormatOptions(ForgeTypeLength).GetUnitTypeId()
else:
    getDocUnits = doc.GetUnits()
    getDisplayUnits = getDocUnits.GetFormatOptions(RDB.UnitType.UT_Length).DisplayUnits


def ToRevitUnitsLength(InVal):
    if revit_version >= 2022:
        return RDB.UnitUtils.ConvertToInternalUnits(InVal, getDisplayUnitsLength)
    else:
        return RDB.UnitUtils.ConvertToInternalUnits(InVal, getDisplayUnits)


def ToDynamoUnitsLength(InVal):
    if revit_version >= 2022:
        return RDB.UnitUtils.ConvertFromInternalUnits(InVal, getDisplayUnitsLength)
    else:
        return RDB.UnitUtils.ConvertFromInternalUnits(InVal, getDisplayUnits)

def ToRevitUnitsLengthFromMM(InVal):
	if revit_version >= 2022:
		return RDB.UnitUtils.Convert(InVal, RDB.UnitTypeId.Millimeters, RDB.UnitTypeId.Feet)
	else:
		return RDB.UnitUtils.Convert(InVal, RDB.DisplayUnitType.DUT_MILLIMETERS, RDB.DisplayUnitType.DUT_DECIMAL_FEET)
	
def ToRevitUnitsLengthFromMM(InVal):
	if revit_version >= 2022:
		return RDB.UnitUtils.Convert(InVal, RDB.UnitTypeId.Millimeters, RDB.UnitTypeId.Feet)
	else:
		return RDB.UnitUtils.Convert(InVal, RDB.DisplayUnitType.DUT_MILLIMETERS, RDB.DisplayUnitType.DUT_DECIMAL_FEET)
	

# einde code omrekenen revit feet naar huidig ingestelde document units
# Hieronder kan je dan gaan programmeren
# Gebruik boiler template

groupbbx = IN[0]
out = []
for lstbbx in groupbbx:
    glob_minX = min(lstbbx, key = lambda x : x.MinPoint.X).MinPoint.X
    glob_maxX = max(lstbbx, key = lambda x : x.MaxPoint.X).MaxPoint.X
    glob_minY = min(lstbbx, key = lambda x : x.MinPoint.Y).MinPoint.Y
    glob_maxY = max(lstbbx, key = lambda x : x.MaxPoint.Y).MaxPoint.Y
    glob_minZ = min(lstbbx, key = lambda x : x.MinPoint.Z).MinPoint.Z
    glob_maxZ = max(lstbbx, key = lambda x : x.MaxPoint.Z).MaxPoint.Z
    minpt = AGeo.Point.ByCoordinates(glob_minX, glob_minY, glob_minZ -5)
    maxpt = AGeo.Point.ByCoordinates(glob_maxX, glob_maxY, glob_maxZ + 5)
    out.append(AGeo.BoundingBox.ByCorners(minpt, maxpt))

rdb_bbox = []
for o in out:
    rvt = o.ToRevitType()
    rdb_bbox.append(rvt)

bbox_ = []
for rdb in rdb_bbox:
    bbox_.extend([rdb,rdb])

OUT = bbox_

The code ToRevitType() doesn’t work anymore

for o in out:
    rvt = o.ToRevitType()
    rdb_bbox.append(rvt)

Any thoughts?

image

If I understand Dutch with my German knowlegde correctly, it says “the value can not be null”. Your out list contains a null value. Try to do like that:
for o in out:
hier you can add:
if o:

1 Like

@Deniz_Maral thanks for the answer,

Thats right, but the if method doesn’t work:

import clr #.NET Laden
import sys #sys is de fundamentele Python bibliotheek
#de standaard IronPython-bibliotheken
#sys.path.append('C:\Program Files (x86)\IronPython 2.7\Lib') #Imports the
#standaard IronPython-bibliotheken, die alles dekken, van servers en
#encryptie tot reguliere expressies.
import System #The System namespace in de hoofdmap .NET
from System import Array #.NET class voor het verwerken van array-informatie
import System.Collections.Generic as MGen #Module kan nu benaderd worden met MGen.xxxx
#from System.Collections.Generic import * #Hiermee kunt u generieke afhandelen. Revit's API
#soms wil hard-getypte 'generieke' lijsten, genaamd ILists. Als je niet nodig hebt
#deze kunt u deze regel verwijderen.
clr.AddReference('ProtoGeometry')  #Een Dynamo-bibliotheek voor zijn proxygeometrie
#classes. Je hebt dit alleen nodig als je interactie hebt met geometrie.
import Autodesk.DesignScript.Geometry as AGeo #Module kan worden opgeroepen a=met AGeo.xxxx
#from Autodesk.DesignScript.Geometry import * #Laadt alles in Dynamo's
#geometriebibliotheek
clr.AddReference("RevitNodes") #Dynamo's nodes voor Revit
import Revit #Laad in de Revit-namespaces in RevitNodes
clr.ImportExtensions(Revit.Elements) #Meer laden van Dynamo's Revit-bibliotheken
clr.ImportExtensions(Revit.GeometryConversion) #Meer laden van Dynamo's
#Revit-bibliotheken. Je hebt dit alleen nodig als je interactie hebt met geometrie.
clr.AddReference("RevitServices") #Dynamo's classes voor het omgaan met Revit-documenten
import RevitServices 
from RevitServices.Persistence import DocumentManager #Een interne Dynamo class
#dat het document bijhoudt waaraan Dynamo momenteel is gekoppeld
from RevitServices.Transactions import TransactionManager #Een Dynamo class voor
#transacties openen en sluiten om de database van het Revit-document te wijzigen

clr.AddReference("RevitAPI") #Verwijzing naar Revit's API DLL's toevoegen
clr.AddReference("RevitAPIUI") #Verwijzing naar Revit's APIUI DLL's toevoegen

import Autodesk #Loads the Autodesk namespace
import Autodesk.Revit.DB as RDB #Loading Revit's API UI classes module kan nu worden aangeroepen met RDB.xxxx
#from Autodesk.Revit.DB import * #Loading Revit's API UI classes
import Autodesk.Revit.UI as RUI # Loading Revit's API UI classes als RUI.xxxx
#from Autodesk.Revit.UI import * #Loading Revit's API UI classes


doc = DocumentManager.Instance.CurrentDBDocument #Dit is het actieve Revit document
uiapp = DocumentManager.Instance.CurrentUIApplication #Een handle instellen voor het actieve Revit UI-document
app = uiapp.Application  #Een handle instellen op de momenteel geopende instantie van de Revit-toepassing
uidoc = uiapp.ActiveUIDocument #Een handle instellen op de momenteel geopende instantie van de Revit UI-toepassing

# einde code omrekenen revit feet naar huidig ingestelde document units
# Hieronder kan je dan gaan programmeren
# Gebruik boiler template

groupbbx = IN[0]
out = []
for lstbbx in groupbbx:
	glob_minX = min(lstbbx, key = lambda x : x.MinPoint.X).MinPoint.X
	glob_maxX = max(lstbbx, key = lambda x : x.MaxPoint.X).MaxPoint.X
	glob_minY = min(lstbbx, key = lambda x : x.MinPoint.Y).MinPoint.Y
	glob_maxY = max(lstbbx, key = lambda x : x.MaxPoint.Y).MaxPoint.Y
	glob_minZ = min(lstbbx, key = lambda x : x.MinPoint.Z).MinPoint.Z
	glob_maxZ = max(lstbbx, key = lambda x : x.MaxPoint.Z).MaxPoint.Z
	minpt = AGeo.Point.ByCoordinates(glob_minX, glob_minY, glob_minZ -5)
	maxpt = AGeo.Point.ByCoordinates(glob_maxX, glob_maxY, glob_maxZ + 5)
	out.append(AGeo.BoundingBox.ByCorners(minpt, maxpt))

rdb_bbox = []
for o in out:
	if o:
		rvt = o.ToRevitType()
		rdb_bbox.append(rvt)

bbox_ = []
for rdb in rdb_bbox:
	bbox_.extend([rdb,rdb])

OUT = bbox_

I tried the Try / Except method too.

@solamour , Any idea?
It works fine in R20-R22.

I guess that relate with change to CPython3, It was a great pain right now even for me. I worked with the Revitpythonshell project and still did not dare to upgrade to Python3 because of its instability, which is also the reason Revitpythonshell is still in Python 2.7.

Hi @chuongmep ,

Thanks for your response.
This one is build in IronPython 2 too.

Do I need to add this line?

sys.path.append('C:\Program Files (x86)\IronPython 2.7\Lib')

@jw.vanasselt I’m on paternity leave right now (Just welcomed into the world my second child, my son :heart_eyes:) so let me ping the team to investigate.

FYI @Aaron_Tang @Michael_Kirschner2 can we please take a look to see if real?

4 Likes

I will push here for any want check with revit 2023, may be I need more time to look to open source project first.

test.dyn (12.6 KB)

2 Likes

@solamour Congrats! :slight_smile:

1 Like

Thank you :blush: Super happy to be spending quality time with him right now… but lurking a tiny bit on here :wink:

6 Likes

Congratulations @solamour :confetti_ball: :partying_face:

1 Like