=== modified file 'share/extensions/grid_cartesian.py' --- share/extensions/grid_cartesian.py 2015-10-08 00:07:16 +0000 +++ share/extensions/grid_cartesian.py 2015-12-07 10:37:28 +0000 @@ -25,6 +25,7 @@ import inkex import simplestyle, sys from math import * +from simpletransform import computePointInNode def draw_SVG_line(x1, y1, x2, y2, width, name, parent): style = { 'stroke': '#000000', 'stroke-width':str(width), 'fill': 'none' } @@ -139,8 +140,9 @@ # Embed grid in group #Put in in the centre of the current view - t = 'translate(' + str( self.view_center[0]- xmax/2.0) + ',' + \ - str( self.view_center[1]- ymax/2.0) + ')' + view_center = computePointInNode(list(self.view_center), self.current_layer) + t = 'translate(' + str( view_center[0]- xmax/2.0) + ',' + \ + str( view_center[1]- ymax/2.0) + ')' g_attribs = {inkex.addNS('label','inkscape'):'Grid_Polar:X' + \ str( self.options.x_divs )+':Y'+str( self.options.y_divs ), 'transform':t } === modified file 'share/extensions/grid_isometric.py' --- share/extensions/grid_isometric.py 2015-10-08 00:07:16 +0000 +++ share/extensions/grid_isometric.py 2015-12-07 10:37:28 +0000 @@ -26,6 +26,7 @@ import inkex import simplestyle, sys from math import * +from simpletransform import computePointInNode def draw_SVG_line(x1, y1, x2, y2, width, name, parent): @@ -101,8 +102,9 @@ #Embed grid in group #Put in in the centre of the current view - t = 'translate(' + str( self.view_center[0]- xmax/2.0) + ',' + \ - str( self.view_center[1]- ymax/2.0) + ')' + view_center = computePointInNode(list(self.view_center), self.current_layer) + t = 'translate(' + str( view_center[0]- xmax/2.0) + ',' + \ + str( view_center[1]- ymax/2.0) + ')' g_attribs = {inkex.addNS('label','inkscape'):'Grid_Polar:X' + \ str( self.options.x_divs )+':Y'+str( self.options.y_divs ), 'transform':t } === modified file 'share/extensions/grid_polar.py' --- share/extensions/grid_polar.py 2015-10-08 00:07:16 +0000 +++ share/extensions/grid_polar.py 2015-12-07 10:37:28 +0000 @@ -23,6 +23,7 @@ import inkex import simplestyle, sys from math import * +from simpletransform import computePointInNode def draw_SVG_circle(r, cx, cy, width, fill, name, parent): style = { 'stroke': '#000000', 'stroke-width':str(width), 'fill': fill } @@ -131,7 +132,8 @@ # Embed grid in group #Put in in the centre of the current view - t = 'translate(' + str( self.view_center[0] ) + ',' + str( self.view_center[1] ) + ')' + view_center = computePointInNode(list(self.view_center), self.current_layer) + t = 'translate(' + str( view_center[0] ) + ',' + str( view_center[1] ) + ')' g_attribs = {inkex.addNS('label','inkscape'):'Grid_Polar:R' + str( self.options.r_divs )+':A'+str( self.options.a_divs ), 'transform':t } === modified file 'share/extensions/hershey.py' --- share/extensions/hershey.py 2015-10-08 00:07:16 +0000 +++ share/extensions/hershey.py 2015-12-07 10:37:28 +0000 @@ -22,6 +22,7 @@ import hersheydata #data file w/ Hershey font data import inkex import simplestyle +from simpletransform import computePointInNode Debug = False @@ -98,7 +99,8 @@ w = wmax # Translate group to center of view, approximately - t = 'translate(' + str( self.view_center[0] - scale*w/2) + ',' + str( self.view_center[1] ) + ')' + view_center = computePointInNode(list(self.view_center), self.current_layer) + t = 'translate(' + str( view_center[0] - scale*w/2) + ',' + str( view_center[1] ) + ')' if scale != 1: t += ' scale(' + str(scale) + ')' g.set( 'transform',t) === modified file 'share/extensions/lindenmayer.py' --- share/extensions/lindenmayer.py 2015-10-08 00:07:16 +0000 +++ share/extensions/lindenmayer.py 2015-12-07 10:37:28 +0000 @@ -17,6 +17,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ''' import inkex, simplestyle, pturtle, random +from simpletransform import computePointInNode def stripme(s): return s.strip() @@ -68,7 +69,7 @@ return self.turtle.getPath() def __compose_path(self, string): self.turtle.pu() - self.turtle.setpos(self.view_center) + self.turtle.setpos(computePointInNode(list(self.view_center), self.current_layer)) self.turtle.pd() for c in string: if c in 'ABCDEF': === modified file 'share/extensions/perspective.py' --- share/extensions/perspective.py 2014-02-15 00:04:14 +0000 +++ share/extensions/perspective.py 2015-12-07 10:37:28 +0000 @@ -32,7 +32,6 @@ import simplepath import cubicsuperpath import simpletransform -import voronoi2svg from ffgeom import * inkex.localize() @@ -139,7 +138,7 @@ csp[0] = self.project_point(csp[0],m) csp[1] = self.project_point(csp[1],m) csp[2] = self.project_point(csp[2],m) - mat = voronoi2svg.Voronoi2svg().invertTransform(mat) + mat = simpletransform.invertTransform(mat) simpletransform.applyTransformToPath(mat, p) path.set('d',cubicsuperpath.formatPath(p)) === modified file 'share/extensions/polyhedron_3d.py' --- share/extensions/polyhedron_3d.py 2015-10-08 00:07:16 +0000 +++ share/extensions/polyhedron_3d.py 2015-12-07 10:37:28 +0000 @@ -55,6 +55,7 @@ # local library import inkex import simplestyle +from simpletransform import computePointInNode inkex.localize() @@ -467,7 +468,8 @@ #INKSCAPE GROUP TO CONTAIN THE POLYHEDRON #Put in in the centre of the current view - poly_transform = 'translate(' + str( self.view_center[0]) + ',' + str( self.view_center[1]) + ')' + view_center = computePointInNode(list(self.view_center), self.current_layer) + poly_transform = 'translate(' + str( view_center[0]) + ',' + str( view_center[1]) + ')' if scale != 1: poly_transform += ' scale(' + str(scale) + ')' #we will put all the rotations in the object name, so it can be repeated in === modified file 'share/extensions/render_barcode.py' --- share/extensions/render_barcode.py 2015-10-08 00:07:16 +0000 +++ share/extensions/render_barcode.py 2015-12-07 10:37:28 +0000 @@ -24,6 +24,7 @@ import inkex import sys from Barcode import getBarcode +from simpletransform import computePointInNode class InsertBarcode(inkex.Effect): def __init__(self): @@ -42,7 +43,7 @@ help="Text to print on barcode") def effect(self): - x, y = self.view_center + x, y = computePointInNode(list(self.view_center), self.current_layer) bargen = getBarcode( self.options.type, text=self.options.text, height=self.options.height, === modified file 'share/extensions/render_barcode_datamatrix.py' --- share/extensions/render_barcode_datamatrix.py 2015-10-08 00:07:16 +0000 +++ share/extensions/render_barcode_datamatrix.py 2015-12-07 10:37:28 +0000 @@ -54,6 +54,7 @@ # local library import inkex import simplestyle +from simpletransform import computePointInNode inkex.localize() @@ -680,7 +681,7 @@ #INKSCAPE GROUP TO CONTAIN EVERYTHING - centre = self.view_center #Put in in the centre of the current view + centre = tuple(computePointInNode(list(self.view_center), self.current_layer)) #Put in in the centre of the current view grp_transform = 'translate' + str( centre ) + ' scale(%f)' % scale grp_name = 'DataMatrix' grp_attribs = {inkex.addNS('label','inkscape'):grp_name, === modified file 'share/extensions/render_barcode_qrcode.py' --- share/extensions/render_barcode_qrcode.py 2015-10-08 00:07:16 +0000 +++ share/extensions/render_barcode_qrcode.py 2015-12-07 10:37:28 +0000 @@ -2,6 +2,7 @@ import math, sys import inkex +from simpletransform import computePointInNode inkex.localize() @@ -1057,7 +1058,7 @@ #INKSCAPE GROUP TO CONTAIN EVERYTHING so.TEXT = unicode(so.TEXT, so.input_encode) - centre = self.view_center #Put in in the centre of the current view + centre = tuple(computePointInNode(list(self.view_center), self.current_layer)) #Put in in the centre of the current view grp_transform = 'translate' + str( centre ) + ' scale(%f)' % scale grp_name = 'QR Code: '+so.TEXT grp_attribs = {inkex.addNS('label','inkscape'):grp_name, === modified file 'share/extensions/render_gear_rack.py' --- share/extensions/render_gear_rack.py 2015-10-08 00:07:16 +0000 +++ share/extensions/render_gear_rack.py 2015-12-07 10:37:28 +0000 @@ -19,6 +19,7 @@ import inkex import simplestyle +from simpletransform import computePointInNode from math import * @@ -85,8 +86,9 @@ # Embed gear in group to make animation easier: # Translate group, Rotate path. - t = 'translate(' + str(self.view_center[0]) + ',' + \ - str(self.view_center[1]) + ')' + view_center = computePointInNode(list(self.view_center), self.current_layer) + t = 'translate(' + str(view_center[0]) + ',' + \ + str(view_center[1]) + ')' g_attribs = { inkex.addNS('label', 'inkscape'): 'RackGear' + str(length), 'transform': t} === modified file 'share/extensions/render_gears.py' --- share/extensions/render_gears.py 2015-10-08 00:07:16 +0000 +++ share/extensions/render_gears.py 2015-12-07 10:37:28 +0000 @@ -20,6 +20,7 @@ import inkex import simplestyle, sys +from simpletransform import computePointInNode from math import * import string @@ -158,7 +159,8 @@ # Embed gear in group to make animation easier: # Translate group, Rotate path. - t = 'translate(' + str( self.view_center[0] ) + ',' + str( self.view_center[1] ) + ')' + view_center = computePointInNode(list(self.view_center), self.current_layer) + t = 'translate(' + str( view_center[0] ) + ',' + str( view_center[1] ) + ')' g_attribs = {inkex.addNS('label','inkscape'):'Gear' + str( teeth ), 'transform':t } g = inkex.etree.SubElement(self.current_layer, 'g', g_attribs) === modified file 'share/extensions/rtree.py' --- share/extensions/rtree.py 2015-10-11 06:35:18 +0000 +++ share/extensions/rtree.py 2015-12-07 10:37:28 +0000 @@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ''' import inkex, simplestyle, pturtle, random +from simpletransform import computePointInNode def rtree(turtle, size, min, pt=False): if size < min: @@ -61,7 +62,7 @@ 'fill': 'none'} t = pturtle.pTurtle() t.pu() - t.setpos(self.view_center) + t.setpos(computePointInNode(list(self.view_center), self.current_layer)) t.pd() rtree(t, self.options.size, self.options.minimum, self.options.pentoggle) === modified file 'share/extensions/simpletransform.py' --- share/extensions/simpletransform.py 2015-10-08 00:07:16 +0000 +++ share/extensions/simpletransform.py 2015-12-07 10:37:28 +0000 @@ -78,6 +78,21 @@ def formatTransform(mat): return ("matrix(%f,%f,%f,%f,%f,%f)" % (mat[0][0], mat[1][0], mat[0][1], mat[1][1], mat[0][2], mat[1][2])) +def invertTransform(mat): + det = mat[0][0]*mat[1][1] - mat[0][1]*mat[1][0] + if det !=0: # det is 0 only in case of 0 scaling + # invert the rotation/scaling part + a11 = mat[1][1]/det + a12 = -mat[0][1]/det + a21 = -mat[1][0]/det + a22 = mat[0][0]/det + # invert the translational part + a13 = -(a11*mat[0][2] + a12*mat[1][2]) + a23 = -(a21*mat[0][2] + a22*mat[1][2]) + return [[a11,a12,a13],[a21,a22,a23]] + else: + return[[0,0,-mat[0][2]],[0,0,-mat[1][2]]] + def composeTransform(M1,M2): a11 = M1[0][0]*M2[0][0] + M1[0][1]*M2[1][0] a12 = M1[0][0]*M2[0][1] + M1[0][1]*M2[1][1] @@ -237,4 +252,10 @@ return bbox +def computePointInNode(pt, node, mat=[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]): + if node.getparent() is not None: + applyTransformToPoint(invertTransform(composeParents(node, mat)), pt) + return pt + + # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99 === modified file 'share/extensions/spirograph.py' --- share/extensions/spirograph.py 2015-10-08 00:07:16 +0000 +++ share/extensions/spirograph.py 2015-12-07 10:37:28 +0000 @@ -17,6 +17,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ''' import inkex, simplestyle, math +from simpletransform import computePointInNode class Spirograph(inkex.Effect): def __init__(self): @@ -81,12 +82,13 @@ theta = i * scale + view_center = computePointInNode(list(self.view_center), self.current_layer) x = a * math.cos(theta + rotation) + \ self.options.penr * math.cos(ratio * theta + rotation) * flip + \ - self.view_center[0] + view_center[0] y = a * math.sin(theta + rotation) - \ self.options.penr * math.sin(ratio * theta + rotation) + \ - self.view_center[1] + view_center[1] dx = (-a * math.sin(theta + rotation) - \ ratio * self.options.penr * math.sin(ratio * theta + rotation) * flip) * scale / 3 === modified file 'share/extensions/summersnight.py' --- share/extensions/summersnight.py 2014-02-15 00:04:14 +0000 +++ share/extensions/summersnight.py 2015-12-07 10:37:28 +0000 @@ -24,7 +24,6 @@ import inkex import simplepath import simpletransform -import voronoi2svg from ffgeom import * inkex.localize() @@ -115,7 +114,7 @@ csp[0] = self.trafopoint(csp[0]) csp[1] = self.trafopoint(csp[1]) csp[2] = self.trafopoint(csp[2]) - mat = voronoi2svg.Voronoi2svg().invertTransform(mat) + mat = simpletransform.invertTransform(mat) simpletransform.applyTransformToPath(mat, p) path.set('d',cubicsuperpath.formatPath(p)) === modified file 'share/extensions/triangle.py' --- share/extensions/triangle.py 2015-10-08 00:07:16 +0000 +++ share/extensions/triangle.py 2015-12-07 10:37:28 +0000 @@ -34,6 +34,7 @@ import inkex import simplestyle, sys +from simpletransform import computePointInNode from math import * def draw_SVG_tri( (x1, y1), (x2, y2), (x3, y3), (ox,oy), width, name, parent): @@ -121,7 +122,7 @@ def effect(self): tri = self.current_layer - offset = (self.view_center[0],self.view_center[1]) #the offset require to centre the triangle + offset = computePointInNode(list(self.view_center), self.current_layer) #the offset require to centre the triangle self.options.s_a = self.unittouu(str(self.options.s_a) + 'px') self.options.s_b = self.unittouu(str(self.options.s_b) + 'px') self.options.s_c = self.unittouu(str(self.options.s_c) + 'px') === modified file 'share/extensions/voronoi2svg.py' --- share/extensions/voronoi2svg.py 2014-02-16 00:27:42 +0000 +++ share/extensions/voronoi2svg.py 2015-12-07 10:37:28 +0000 @@ -171,23 +171,6 @@ #{{{ Transformation helpers - def invertTransform(self,mat): - det = mat[0][0]*mat[1][1] - mat[0][1]*mat[1][0] - if det !=0: #det is 0 only in case of 0 scaling - #invert the rotation/scaling part - a11 = mat[1][1]/det - a12 = -mat[0][1]/det - a21 = -mat[1][0]/det - a22 = mat[0][0]/det - - #invert the translational part - a13 = -(a11*mat[0][2] + a12*mat[1][2]) - a23 = -(a21*mat[0][2] + a22*mat[1][2]) - - return [[a11,a12,a13],[a21,a22,a23]] - else: - return[[0,0,-mat[0][2]],[0,0,-mat[1][2]]] - def getGlobalTransform(self,node): parent = node.getparent() myTrans = simpletransform.parseTransform(node.get('transform')) @@ -239,7 +222,7 @@ trans = self.getGlobalTransform(parentGroup) invtrans = None if trans: - invtrans = self.invertTransform(trans) + invtrans = simpletransform.invertTransform(trans) #}}} === modified file 'share/extensions/whirl.py' --- share/extensions/whirl.py 2015-10-08 00:07:16 +0000 +++ share/extensions/whirl.py 2015-12-07 10:37:28 +0000 @@ -17,6 +17,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ''' import math, inkex, cubicsuperpath +from simpletransform import computePointInNode class Whirl(inkex.Effect): def __init__(self): @@ -30,6 +31,7 @@ dest="rotation", default=True, help="direction of rotation") def effect(self): + view_center = computePointInNode(list(self.view_center), self.current_layer) for id, node in self.selected.iteritems(): rotation = -1 if self.options.rotation == True: @@ -41,16 +43,16 @@ for sub in p: for csp in sub: for point in csp: - point[0] -= self.view_center[0] - point[1] -= self.view_center[1] + point[0] -= view_center[0] + point[1] -= view_center[1] dist = math.sqrt((point[0] ** 2) + (point[1] ** 2)) if dist != 0: a = rotation * dist * whirl theta = math.atan2(point[1], point[0]) + a point[0] = (dist * math.cos(theta)) point[1] = (dist * math.sin(theta)) - point[0] += self.view_center[0] - point[1] += self.view_center[1] + point[0] += view_center[0] + point[1] += view_center[1] node.set('d',cubicsuperpath.formatPath(p)) if __name__ == '__main__': === modified file 'share/extensions/wireframe_sphere.py' --- share/extensions/wireframe_sphere.py 2015-10-08 00:07:16 +0000 +++ share/extensions/wireframe_sphere.py 2015-12-07 10:37:28 +0000 @@ -59,6 +59,7 @@ # local library import inkex import simplestyle +from simpletransform import computePointInNode inkex.localize() @@ -129,7 +130,7 @@ #INKSCAPE GROUP TO CONTAIN EVERYTHING - centre = self.view_center #Put in in the centre of the current view + centre = tuple(computePointInNode(list(self.view_center), self.current_layer)) #Put in in the centre of the current view grp_transform = 'translate' + str( centre ) + flip grp_name = 'WireframeSphere' grp_attribs = {inkex.addNS('label','inkscape'):grp_name,