Get Hatch Boundary from Autocad

here a simple example without arc (no need to get bulges)

getBoundary hatch3

code IronPython

import sys
import clr
import System
from System import *
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import *
from math import tan, radians
from System import Array
errorAcd = None
try:	
	import System.Runtime.InteropServices
	#import Autodesk.AutoCAD.Interop
	app = System.Runtime.InteropServices.Marshal.GetActiveObject("Autocad.Application")
	try:
		clr.AddReference('Autodesk.AutoCAD.Interop.Common')
		from Autodesk.AutoCAD.Interop.Common import AcadEntity, AcBooleanType
	except:
		stringversion = IN[0] #replace by your version if fail
		clr.AddReferenceToFileAndPath('C:/Program Files/Autodesk/AutoCAD {}/Autodesk.AutoCAD.Interop.Common'.format(stringversion))
		from Autodesk.AutoCAD.Interop.Common import AcadEntity, AcBooleanType
	
	AcDoc = app.ActiveDocument
	acCurDb = AcDoc.Database
	errorAcd = None
	modelSpace = AcDoc.ModelSpace
	paperSpace = AcDoc.PaperSpace
except :
	import traceback
	errorAcd = traceback.format_exc()
	
def AcDb2DPLineToDS(obj):
	coords = iter(obj.Coordinates)
	DSPoints = [Point.ByCoordinates(x,y,0) for x, y in zip(coords, coords)]
	return PolyCurve.ByPoints(DSPoints, True)
	
def getHatchBoundary():
	outDS = []
	for i in modelSpace:
		if i.ObjectName == 'AcDbHatch':
			for j in range(i.NumberOfLoops):
				plineObj = clr.Reference[System.Object]()
				i.GetLoopAt(j, plineObj)
				cadCurvesCOM = plineObj.Value
				if not hasattr(cadCurvesCOM, "__iter__"):
					cadCurvesCOM = [cadCurvesCOM]
				for c in cadCurvesCOM:
					if c is not None and c.ObjectName == "AcDbPolyline" :
						outDS.append(AcDb2DPLineToDS(c))
				
	return outDS
if errorAcd is None:
	OUT = getHatchBoundary()
else:
	OUT = errorAcd
6 Likes