Generate a single Subregion from a large number of curveLoops

I’m trying to generate siteSubregion through Python. In fact, I can already do this with the help of the code provided by PowellDesign.

In the code he provided, every time curveLoop generates a new Subregion. But what I expect is to make multiple sets of curveLoop generate a single Subragion.

The following is my attempt to modify the code provided by PowellDesign, and I swear it succeeded several times based on the same data! But in most cases it is paralyzed. I don’t know what went wrong.


Try this:
SiteSubRegion.Create(doc, List[CurveLoop](curveloops), host.Id)

I seem to have found a key factor that caused the “SiteSubRegion Method” to fail. This method does not seem to allow the specified “curveloop” to intersect. When I try to offset all Polygons inward by 0.01 meters and delete the Polygons that have self-intersections, everything works fine.

I don’t know if I solved the problem correctly, but everything looks good from the current results. Thank you for your reply!

1 Like

I’m posting the final code here, with a slight modification, for reference and in case somebody needs it someday.

import clr

from Autodesk.Revit.DB import *
from Autodesk.Revit.DB.Architecture import *
import System.Collections.Generic
from System.Collections.Generic import List

import Revit

from RevitServices.Transactions import TransactionManager
from RevitServices.Persistence import DocumentManager

doc = DocumentManager.Instance.CurrentDBDocument

# Get input variables
subregions = UnwrapElement(IN[0])
host = UnwrapElement(IN[1])

def Func_subregions(L2):
# Init variables
	curveLoops = []
	createdSubRegions = []


	# Get groups of curves (exploded polycurves!) and creates per group a SubRegion
	for i in L2:
		# Init CurveLoop for every curve group
		x = CurveLoop()
		# Iterate the seperate curves -> convert type to Revit Type -> add to CurveLoop
		for j in i:

	if SiteSubRegion.IsValidBoundary(curveLoops):
		# Create SubRegion out of the CurveLoop group and add its to 'createdSubregions'
		newSubRegion = SiteSubRegion.Create(doc, curveLoops, host.Id)
	return createdSubRegions

# Output
if IN[2]:
	newList = []
	OUT = newList
	OUT = "set IN[2] to True to run"