Hello, I’m using a Python Node inside my Script to get the materials associated to Rooms Faces. My problem is when it comes to Curtain Walls. How can I get the material associated to the room faces that are bounded by the curtain wall?.
Here’s the code and the Image of what I’m doing in Revit.
import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
clr.AddReference('RevitAPI')
clr.AddReference('RevitServices')
clr.AddReference('DSCoreNodes')
from Autodesk.Revit.DB import *
import Autodesk
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.Elements)
from Revit.Elements import Element
def getOrientation(vecTrueNorth,vecTrueEast,solidFace):
faceNorm = solidFace.FaceNormal
dotP_N = faceNorm.DotProduct(vecTrueNorth)
dotP_E = faceNorm.DotProduct(vecTrueEast)
#0.7 = Pi / 4 or (45°)
if dotP_N > 0.7 and abs(dotP_E) <= 0.7:
return "NORTE"
else:
return None
doc = DocumentManager.Instance.CurrentDBDocument
currentLocation = doc.ActiveProjectLocation
origin = XYZ(0,0,0)
projectPosition = currentLocation.GetProjectPosition(origin)
angleToNorth = projectPosition.Angle
vecNorth = XYZ.BasisY
vecEast = XYZ.BasisX
rotTransf = Transform.CreateRotation(XYZ.BasisY,angleToNorth)
vecTrueNorth = rotTransf.OfVector(vecNorth)
vecTrueEast = rotTransf.OfVector(vecEast)
calculator = SpatialElementGeometryCalculator(doc)
rooms = FilteredElementCollector(doc).OfClass(SpatialElement).WhereElementIsNotElementType().ToElements()
TransactionManager.Instance.EnsureInTransaction(doc)
for room in rooms:
if calculator.CanCalculateGeometry(room):
results = calculator.CalculateSpatialElementGeometry(room)
roomSolid = results.GetGeometry()
roomMaterial = list()
for face in roomSolid.Faces:
for subface in results.GetBoundaryFaceInfo(face):
if subface.SubfaceType == SubfaceType.Side:
boundingElement = subface.GetBoundingElementFace()
elementId = boundingElement.MaterialElementId
material = doc.GetElement(elementId)
if material is not None:
nameOrient = getOrientation(vecTrueNorth,vecTrueEast,face)
materialName = material.Name
if nameOrient is not None:
roomMaterial.append(materialName)
parametro = room.LookupParameter("Acabado Muro Norte").Set(materialName)
TransactionManager.Instance.TransactionTaskDone()