Get room geometry, how?

Hello,

for any reason i can get rooms geometry as solids, so whats missing

import sys
import clr

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

clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *

clr.AddReference('System')
from System.Collections.Generic import List

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

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument
uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument

rooms = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms)

solids = []

for e in rooms:
	calculator = SpatialElementGeometryCalculator(doc)
	results = calculator.CalculateSpatialElementGeometry(e)
	geo = results.GetGeometry()
	solids.append(geo.ToProtoType())

OUT = rooms, solids

when i do it in the regular way it works partly!

when export ifc … it works… so whats going on?

KR

Andreas

Does this happen for every room in your model, or only for specific rooms, with i.e. curved edges?

Also, perhaps the Room.CoreBoundary node, together with a height parameter-value extrusion might work aswel.

1 Like

@Daan ,

just for a couple of rooms… i will test it.

I’ve had this happen in corners of rooms with columns that cause a self intersection.

2 Likes

revitapi solid when converted to dynamo solid, sometimes may have this kind of error

@john_pierson ,

for sure we have similar issues… Autodesk Revit need some progress there, particulary regarding MVD in IFCs…

@erfajo ,

is this kind of “solid” a “property” like in this exampe:

import sys
import clr

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

clr.AddReference('RevitAPIUI')
from Autodesk.Revit.UI import *

clr.AddReference('System')
from System.Collections.Generic import List

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

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager

doc = DocumentManager.Instance.CurrentDBDocument
uidoc=DocumentManager.Instance.CurrentUIApplication.ActiveUIDocument
bip = BuiltInParameter.ROOM_AREA
provider = ParameterValueProvider(ElementId(bip))
evaluator = FilterNumericGreater()
rule = FilterDoubleRule(provider, evaluator, 0, False)
filter = ElementParameterFilter(rule)

rooms = FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Rooms).WherePasses(filter).ToElements()

def convertM(x):
	vers = DocumentManager.Instance.CurrentDBDocument.Application.VersionNumber
	if int(vers) < 2022: return UnitUtils.ConvertFromInternalUnits(x, DisplayUnitType.DUT_METERS)
	else: return UnitUtils.ConvertFromInternalUnits(x, UnitTypeId.Meters)
def convertSquareM(x):
	vers = DocumentManager.Instance.CurrentDBDocument.Application.VersionNumber
	if int(vers) < 2022: return UnitUtils.ConvertFromInternalUnits(x, DisplayUnitType.DUT_SQUARE_METERS)
	else: return UnitUtils.ConvertFromInternalUnits(x, UnitTypeId.SquareMeters)
def convertCubicM(x):
	vers = DocumentManager.Instance.CurrentDBDocument.Application.VersionNumber
	if int(vers) < 2022: return UnitUtils.ConvertFromInternalUnits(x, DisplayUnitType.DUT_CUBIC_METERS)
	else: return UnitUtils.ConvertFromInternalUnits(x, UnitTypeId.CubicMeters)
	
upperLimit_ = [h.UpperLimit for h in rooms]
limit_offset = [convertM(h.LimitOffset) for h in rooms]

OUT = upperLimit_, limit_offset

or is it more complex to create ?

KR

Andreas

agree, and try to avoid convert revitapi solid to dynamo solid
if you really want to visialize it, you can make a directshape

2 Likes