import bpy from dxfwrite import DXFEngine as dxf filename = bpy.path.abspath("//exported.dxf") reverseOrder = False scale = 10 spacing1 = 200 spacing2 = 100 numSpacing1Slices = 3 startY = 0 addLabels = True labelsX = 0 labelsY = 0 fontHeight = 8 # It's important to get the formers in the right order, so first # make a list of the objects we want and mark them with their y # coordinate to use as a sort key sliceObjects = [] for obj in bpy.context.scene.objects: if obj.select_get(): if hasattr( obj.data, 'splines' ): spline = obj.data.splines[0] if spline.type == 'POLY' : obj["sliceY"] = spline.points[0].co.y sliceObjects.append(obj) # Sort by ascending y value, ie. starting from the center in most cases # Change reverse to False if you want the parts stacked in the opposite order sliceObjects.sort(key=lambda x: x['sliceY'], reverse=reverseOrder) drawing = dxf.drawing(filename) drawing.add_layer('0',color=0) sliceNumber = 1 yOffset = startY spacing = spacing1 for obj in sliceObjects: print(obj["sliceY"]) for spline in obj.data.splines: numpoints = len(spline.points) for i in range(numpoints): ii = (i + 1) % numpoints p1 = spline.points[i] p2 = spline.points[ii] drawing.add(dxf.line((p1.co.x*scale, p1.co.z*scale+yOffset), (p2.co.x*scale, p2.co.z*scale+yOffset), layer='0')) if addLabels: text = dxf.text(str(sliceNumber), (labelsX, labelsY+yOffset), height=fontHeight, rotation=0) text['layer'] = '0' drawing.add(text) yOffset = yOffset + spacing sliceNumber = sliceNumber + 1 if sliceNumber >= numSpacing1Slices: spacing = spacing2 drawing.save()