From 3dd586b5beb52858f117bf932757435d8b121a09 Mon Sep 17 00:00:00 2001 From: Yorik van Havre Date: Tue, 13 Sep 2016 20:11:03 -0300 Subject: [PATCH] Draft: small optimizations of Draft's SVG output and fixed wrong dash scale --- src/Mod/Draft/Draft.py | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/src/Mod/Draft/Draft.py b/src/Mod/Draft/Draft.py index 51cccd7f6..4370a90d2 100644 --- a/src/Mod/Draft/Draft.py +++ b/src/Mod/Draft/Draft.py @@ -1719,6 +1719,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct any text). You can also supply an arbitrary projection vector. the scale parameter allows to scale linewidths down, so they are resolution-independant.''' import Part, DraftGeomUtils + pathdata = [] svg = "" linewidth = float(linewidth)/scale fontsize = (float(fontsize)/scale)/2 @@ -1726,6 +1727,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct linespacing = float(linespacing)/scale else: linespacing = 0.5 + #print obj.Label," line spacing ",linespacing,"scale ",scale pointratio = .75 # the number of times the dots are smaller than the arrow size plane = None if direction: @@ -1745,12 +1747,19 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct def getLineStyle(): "returns a linestyle" p = FreeCAD.ParamGet("User parameter:BaseApp/Preferences/Mod/Draft") + l = None if linestyle == "Dashed": - return p.GetString("svgDashedLine","0.09,0.05") + l = p.GetString("svgDashedLine","0.09,0.05") elif linestyle == "Dashdot": - return p.GetString("svgDashdotLine","0.09,0.05,0.02,0.05") + l = p.GetString("svgDashdotLine","0.09,0.05,0.02,0.05") elif linestyle == "Dotted": - return p.GetString("svgDottedLine","0.02,0.02") + l = p.GetString("svgDottedLine","0.02,0.02") + if l: + l = l.split(",") + # scale dashes + l = ",".join([str(float(d)/scale) for d in l]) + #print "lstyle ",l + return l return "none" def getProj(vec): @@ -1785,6 +1794,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct w1.fixWire() egroups.append(Part.__sortEdges__(w1.Edges)) for egroupindex, edges in enumerate(egroups): + edata = "" vs=() #skipped for the first edge for edgeindex,e in enumerate(edges): previousvs = vs @@ -1795,7 +1805,7 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct vs.reverse() if edgeindex == 0: v = getProj(vs[0].Point) - svg += 'M '+ str(v.x) +' '+ str(v.y) + ' ' + edata += 'M '+ str(v.x) +' '+ str(v.y) + ' ' else: if (vs[0].Point-previousvs[-1].Point).Length > 1e-6: raise ValueError('edges not ordered') @@ -1841,13 +1851,13 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct == (e.LastParameter > e.FirstParameter) # == (e.Orientation == "Forward") for v in endpoints: - svg += 'A %s %s %s %s %s %s %s ' % \ + edata += 'A %s %s %s %s %s %s %s ' % \ (str(rx),str(ry),str(rot),\ str(int(flag_large_arc)),\ str(int(flag_sweep)),str(v.x),str(v.y)) elif DraftGeomUtils.geomType(e) == "Line": v = getProj(vs[-1].Point) - svg += 'L '+ str(v.x) +' '+ str(v.y) + ' ' + edata += 'L '+ str(v.x) +' '+ str(v.y) + ' ' else: bspline=e.Curve.toBSpline(e.FirstParameter,e.LastParameter) if bspline.Degree > 3 or bspline.isRational(): @@ -1860,21 +1870,28 @@ def getSVG(obj,scale=1,linewidth=0.35,fontsize=12,fillstyle="shape color",direct if bezierseg.Degree>3: #should not happen raise AssertionError elif bezierseg.Degree==1: - svg +='L ' + edata +='L ' elif bezierseg.Degree==2: - svg +='Q ' + edata +='Q ' elif bezierseg.Degree==3: - svg +='C ' + edata +='C ' for pole in bezierseg.getPoles()[1:]: v = getProj(pole) - svg += str(v.x) +' '+ str(v.y) + ' ' + 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) - svg += 'L '+ str(v.x) +' '+ str(v.y) + ' ' - if fill != 'none': svg += 'Z ' + edata += 'L '+ str(v.x) +' '+ str(v.y) + ' ' + if fill != 'none': + edata += 'Z ' + if edata in pathdata: + # do not draw a path on another identical path + return "" + else: + svg += edata + pathdata.append(edata) svg += '" ' svg += 'stroke="' + stroke + '" ' svg += 'stroke-width="' + str(linewidth) + ' px" '