Get element from faces

Hello
An approach with a filtering of surfaces with a dot product with Z vector

import sys
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *

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

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

clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
uiapp = DocumentManager.Instance.CurrentUIApplication
uidoc = uiapp.ActiveUIDocument


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


outFaces = []
TaskDialog.Show("selection", "Select Faces")
refs = uidoc.Selection.PickObjects(ObjectType.Face, "select face")
for ref in  refs:
    elem = doc.GetElement(ref)
    face = elem.GetGeometryObjectFromReference(ref)
    bbxUv = face.GetBoundingBox()
    centerUv = (bbxUv.Max + bbxUv.Min) / 2
    normal = face.ComputeNormal(centerUv)
    normal = normal.Normalize()
    if abs(normal.DotProduct(XYZ.BasisZ)) < 0.5:
        surfaceDs = face.ToProtoType()
        outFaces.append([elem, surfaceDs[0], surfaceDs[0].Area])    

OUT = outFaces
7 Likes