Zone Hvac or system - Geometries

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
3 Likes