From f7173c9a5d645648542d1529fa1000482958b1de Mon Sep 17 00:00:00 2001 From: daid Date: Sun, 29 Sep 2013 16:25:22 +0200 Subject: [PATCH] Support multple modification in a single transform tag. Add rotate(r,x,y) transform. --- Cura/util/svg.py | 67 ++++++++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/Cura/util/svg.py b/Cura/util/svg.py index c4ff0164..132a1949 100644 --- a/Cura/util/svg.py +++ b/Cura/util/svg.py @@ -8,31 +8,44 @@ import numpy from xml.etree import ElementTree def applyTransformString(matrix, transform): - s = transform.find('(') - e = transform.find(')') - if s < 0 or e < 0: - print 'Unknown transform: %s' % (transform) - return matrix - tag = transform[:s] - data = map(float, re.split('[ \t,]+', transform[s+1:e].strip())) - if tag == 'matrix' and len(data) == 6: - return matrix * numpy.matrix([[data[0],data[1],0],[data[2],data[3],0],[data[4],data[5],1]], numpy.float64) - elif tag == 'translate' and len(data) == 1: - return matrix * numpy.matrix([[1,0,data[0]],[0,1,0],[0,0,1]], numpy.float64) - elif tag == 'translate' and len(data) == 2: - return matrix * numpy.matrix([[1,0,0],[0,1,0],[data[0],data[1],1]], numpy.float64) - elif tag == 'scale' and len(data) == 1: - return matrix * numpy.matrix([[data[0],0,0],[0,data[0],0],[0,0,1]], numpy.float64) - elif tag == 'scale' and len(data) == 2: - return matrix * numpy.matrix([[data[0],0,0],[0,data[1],0],[0,0,1]], numpy.float64) - elif tag == 'rotate' and len(data) == 1: - r = math.radians(data[0]) - return matrix * numpy.matrix([[math.cos(r),math.sin(r),0],[-math.sin(r),math.cos(r),0],[0,0,1]], numpy.float64) - elif tag == 'skewX' and len(data) == 1: - return matrix * numpy.matrix([[1,0,0],[math.tan(data[0]),1,0],[0,0,1]], numpy.float64) - elif tag == 'skewY' and len(data) == 1: - return matrix * numpy.matrix([[1,math.tan(data[0]),0],[0,1,0],[0,0,1]], numpy.float64) - print 'Unknown transform: %s' % (transform) + if len(re.findall('\)', transform)) > 1: + print transform + while transform != '': + if transform[0] == ',': + transform = transform[1:].strip() + s = transform.find('(') + e = transform.find(')') + if s < 0 or e < 0: + print 'Unknown transform: %s' % (transform) + return matrix + tag = transform[:s] + data = map(float, re.split('[ \t,]+', transform[s+1:e].strip())) + if tag == 'matrix' and len(data) == 6: + matrix = numpy.matrix([[data[0],data[1],0],[data[2],data[3],0],[data[4],data[5],1]], numpy.float64) * matrix + elif tag == 'translate' and len(data) == 1: + matrix = numpy.matrix([[1,0,data[0]],[0,1,0],[0,0,1]], numpy.float64) * matrix + elif tag == 'translate' and len(data) == 2: + matrix = numpy.matrix([[1,0,0],[0,1,0],[data[0],data[1],1]], numpy.float64) * matrix + elif tag == 'scale' and len(data) == 1: + matrix = numpy.matrix([[data[0],0,0],[0,data[0],0],[0,0,1]], numpy.float64) * matrix + elif tag == 'scale' and len(data) == 2: + matrix = numpy.matrix([[data[0],0,0],[0,data[1],0],[0,0,1]], numpy.float64) * matrix + elif tag == 'rotate' and len(data) == 1: + r = math.radians(data[0]) + matrix = numpy.matrix([[math.cos(r),math.sin(r),0],[-math.sin(r),math.cos(r),0],[0,0,1]], numpy.float64) * matrix + elif tag == 'rotate' and len(data) == 3: + matrix = numpy.matrix([[1,0,0],[0,1,0],[data[1],data[2],1]], numpy.float64) * matrix + r = math.radians(data[0]) + matrix = numpy.matrix([[math.cos(r),math.sin(r),0],[-math.sin(r),math.cos(r),0],[0,0,1]], numpy.float64) * matrix + matrix = numpy.matrix([[1,0,0],[0,1,0],[-data[1],-data[2],1]], numpy.float64) * matrix + elif tag == 'skewX' and len(data) == 1: + matrix = numpy.matrix([[1,0,0],[math.tan(data[0]),1,0],[0,0,1]], numpy.float64) * matrix + elif tag == 'skewY' and len(data) == 1: + matrix = numpy.matrix([[1,math.tan(data[0]),0],[0,1,0],[0,0,1]], numpy.float64) * matrix + else: + print 'Unknown transform: %s' % (transform) + return matrix + transform = transform[e+1:].strip() return matrix def toFloat(f): @@ -111,8 +124,6 @@ class Path(object): a1 = math.atan2((p1alt.imag - cAlt.imag) / r.imag, (p1alt.real - cAlt.real) / r.real) a2 = math.atan2((p2alt.imag - cAlt.imag) / r.imag, (p2alt.real - cAlt.real) / r.real) - #if a1 > a2: - # a2 += math.pi * 2 large = abs(a2 - a1) > math.pi if large != p['large']: if a1 < a2: @@ -510,7 +521,7 @@ class SVG(object): if __name__ == '__main__': for n in xrange(1, len(sys.argv)): - #print 'File: %s' % (sys.argv[n]) + print 'File: %s' % (sys.argv[n]) svg = SVG(sys.argv[n]) f = open("test_export.html", "w") -- 2.30.2