diff --git a/src/Mod/Draft/getSVG.py b/src/Mod/Draft/getSVG.py index a04bf9b08b..8fc630605a 100644 --- a/src/Mod/Draft/getSVG.py +++ b/src/Mod/Draft/getSVG.py @@ -30,6 +30,19 @@ def getLineStyle(linestyle): return "none" +def getProj(vec, plane): + if not plane: return vec + nx = DraftVecUtils.project(vec,plane.u) + lx = nx.Length + if abs(nx.getAngle(plane.u)) > 0.1: lx = -lx + ny = DraftVecUtils.project(vec,plane.v) + ly = ny.Length + if abs(ny.getAngle(plane.v)) > 0.1: ly = -ly + #if techdraw: buggy - we now simply do it at the end + # ly = -ly + return Vector(lx,ly,0) + + def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direction=None,linestyle=None,color=None,linespacing=None,techdraw=False,rotation=0): '''getSVG(object,[scale], [linewidth],[fontsize],[fillstyle],[direction],[linestyle],[color],[linespacing]): returns a string containing a SVG representation of the given object, @@ -75,18 +88,6 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct stroke = getrgb(obj.ViewObject.LineColor) - def getProj(vec): - if not plane: return vec - nx = DraftVecUtils.project(vec,plane.u) - lx = nx.Length - if abs(nx.getAngle(plane.u)) > 0.1: lx = -lx - ny = DraftVecUtils.project(vec,plane.v) - ly = ny.Length - if abs(ny.getAngle(plane.v)) > 0.1: ly = -ly - #if techdraw: buggy - we now simply do it at the end - # ly = -ly - return Vector(lx,ly,0) - def getDiscretized(edge): ml = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft").GetFloat("svgDiscretization",10.0) if ml == 0: @@ -96,7 +97,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct d = 1 edata = "" for i in range(d+1): - v = getProj(edge.valueAt(edge.FirstParameter+((float(i)/d)*(edge.LastParameter-edge.FirstParameter)))) + v = getProj(edge.valueAt(edge.FirstParameter+((float(i)/d)*(edge.LastParameter-edge.FirstParameter))), plane) if not edata: edata += 'M ' + str(v.x) +' '+ str(v.y) + ' ' else: @@ -135,7 +136,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct if (vs[0].Point-previousvs[-1].Point).Length > 1e-6: vs.reverse() if edgeindex == 0: - v = getProj(vs[0].Point) + v = getProj(vs[0].Point, plane) edata += 'M '+ str(v.x) +' '+ str(v.y) + ' ' else: if (vs[0].Point-previousvs[-1].Point).Length > 1e-6: @@ -174,9 +175,9 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct #return svg endpoints = (getProj(c.value((c.LastParameter-\ c.FirstParameter)/2.0)), \ - getProj(vs[-1].Point)) + getProj(vs[-1].Point), plane) else: - endpoints = (getProj(vs[-1].Point),) + endpoints = (getProj(vs[-1].Point), plane) # arc if iscircle: rx = ry = c.Radius @@ -208,7 +209,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct else: edata += getDiscretized(e) elif DraftGeomUtils.geomType(e) == "Line": - v = getProj(vs[-1].Point) + v = getProj(vs[-1].Point, plane) edata += 'L '+ str(v.x) +' '+ str(v.y) + ' ' else: bspline=e.Curve.toBSpline(e.FirstParameter,e.LastParameter) @@ -228,13 +229,13 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct elif bezierseg.Degree==3: edata +='C ' for pole in bezierseg.getPoles()[1:]: - v = getProj(pole) + v = getProj(pole, plane) edata += str(v.x) +' '+ str(v.y) + ' ' else: print("Debug: one edge (hash ",e.hashCode(),\ ") has been discretized with parameter 0.1") for linepoint in bspline.discretize(0.1)[1:]: - v = getProj(linepoint) + v = getProj(linepoint, plane) edata += 'L '+ str(v.x) +' '+ str(v.y) + ' ' if fill != 'none': edata += 'Z ' @@ -260,7 +261,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct return svg def getCircle(edge): - cen = getProj(edge.Curve.Center) + cen = getProj(edge.Curve.Center, plane) rad = edge.Curve.Radius if hasattr(FreeCAD,"DraftWorkingPlane"): drawing_plane_normal = FreeCAD.DraftWorkingPlane.axis @@ -287,7 +288,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct return svg def getEllipse(edge): - cen = getProj(edge.Curve.Center) + cen = getProj(edge.Curve.Center, plane) mir = edge.Curve.MinorRadius mar = edge.Curve.MajorRadius svg = ' math.pi/2): tangle = tangle + math.pi - tbase = getProj(prx.circle.valueAt(prx.circle.FirstParameter+(prx.circle.LastParameter-prx.circle.FirstParameter)/2.0)) + tbase = getProj(prx.circle.valueAt(prx.circle.FirstParameter+(prx.circle.LastParameter-prx.circle.FirstParameter)/2.0), plane) tbase = tbase.add(DraftVecUtils.rotate(Vector(0,2.0/scale,0),tangle)) #print(tbase) else: tangle = 0 - tbase = getProj(prx.tbase) + tbase = getProj(prx.tbase, plane) svg += getText(stroke,fontsize,obj.ViewObject.FontName,tangle,tbase,prx.string) elif getType(obj) == "Label": @@ -598,7 +599,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct ) # Draw multisegment line - proj_points = list(map(getProj, obj.Points)) + proj_points = list(map(getProj, obj.Points), plane) path_dir_list = [format_point(proj_points[0], action='M')] path_dir_list += map(format_point, proj_points[1:]) path_dir_str = " ".join(path_dir_list) @@ -614,7 +615,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct # if Line is set to 'off', no arrow is drawn if hasattr(obj.ViewObject, "ArrowType") and len(obj.Points) >= 2: last_segment = FreeCAD.Vector(obj.Points[-1] - obj.Points[-2]) - angle = -DraftVecUtils.angle(getProj(last_segment)) + math.pi + angle = -DraftVecUtils.angle(getProj(last_segment, plane)) + math.pi svg += getArrow( arrowtype=obj.ViewObject.ArrowType, point=proj_points[-1], @@ -630,7 +631,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct print("export of texts to SVG is only available in GUI mode") else: fontname = obj.ViewObject.TextFont - position = getProj(obj.Placement.Base) + position = getProj(obj.Placement.Base, plane) rotation = obj.Placement.Rotation justification = obj.ViewObject.TextAlignment text = obj.Text @@ -645,11 +646,11 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct else: n = obj.ViewObject.FontName if getType(obj) == "Annotation": - p = getProj(obj.Position) + p = getProj(obj.Position, plane) r = obj.ViewObject.Rotation.getValueAs("rad") t = obj.LabelText else: # DraftText - p = getProj(obj.Placement.Base) + p = getProj(obj.Placement.Base, plane) r = obj.Placement.Rotation t = obj.Text j = obj.ViewObject.Justification @@ -741,12 +742,12 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct lspc = FreeCAD.Vector(obj.ViewObject.Proxy.header.translation.getValue().getValue()) p1 = p2.add(lspc) j = obj.ViewObject.TextAlign - svg += getText(c,f1,n,a,getProj(p1),t1,linespacing,j,flip=True) + svg += getText(c,f1,n,a,getProj(p1, plane),t1,linespacing,j,flip=True) if t2: ofs = FreeCAD.Vector(0,lspc.Length,0) if a: ofs = FreeCAD.Rotation(FreeCAD.Vector(0,0,1),-rotation).multVec(ofs) - svg += getText(c,fontsize,n,a,getProj(p1).add(ofs),t2,linespacing,j,flip=True) + svg += getText(c,fontsize,n,a,getProj(p1, plane).add(ofs),t2,linespacing,j,flip=True) elif obj.isDerivedFrom('Part::Feature'): if obj.Shape.isNull(): @@ -800,8 +801,8 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct if FreeCAD.GuiUp: if hasattr(obj.ViewObject,"EndArrow") and hasattr(obj.ViewObject,"ArrowType") and (len(obj.Shape.Vertexes) > 1): if obj.ViewObject.EndArrow: - p1 = getProj(obj.Shape.Vertexes[-2].Point) - p2 = getProj(obj.Shape.Vertexes[-1].Point) + p1 = getProj(obj.Shape.Vertexes[-2].Point, plane) + p2 = getProj(obj.Shape.Vertexes[-1].Point, plane) angle = -DraftVecUtils.angle(p2.sub(p1)) arrowsize = obj.ViewObject.ArrowSize.Value/pointratio svg += getArrow(obj.ViewObject.ArrowType,p2,arrowsize,stroke,linewidth,angle)