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