Hi,
solution by analyzing cut lines geometry (hidden lines)
import clr
import sys
import System
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
import Autodesk.DesignScript.Geometry as DS
clr.AddReference('RevitAPI')
import Autodesk
from Autodesk.Revit.DB import *
import Autodesk.Revit.DB as DB
clr.AddReference('RevitNodes')
import Revit
clr.ImportExtensions(Revit.GeometryConversion)
clr.AddReference('RevitServices')
import RevitServices
from RevitServices.Persistence import DocumentManager
from RevitServices.Transactions import TransactionManager
doc = DocumentManager.Instance.CurrentDBDocument
pf_path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFilesX86)
sys.path.append('%sIronPython 2.7Lib' % pf_path)
import itertools
def get_CutLinesDoor(e):
lines = []
opt = Options()
opt.IncludeNonVisibleObjects = True
geoSet = e.get_Geometry(opt)
for g in geoSet:
if isinstance(g, GeometryInstance):
for gi in g.GetInstanceGeometry():
if isinstance(gi, Line):
if gi.GraphicsStyleId == ElementId.InvalidElementId:
# get horizontal Lines
vect = gi.ComputeDerivatives(0.5, True).BasisX
if abs(vect.Z) < 0.001:
lines.append(gi.ToProtoType())
opt.Dispose()
return lines
e = UnwrapElement(IN[0])
out = []
cutLines = get_CutLinesDoor(e)
cutLines.sort(key = lambda x : x.StartPoint.Z, reverse = True)
for idx, (key_, group) in enumerate(itertools.groupby(cutLines, key = lambda x : x.StartPoint.Z)):
if idx == 0:
top = key_
top_loopCurve = DS.PolyCurve.ByJoinedCurves([x for x in group])
else:
bottom = key_
DSSolid = DS.Curve.ExtrudeAsSolid(top_loopCurve, Vector.ByCoordinates(0,0,-1), abs(top - bottom))
out.append(DSSolid)
OUT = out