def group_closed_curves(curves, elevation, tolerance=0.5):
grouped_curves, queue = [], set()
while curves:
group = []
queue.add(curves.pop())
while queue:
current = queue.pop()
group.append(current)
endpt = current.GetEndPoint(1)
curves = [curve for curve in curves if curve not in queue]
for curve in curves:
if curve.ApproximateLength < tolerance: curves.remove(curve)
if tolerance > curve.GetEndPoint(0).DistanceTo(endpt):
point, endpt = curve.GetEndPoint(0), curve.GetEndPoint(1)
curve = Line.CreateBound(XYZ(point.X, point.Y, elevation), XYZ(endpt.X, endpt.Y, elevation))
queue.add(curve)
break
if tolerance > curve.GetEndPoint(1).DistanceTo(endpt):
point, endpt = curve.GetEndPoint(1), curve.GetEndPoint(0)
curve = Line.CreateBound(XYZ(point.X, point.Y, elevation), XYZ(endpt.X, endpt.Y, elevation))
queue.add(curve)
break
grouped_curves.append(group)
return grouped_curves