Draft: fix alignment of sketches in SVG and legacy DXF export

Fixes #5990
Supersedes #13652

This solution only works for sketches. The export of other planar objects remains the same.

This is similar to the way the C++ DXF exporter handles things. What is different here is that if multiple sketches are exported they are assumed to have the same normal, and their position relative to each other is preserved.
This commit is contained in:
Roy-043
2025-02-21 22:15:37 +01:00
committed by Chris Hennes
parent 074807c378
commit bf5e28a502
2 changed files with 42 additions and 9 deletions

View File

@@ -3674,7 +3674,7 @@ def export(objectslist, filename, nospline=False, lwPoly=False):
dxf.layers.append(dxfLibrary.Layer(name=ob.Label,
color=getACI(ob),
lineType=ltype))
base_sketch_pla = None # Placement of the 1st sketch.
for ob in exportList:
obtype = Draft.getType(ob)
# print("processing " + str(ob.Name))
@@ -3788,10 +3788,16 @@ def export(objectslist, filename, nospline=False, lwPoly=False):
elif ob.isDerivedFrom("Part::Feature"):
tess = None
if hasattr(ob, "Tessellation"):
if ob.Tessellation:
tess = [ob.Tessellation, ob.SegmentLength]
if params.get_param("dxfmesh"):
if getattr(ob, "Tessellation", False):
tess = [ob.Tessellation, ob.SegmentLength]
if ob.isDerivedFrom("Sketcher::SketchObject"):
if base_sketch_pla is None:
base_sketch_pla = ob.Placement
sh = Part.Compound()
sh.Placement = base_sketch_pla
sh.add(ob.Shape.copy())
sh.transformShape(base_sketch_pla.inverse().Matrix)
elif params.get_param("dxfmesh"):
sh = None
if not ob.Shape.isNull():
writeMesh(ob, dxf)
@@ -3799,11 +3805,10 @@ def export(objectslist, filename, nospline=False, lwPoly=False):
_view = FreeCADGui.ActiveDocument.ActiveView
direction = _view.getViewDirection().multiply(-1)
sh = projectShape(ob.Shape, direction, tess)
elif ob.Shape.Volume > 0:
sh = projectShape(ob.Shape, Vector(0, 0, 1), tess)
else:
if ob.Shape.Volume > 0:
sh = projectShape(ob.Shape, Vector(0, 0, 1), tess)
else:
sh = ob.Shape
sh = ob.Shape
if sh:
if not sh.isNull():
if sh.ShapeType == 'Compound':

View File

@@ -1813,6 +1813,29 @@ def export(exportList, filename):
"Unknown SVG export style, switching to Translated"))
svg_export_style = 0
tmp = []
hidden_doc = None
base_sketch_pla = None # Placement of the 1st sketch.
for obj in exportList:
if obj.isDerivedFrom("Sketcher::SketchObject"):
if hidden_doc is None:
hidden_doc = FreeCAD.newDocument(name="hidden", hidden=True, temp=True)
base_sketch_pla = obj.Placement
import Part
sh = Part.Compound()
sh.Placement = base_sketch_pla
sh.add(obj.Shape.copy())
sh.transformShape(base_sketch_pla.inverse().Matrix)
new = hidden_doc.addObject("Part::Part2DObjectPython")
new.Shape = sh
if FreeCAD.GuiUp:
for attr in ("DrawStyle", "LineColor", "LineWidth"):
setattr(new.ViewObject, attr, getattr(obj.ViewObject, attr))
tmp.append(new)
else:
tmp.append(obj)
exportList = tmp
# Determine the size of the page by adding the bounding boxes
# of all shapes
bb = FreeCAD.BoundBox()
@@ -1900,3 +1923,8 @@ def export(exportList, filename):
# Close the file
svg.write('</svg>')
svg.close()
if hidden_doc is not None:
try:
App.closeDocument(hidden_doc.Name)
except:
pass