Solution with boundaries of spaces from Hvac Zone
same request here
import clr
import sys
import System
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
import Autodesk.DesignScript.Geometry as DS
#import Revit API
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.ImportExtensions(Revit.Elements)
def groupCurves(lstCurve, i = 0, max_iter = 10000):
if len(lstCurve) > 0 and i < max_iter:
loopCurve = [lstCurve.pop(0)]
lst_idx = []
while i < max_iter:
i += 1
lenStart = len(lst_idx)
for idx, c in enumerate(lstCurve):
if any(c.DistanceTo(j) < 0.1 for j in loopCurve) and idx not in lst_idx:
lst_idx.append(idx)
loopCurve.append(c)
if len(lst_idx) == lenStart:
break
otherCurves = [c for i, c in enumerate(lstCurve) if i not in lst_idx]
return [DS.PolyCurve.ByJoinedCurves(loopCurve)] + groupCurves(otherCurves, i)
else:
return []
zone = UnwrapElement(IN[0])
optSpace = SpatialElementBoundaryOptions()
optSpace.SpatialElementBoundaryLocation = SpatialElementBoundaryLocation.CoreCenter
surfacesSpace = []
for space in zone.Spaces:
ArrArrSegments = space.GetBoundarySegments(optSpace)
for segments in ArrArrSegments:
proto_segments = [x.GetCurve().ToProtoType() for x in segments]
polyCurve = DS.PolyCurve.ByJoinedCurves(proto_segments)
surfacesSpace.append(polyCurve.Patch())
groupSurface = DS.Surface.ByUnion(surfacesSpace)
allcurves = groupCurves(list(groupSurface.PerimeterCurves()))
OUT = allcurves