here a simple example without arc (no need to get bulges)
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