Help needed to make Get Spatial Element Boundary Location work with linked elements

Hello, I am trying to modify the Clockwork Room.Boundaries node to give me the elements from a linked file so that i can get parameter info from them.

The Room.Boundaries node uses GetSpatialElementBoundaryLocation() method and im not sure how to use that in such a way to get those bounding elements, from what i skimmed in the RevitApiDocs i cant find a specific solution.

I am also not a complete expert with Python but i can work with it.

My question is: what would you recommend as a method or if you know a different node/package that can help me make these changes to the node and get the info i need.
PS: the project is quite large at around 3000 rooms so getting the geometry and doing a “manual check” is a solution i would like to explore last.

Can anyone help?

Normally these types of custom nodes are set to run on the active document. You’ll have to make sure you specify a linked document and run the same methods with the linked doc.

I have tried that and i get nulls where the elements are, i believe i have to change how i get those elements maybe but i have no idea where to do that.

in the case of elist.append(doc.GetElement(bface.SpatialBoundaryElement.HostElementId))i already have get element on the linked doc so i don`t really understand why i would get nulls.

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

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

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

# Import RevitAPI
clr.AddReference("RevitAPI")
import Autodesk
from Autodesk.Revit.DB import *

items = UnwrapElement(IN[0])
doc = UnwrapElement(IN[1][0])
facetypes = []
facemats = []
faceelements = []
faceareas = []
faces = []

for item in items:
    calculator = SpatialElementGeometryCalculator(doc)
    options = Autodesk.Revit.DB.SpatialElementBoundaryOptions()
# get boundary location from area computation settings
    boundloc = Autodesk.Revit.DB.AreaVolumeSettings.GetAreaVolumeSettings(doc).GetSpatialElementBoundaryLocation(SpatialElementType.Room)
    options.SpatialElementBoundaryLocation = boundloc
    mlist = []
    tlist = []
    elist = []
    alist = []
    flist = []
    try:
    	results = calculator.CalculateSpatialElementGeometry(item)
	for face in results.GetGeometry().Faces:
		for bface in results.GetBoundaryFaceInfo(face):
			tlist.append(str(bface.SubfaceType))
			if bface.GetBoundingElementFace().MaterialElementId.IntegerValue == -1:
				mlist.append(None)
			else:
				mlist.append(doc.GetElement(bface.GetBoundingElementFace().MaterialElementId))
			elist.append(doc.GetElement(bface.SpatialBoundaryElement.HostElementId))
			
except:
	pass	

faceelements.append(elist)

OUT = faceelements

Hi,
try the code below. It’s not easy for me to analyse somebody else’s code so I am not sure what is the problem with the one above, but you are not setting the spatial element boundary options - it might be the problem.

import clr

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

#The inputs to this node will be stored as a list in the IN variables.
rooms = UnwrapElement(IN[0])
linkInstance = UnwrapElement(IN[1])
linkedDoc = linkInstance.GetLinkDocument()

options = SpatialElementBoundaryOptions()
options.SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.Finish

calculator = SpatialElementGeometryCalculator(linkedDoc,options)
output = []

for r in rooms:
	try:
		results = calculator.CalculateSpatialElementGeometry(r)
		solid = results.GetGeometry()
		elements = []
		for f in solid.Faces:
			#faces.append(f)
			subfaces = results.GetBoundaryFaceInfo(f)
			for sf in subfaces:
				e = linkedDoc.GetElement(sf.SpatialBoundaryElement.HostElementId)
				elements.append(e)
		output.append(elements)
	except:
		output.append(None)	

#Assign your output to the OUT variable.
OUT = output

3 Likes

I am also looking for how to modify the room.boundary to get the linked document.

This thread is old and has already solution. Please start new topic with your goals and workflows if you have any. I am going to close :lock: this topic.

1 Like