From c82b4cb02942f19f79b03b559fb1e556d859be36 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Wed, 2 Apr 2014 15:22:44 -0400 Subject: extensions. Measure Path. add option to calculate center of mass. (Bug 171331) Fixed bugs: - https://launchpad.net/bugs/171331 (bzr r13250) --- share/extensions/measure.inx | 7 ++-- share/extensions/measure.py | 86 ++++++++++++++++++++++++++++++++++---------- 2 files changed, 72 insertions(+), 21 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/measure.inx b/share/extensions/measure.inx index cfbc3fce7..8fae020e0 100644 --- a/share/extensions/measure.inx +++ b/share/extensions/measure.inx @@ -9,6 +9,7 @@ <_item value="length">Length <_item msgctxt="measure extension" value="area">Area + <_item msgctxt="measure extension" value="cofm">Center of Mass <_item msgctxt="measure extension" value="textonpath">Text On Path @@ -32,9 +33,9 @@ - <_param name="measurehelp" type="description" xml:space="preserve">This effect measures the length, or area, of the selected paths and adds it as a text object with the selected units. - - * Display format can be either Text-On-Path, or stand-alone text at a specified angle. + <_param name="measurehelp" type="description" xml:space="preserve">This effect measures the length, area, or center-of-mass of the selected paths. Length and area are added as a text object with the selected units. Center-of-mass is shown as a cross symbol. + + * Text display format can be either Text-On-Path, or stand-alone text at a specified angle. * The number of significant digits can be controlled by the Precision field. * The Offset field controls the distance from the text to the path. * The Scale factor can be used to make measurements in scaled drawings. For example, if 1 cm in the drawing equals 2.5 m in the real world, Scale must be set to 250. diff --git a/share/extensions/measure.py b/share/extensions/measure.py index ca471816f..5c709594f 100755 --- a/share/extensions/measure.py +++ b/share/extensions/measure.py @@ -1,8 +1,9 @@ #!/usr/bin/env python ''' This extension module can measure arbitrary path and object length -It adds a text to the selected path containing the length in a -given unit. +It adds text to the selected path containing the length in a given unit. +Area and Center of Mass calculated using Green's Theorem: +http://mathworld.wolfram.com/GreensTheorem.html Copyright (C) 2010 Alvin Penner Copyright (C) 2006 Georg Wiora @@ -30,10 +31,31 @@ TODO: 2. check direction >90 or <-90 Degrees 3. rotate by 180 degrees around text center ''' -import inkex, simplestyle, simplepath, simpletransform, sys, cubicsuperpath, bezmisc, locale -# Set current system locale +# standard library +import locale +# local library +import inkex +import simplestyle +import simpletransform +import cubicsuperpath +import bezmisc + +inkex.localize() locale.setlocale(locale.LC_ALL, '') +# third party +try: + import numpy +except: + inkex.errormsg(_("Failed to import the numpy modules. These modules are required by this extension. Please install them and try again. On a Debian-like system this can be done with the command, sudo apt-get install python-numpy.")) + exit() + +mat_area = numpy.matrix([[ 0, 2, 1, -3],[ -2, 0, 1, 1],[ -1, -1, 0, 2],[ 3, -1, -2, 0]]) +mat_cofm_0 = numpy.matrix([[ 0, 35, 10,-45],[-35, 0, 12, 23],[-10,-12, 0, 22],[ 45,-23,-22, 0]]) +mat_cofm_1 = numpy.matrix([[ 0, 15, 3,-18],[-15, 0, 9, 6],[ -3, -9, 0, 12],[ 18, -6,-12, 0]]) +mat_cofm_2 = numpy.matrix([[ 0, 12, 6,-18],[-12, 0, 9, 3],[ -6, -9, 0, 15],[ 18, -3,-15, 0]]) +mat_cofm_3 = numpy.matrix([[ 0, 22, 23,-45],[-22, 0, 12, 10],[-23,-12, 0, 35],[ 45,-10,-35, 0]]) + def numsegs(csp): return sum([len(p)-1 for p in csp]) def interpcoord(v1,v2,p): @@ -69,20 +91,37 @@ def csplength(csp): for i in xrange(1,len(sp)): l = cspseglength(sp[i-1],sp[i]) lengths[-1].append(l) - total += l + total += l return lengths, total def csparea(csp): area = 0.0 for sp in csp: + if len(sp) < 2: continue for i in range(len(sp)): # calculate polygon area area += 0.5*sp[i-1][1][0]*(sp[i][1][1] - sp[i-2][1][1]) for i in range(1, len(sp)): # add contribution from cubic Bezier - bezarea = ( 0.0*sp[i-1][1][1] + 2.0*sp[i-1][2][1] + 1.0*sp[i][0][1] - 3.0*sp[i][1][1])*sp[i-1][1][0] - bezarea += (-2.0*sp[i-1][1][1] + 0.0*sp[i-1][2][1] + 1.0*sp[i][0][1] + 1.0*sp[i][1][1])*sp[i-1][2][0] - bezarea += (-1.0*sp[i-1][1][1] - 1.0*sp[i-1][2][1] + 0.0*sp[i][0][1] + 2.0*sp[i][1][1])*sp[i][0][0] - bezarea += ( 3.0*sp[i-1][1][1] - 1.0*sp[i-1][2][1] - 2.0*sp[i][0][1] + 0.0*sp[i][1][1])*sp[i][1][0] - area += 0.15*bezarea - return abs(area) + vec_x = numpy.matrix([sp[i-1][1][0], sp[i-1][2][0], sp[i][0][0], sp[i][1][0]]) + vec_y = numpy.matrix([sp[i-1][1][1], sp[i-1][2][1], sp[i][0][1], sp[i][1][1]]) + area += 0.15*(vec_x*mat_area*vec_y.T)[0,0] + return -area # require positive area for CCW +def cspcofm(csp): + area = csparea(csp) + xc = 0.0 + yc = 0.0 + if abs(area) < 1.e-8: + inkex.errormsg(_("Area is zero, cannot calculate Center of Mass")) + return 0, 0 + for sp in csp: + for i in range(len(sp)): # calculate polygon moment + xc += sp[i-1][1][1]*(sp[i-2][1][0] - sp[i][1][0])*(sp[i-2][1][0] + sp[i-1][1][0] + sp[i][1][0])/6 + yc += sp[i-1][1][0]*(sp[i][1][1] - sp[i-2][1][1])*(sp[i-2][1][1] + sp[i-1][1][1] + sp[i][1][1])/6 + for i in range(1, len(sp)): # add contribution from cubic Bezier + vec_x = numpy.matrix([sp[i-1][1][0], sp[i-1][2][0], sp[i][0][0], sp[i][1][0]]) + vec_y = numpy.matrix([sp[i-1][1][1], sp[i-1][2][1], sp[i][0][1], sp[i][1][1]]) + vec_t = numpy.matrix([(vec_x*mat_cofm_0*vec_y.T)[0,0], (vec_x*mat_cofm_1*vec_y.T)[0,0], (vec_x*mat_cofm_2*vec_y.T)[0,0], (vec_x*mat_cofm_3*vec_y.T)[0,0]]) + xc += (vec_x*vec_t.T)[0,0]/280 + yc += (vec_y*vec_t.T)[0,0]/280 + return -xc/area, -yc/area def appendSuperScript(node, text): super = inkex.etree.SubElement(node, inkex.addNS('tspan', 'svg'), {'style': 'font-size:65%;baseline-shift:super'}) super.text = text @@ -133,12 +172,13 @@ class Length(inkex.Effect): self.OptionParser.add_option("--measurehelp", action="store", type="string", dest="measurehelp", default="", - help="dummy") - + help="dummy") + def effect(self): # get number of digits prec = int(self.options.precision) - self.options.offset *= self.unittouu('1px') + scale = self.unittouu('1px') # convert to document units + self.options.offset *= scale factor = 1.0 doc = self.document.getroot() if doc.get('viewBox'): @@ -150,16 +190,21 @@ class Length(inkex.Effect): # loop over all selected paths for id, node in self.selected.iteritems(): if node.tag == inkex.addNS('path','svg'): - self.group = inkex.etree.SubElement(node.getparent(),inkex.addNS('text','svg')) - a =[] mat = simpletransform.composeParents(node, [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]) p = cubicsuperpath.parsePath(node.get('d')) simpletransform.applyTransformToPath(mat, p) - factor *= self.unittouu('1px')/self.unittouu('1'+self.options.unit) + factor *= scale/self.unittouu('1'+self.options.unit) if self.options.type == "length": slengths, stotal = csplength(p) - else: + self.group = inkex.etree.SubElement(node.getparent(),inkex.addNS('text','svg')) + elif self.options.type == "area": stotal = csparea(p)*factor*self.options.scale + self.group = inkex.etree.SubElement(node.getparent(),inkex.addNS('text','svg')) + else: + xc, yc = cspcofm(p) + self.group = inkex.etree.SubElement(node.getparent(),inkex.addNS('path','svg')) + self.addCross(self.group, xc, yc, scale) + continue # Format the length as string lenstr = locale.format("%(len)25."+str(prec)+"f",{'len':round(stotal*factor*self.options.scale,prec)}).strip() if self.options.format == 'textonpath': @@ -173,6 +218,11 @@ class Length(inkex.Effect): else: self.addTextWithTspan(self.group, p[0][0][1][0], p[0][0][1][1], lenstr+' '+self.options.unit+'^2', id, 'start', -int(self.options.angle), -self.options.offset + self.options.fontsize/2) + def addCross(self, node, x, y, scale): + l = 3*scale # 3 pixels in document units + node.set('d', 'm %s,%s %s,0 m %s,%s 0,%s' % (str(x-l), str(y), str(2*l), str(-l), str(-l), str(2*l))) + node.set('style', 'stroke:#000000;stroke-width:%s' % str(0.5*scale)) + def addTextOnPath(self, node, x, y, text, id, anchor, startOffset, dy = 0): new = inkex.etree.SubElement(node,inkex.addNS('textPath','svg')) s = {'text-align': 'center', 'vertical-align': 'bottom', -- cgit v1.2.3 From 91cd0ccc5198df06dcdda6512b9630bee800a835 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Thu, 3 Apr 2014 15:35:07 -0400 Subject: extensions. Measure Path. add center point, modify path id (Bug 171331) Fixed bugs: - https://launchpad.net/bugs/171331 (bzr r13259) --- share/extensions/measure.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/measure.py b/share/extensions/measure.py index 5c709594f..edcd2e92f 100755 --- a/share/extensions/measure.py +++ b/share/extensions/measure.py @@ -203,6 +203,7 @@ class Length(inkex.Effect): else: xc, yc = cspcofm(p) self.group = inkex.etree.SubElement(node.getparent(),inkex.addNS('path','svg')) + self.group.set('id', 'MassCenter_' + node.get('id')) self.addCross(self.group, xc, yc, scale) continue # Format the length as string @@ -220,8 +221,8 @@ class Length(inkex.Effect): def addCross(self, node, x, y, scale): l = 3*scale # 3 pixels in document units - node.set('d', 'm %s,%s %s,0 m %s,%s 0,%s' % (str(x-l), str(y), str(2*l), str(-l), str(-l), str(2*l))) - node.set('style', 'stroke:#000000;stroke-width:%s' % str(0.5*scale)) + node.set('d', 'm %s,%s %s,0 %s,0 m %s,%s 0,%s 0,%s' % (str(x-l), str(y), str(l), str(l), str(-l), str(-l), str(l), str(l))) + node.set('style', 'stroke:#000000;fill:none;stroke-width:%s' % str(0.5*scale)) def addTextOnPath(self, node, x, y, text, id, anchor, startOffset, dy = 0): new = inkex.etree.SubElement(node,inkex.addNS('textPath','svg')) -- cgit v1.2.3 From 2595b33b05a0b238993553920ea2f207d86caba3 Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Thu, 10 Apr 2014 00:02:10 +0200 Subject: Fix an issue with extension tests during distcheck. (bzr r13277) --- share/extensions/test/Makefile.am | 1 + 1 file changed, 1 insertion(+) (limited to 'share/extensions') diff --git a/share/extensions/test/Makefile.am b/share/extensions/test/Makefile.am index 9c3124351..7ff68083d 100644 --- a/share/extensions/test/Makefile.am +++ b/share/extensions/test/Makefile.am @@ -44,6 +44,7 @@ EXTRA_DIST = \ radiusrand.test.py \ render_alphabetsoup.test.py \ render_barcode.test.py \ + render_barcode.data \ render_gears.test.py \ restack.test.py \ rtree.test.py \ -- cgit v1.2.3 From aa423334b861e4f5f032db4d5ce5148409f3ee33 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Mon, 14 Apr 2014 15:03:31 -0400 Subject: extensions. color_blackandwhite. add option for color threshold (Bug 1306420) Fixed bugs: - https://launchpad.net/bugs/1306420 (bzr r13284) --- share/extensions/color_blackandwhite.inx | 1 + share/extensions/color_blackandwhite.py | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'share/extensions') diff --git a/share/extensions/color_blackandwhite.inx b/share/extensions/color_blackandwhite.inx index 8432ab2d3..0fa58a128 100644 --- a/share/extensions/color_blackandwhite.inx +++ b/share/extensions/color_blackandwhite.inx @@ -5,6 +5,7 @@ coloreffect.py color_blackandwhite.py simplestyle.py + 127 all diff --git a/share/extensions/color_blackandwhite.py b/share/extensions/color_blackandwhite.py index 57e6e2ae8..fcee057c7 100755 --- a/share/extensions/color_blackandwhite.py +++ b/share/extensions/color_blackandwhite.py @@ -2,12 +2,19 @@ import coloreffect,sys class C(coloreffect.ColorEffect): + def __init__(self): + coloreffect.ColorEffect.__init__(self) + self.OptionParser.add_option("-t", "--threshold", + action="store", type="int", + dest="threshold", default=127, + help="Threshold Color Level") + def colmod(self,r,g,b): #ITU-R Recommendation BT.709 #l = 0.2125 * r + 0.7154 * g + 0.0721 * b #NTSC and PAL l = 0.299 * r + 0.587 * g + 0.114 * b - if l > 127: + if l > self.options.threshold: ig = 255 else: ig = 0 -- cgit v1.2.3 From 4d22e8940aea81094e428e4a4c849bbc246e3b2c Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Mon, 14 Apr 2014 18:33:10 -0400 Subject: extensions. fix typo in unittouu conversion (Bug 1307691) Fixed bugs: - https://launchpad.net/bugs/1307691 (bzr r13288) --- share/extensions/inkex.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/inkex.py b/share/extensions/inkex.py index d71b7d7e7..947cb5b30 100755 --- a/share/extensions/inkex.py +++ b/share/extensions/inkex.py @@ -285,8 +285,8 @@ class Effect: return 'px' #a dictionary of unit to user unit conversion factors - __uuconv = {'in':90.0, 'pt':1.25, 'px':1, 'mm':3.5433070866, 'cm':35.433070866, 'm':3543.3070866, - 'km':3543307.0866, 'pc':15.0, 'yd':3240 , 'ft':1080} + __uuconv = {'in':90.0, 'pt':1.25, 'px':1.0, 'mm':3.5433070866, 'cm':35.433070866, 'm':3543.3070866, + 'km':3543307.0866, 'pc':15.0, 'yd':3240.0 , 'ft':1080.0} def unittouu(self, string): '''Returns userunits given a string representation of units in another system''' unit = re.compile('(%s)$' % '|'.join(self.__uuconv.keys())) -- cgit v1.2.3 From 66face728d416062801961fe30b3812253586276 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Sun, 20 Apr 2014 13:56:51 -0400 Subject: extensions. dxf_input. remove blanks from symbol id's (Bug 1308986) Fixed bugs: - https://launchpad.net/bugs/1308986 (bzr r13294) --- share/extensions/dxf_input.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/dxf_input.py b/share/extensions/dxf_input.py index da81ff78c..235b9ae8f 100755 --- a/share/extensions/dxf_input.py +++ b/share/extensions/dxf_input.py @@ -279,14 +279,14 @@ def export_INSERT(): if vals[groups['2']] and vals[groups['10']] and vals[groups['20']]: x = vals[groups['10']][0] + scale*xmin y = vals[groups['20']][0] - scale*ymin - height - attribs = {'x': '%f' % x, 'y': '%f' % y, inkex.addNS('href','xlink'): '#' + quote(vals[groups['2']][0].encode("utf-8"))} + attribs = {'x': '%f' % x, 'y': '%f' % y, inkex.addNS('href','xlink'): '#' + quote(vals[groups['2']][0].replace(" ", "_").encode("utf-8"))} inkex.etree.SubElement(layer, 'use', attribs) def export_BLOCK(): # mandatory group codes : (2) (block name) if vals[groups['2']]: global block - block = inkex.etree.SubElement(defs, 'symbol', {'id': vals[groups['2']][0]}) + block = inkex.etree.SubElement(defs, 'symbol', {'id': vals[groups['2']][0].replace(" ", "_")}) def export_ENDBLK(): global block -- cgit v1.2.3 From b80bd88072f1823f4120e57eb07a423ea17f62f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20W=C3=BCst?= Date: Mon, 21 Apr 2014 17:21:40 +0200 Subject: ensure backwards compatibility with old hpgl exports (bzr r13295) --- share/extensions/hpgl_decoder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'share/extensions') diff --git a/share/extensions/hpgl_decoder.py b/share/extensions/hpgl_decoder.py index c195b21e3..06cf566a3 100644 --- a/share/extensions/hpgl_decoder.py +++ b/share/extensions/hpgl_decoder.py @@ -112,7 +112,7 @@ class hpglDecoder: def getParameters(self, parameterString): # process coordinates if parameterString.strip() == '': - return [] + parameterString = '0,0;' # remove command delimiter parameterString = parameterString.replace(';', '').strip() # split parameter -- cgit v1.2.3 From d0a835934d4fa1c5713d199632d75a6770b489f8 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Fri, 25 Apr 2014 15:23:41 -0400 Subject: extensions. dxf_input. style change in gcodetools_point by dormouse (Bug 1308986, comment 11) (bzr r13304) --- share/extensions/dxf_input.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'share/extensions') diff --git a/share/extensions/dxf_input.py b/share/extensions/dxf_input.py index 235b9ae8f..7ca176c92 100755 --- a/share/extensions/dxf_input.py +++ b/share/extensions/dxf_input.py @@ -322,7 +322,7 @@ def generate_ellipse(xc, yc, xm, ym, w, a1, a2): def generate_gcodetools_point(xc, yc): path= 'm %s,%s 2.9375,-6.34375 0.8125,1.90625 6.84375,-6.84375 0,0 0.6875,0.6875 -6.84375,6.84375 1.90625,0.8125 z' % (xc,yc) - attribs = {'d': path, inkex.addNS('dxfpoint','inkscape'):'1', 'style': 'stroke:#ff0000;fill:#ff0000'} + attribs = {'d': path, inkex.addNS('dxfpoint','inkscape'):'1', 'style': 'stroke:none;fill:#ff0000'} inkex.etree.SubElement(layer, 'path', attribs) def get_line(): -- cgit v1.2.3 From 1ddcb3036710fa1f6f98aa613f17d651e5a5ea0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20W=C3=BCst?= Date: Mon, 28 Apr 2014 15:03:44 +0200 Subject: changed default unit for hpgl importer to real world unit mm (bzr r13314) --- share/extensions/hpgl_decoder.py | 13 +++++++------ share/extensions/hpgl_input.py | 4 ++-- 2 files changed, 9 insertions(+), 8 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/hpgl_decoder.py b/share/extensions/hpgl_decoder.py index 06cf566a3..e909790b7 100644 --- a/share/extensions/hpgl_decoder.py +++ b/share/extensions/hpgl_decoder.py @@ -37,20 +37,21 @@ class hpglDecoder: ''' self.hpglString = hpglString self.options = options - self.scaleX = options.resolutionX / 90.0 # dots/inch to dots/pixels - self.scaleY = options.resolutionY / 90.0 # dots/inch to dots/pixels + self.scaleX = options.resolutionX / 25.4 # dots/inch to dots/mm + self.scaleY = options.resolutionY / 25.4 # dots/inch to dots/mm self.warning = '' self.textMovements = _("Movements") self.textPenNumber = _("Pen #") def getSvg(self): # prepare document - self.doc = inkex.etree.parse(StringIO('' % - (self.options.docWidth, self.options.docHeight))) + self.doc = inkex.etree.parse(StringIO('' % + (self.options.docWidth, self.options.docHeight, self.options.docWidth, self.options.docHeight))) + inkex.etree.SubElement(self.doc.getroot(), inkex.addNS('namedview', 'sodipodi'), {inkex.addNS('document-units', 'inkscape'): 'mm'}) actualLayer = 0 self.layers = {} if self.options.showMovements: - self.layers[0] = inkex.etree.SubElement(self.doc.getroot(), 'g', {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): self.textMovements}) + self.layers[0] = inkex.etree.SubElement(self.doc.getroot(), 'g', {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): self.textMovements, 'id': self.textMovements}) # parse paths hpglData = self.hpglString.split(';') if len(hpglData) < 3: @@ -101,7 +102,7 @@ class hpglDecoder: self.layers[layerNumber] except KeyError: self.layers[layerNumber] = inkex.etree.SubElement(self.doc.getroot(), 'g', - {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): self.textPenNumber + layerNumber}) + {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): self.textPenNumber + layerNumber, 'id': self.textPenNumber + layerNumber}) def addPathToLayer(self, path, layerNumber): lineColor = '000000' diff --git a/share/extensions/hpgl_input.py b/share/extensions/hpgl_input.py index d85a5edd6..a85c32b34 100644 --- a/share/extensions/hpgl_input.py +++ b/share/extensions/hpgl_input.py @@ -36,8 +36,8 @@ parser.add_option('--showMovements', action='store', type='inkbool', dest='showM (options, args) = parser.parse_args(inkex.sys.argv[1:]) # needed to initialize the document -options.docWidth = 210.0 * 3.5433070866 # 210mm to pixels (DIN A4) -options.docHeight = 297.0 * 3.5433070866 # 297mm to pixels (DIN A4) +options.docWidth = 210.0 # 210mm (DIN A4) +options.docHeight = 297.0 # 297mm (DIN A4) # read file fobj = open(args[0], 'r') -- cgit v1.2.3 From 1fb28d6c7a8d030542ab5bcdf6ed6228356e213d Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sun, 11 May 2014 16:04:42 +0200 Subject: i18n. Fix for bug #1318345 (untranslatable strings in trunk-r13348). Fixed bugs: - https://launchpad.net/bugs/1318345 (bzr r13352) --- share/extensions/guides_creator.inx | 189 ++++++++++++++++++------------------ 1 file changed, 94 insertions(+), 95 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/guides_creator.inx b/share/extensions/guides_creator.inx index ddc706097..4d032e024 100644 --- a/share/extensions/guides_creator.inx +++ b/share/extensions/guides_creator.inx @@ -1,97 +1,96 @@ - - <_name>Guides creator - org.inkscape.effect.guidescreator - guides_creator.py - inkex.py - - - - Custom... - Golden ratio - Rule-of-third - - 2 - 3 - false - false - - - false - false - false - false - false - - - - Custom... - Left book page - Right book page - - - 1/10 - 1/9 - 1/8 - 1/7 - 1/6 - 1/5 - 1/4 - 1/3 - 1/2 - None - - - 1/10 - 1/9 - 1/8 - 1/7 - 1/6 - 1/5 - 1/4 - 1/3 - 1/2 - None - - - 1/10 - 1/9 - 1/8 - 1/7 - 1/6 - 1/5 - 1/4 - 1/3 - 1/2 - None - - - 1/10 - 1/9 - 1/8 - 1/7 - 1/6 - 1/5 - 1/4 - 1/3 - 1/2 - None - - - 2 - 3 - false - false - - - - - all - - - - - + + + <_name>Guides creator + org.inkscape.effect.guidescreator + guides_creator.py + inkex.py + + + + <_item value="custom">Custom... + <_item value="golden">Golden ratio + <_item value="3;3">Rule-of-third + + 2 + 3 + false + false + + + false + false + false + false + false + + + + <_item value="custom">Custom... + <_item value="book_left">Left book page + <_item value="book_right">Right book page + + + 1/10 + 1/9 + 1/8 + 1/7 + 1/6 + 1/5 + 1/4 + 1/3 + 1/2 + <_item value="0">None + + + 1/10 + 1/9 + 1/8 + 1/7 + 1/6 + 1/5 + 1/4 + 1/3 + 1/2 + <_item value="0">None + + + 1/10 + 1/9 + 1/8 + 1/7 + 1/6 + 1/5 + 1/4 + 1/3 + 1/2 + <_item value="0">None + + + 1/10 + 1/9 + 1/8 + 1/7 + 1/6 + 1/5 + 1/4 + 1/3 + 1/2 + <_item value="0">None + + 2 + 3 + false + false + + + + all + + + + + -- cgit v1.2.3 From 50e519370436ce42e8a068c52126f32478c2509f Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Mon, 12 May 2014 18:42:26 +0200 Subject: Fix for Bug #1318671 (url for New in This Version is obsolete) by Masato HASHIMOTO. Fixed bugs: - https://launchpad.net/bugs/1318671 (bzr r13359) --- share/extensions/inkscape_help_relnotes.inx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'share/extensions') diff --git a/share/extensions/inkscape_help_relnotes.inx b/share/extensions/inkscape_help_relnotes.inx index 9f59513ba..d032eb7e0 100644 --- a/share/extensions/inkscape_help_relnotes.inx +++ b/share/extensions/inkscape_help_relnotes.inx @@ -4,7 +4,7 @@ org.inkscape.help.relnotes launch_webbrowser.py - <_param name="url" gui-hidden="true" type="string">http://wiki.inkscape.org/wiki/index.php/Release_notes/0.49 + <_param name="url" gui-hidden="true" type="string">http://wiki.inkscape.org/wiki/index.php/Release_notes/0.91 all -- cgit v1.2.3 From c80ae1e4b6ac7faddda3a6a5d128d0a4e27bdb95 Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Sun, 2 Nov 2014 11:54:52 -0500 Subject: update Python extensions from 90 to 96 dpi. (bzr r13659) --- share/extensions/dxf_input.inx | 2 +- share/extensions/dxf_input.py | 8 ++++---- share/extensions/dxf_outlines.inx | 16 ++++++++-------- share/extensions/dxf_outlines.py | 4 ++-- share/extensions/gimp_xcf.inx | 2 +- share/extensions/gimp_xcf.py | 2 +- share/extensions/layout_nup.inx | 4 ++-- share/extensions/layout_nup_pageframe.py | 2 +- share/extensions/perfectboundcover.py | 2 +- share/extensions/print_win32_vector.py | 2 +- share/extensions/svg2fxg.xsl | 12 ++++++------ share/extensions/svg2xaml.xsl | 12 ++++++------ share/extensions/synfig_prepare.py | 10 +++++----- share/extensions/test/svg/default-inkscape-SVG.svg | 4 ++-- share/extensions/test/svg/default-plain-SVG.svg | 4 ++-- share/extensions/test/svg/empty-SVG.svg | 4 ++-- share/extensions/webslicer_create_rect.inx | 2 +- 17 files changed, 46 insertions(+), 46 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/dxf_input.inx b/share/extensions/dxf_input.inx index 0ba38252a..d51a07c39 100644 --- a/share/extensions/dxf_input.inx +++ b/share/extensions/dxf_input.inx @@ -23,7 +23,7 @@ <_param name="inputhelp" type="description" xml:space="preserve">- AutoCAD Release 13 and newer. - assume dxf drawing is in mm. -- assume svg drawing is in pixels, at 90 dpi. +- assume svg drawing is in pixels, at 96 dpi. - scale factor and origin apply only to manual scaling. - layers are preserved only on File->Open, not Import. - limited support for BLOCKS, use AutoCAD Explode Blocks instead, if needed. diff --git a/share/extensions/dxf_input.py b/share/extensions/dxf_input.py index 7ca176c92..972895cb8 100755 --- a/share/extensions/dxf_input.py +++ b/share/extensions/dxf_input.py @@ -354,7 +354,7 @@ parser.add_option("--font", action="store", type="string", dest="font", default= parser.add_option("--tab", action="store", type="string", dest="tab", default="Options") parser.add_option("--inputhelp", action="store", type="string", dest="inputhelp", default="") (options, args) = parser.parse_args(inkex.sys.argv[1:]) -doc = inkex.etree.parse(StringIO('' % (210*90/25.4, 297*90/25.4))) +doc = inkex.etree.parse(StringIO('' % (210*96/25.4, 297*96/25.4))) desc = inkex.etree.SubElement(doc.getroot(), 'desc', {}) defs = inkex.etree.SubElement(doc.getroot(), 'defs', {}) marker = inkex.etree.SubElement(defs, 'marker', {'id': 'DistanceX', 'orient': 'auto', 'refX': '0.0', 'refY': '0.0', 'style': 'overflow:visible'}) @@ -365,7 +365,7 @@ inkex.etree.SubElement(pattern, 'path', {'d': 'M6 2 l-4,4', 'stroke': '#000000', inkex.etree.SubElement(pattern, 'path', {'d': 'M4 0 l-4,4', 'stroke': '#000000', 'stroke-width': '0.25', 'linecap': 'square'}) stream = open(args[0], 'r') xmax = xmin = ymin = 0.0 -height = 297.0*90.0/25.4 # default A4 height in pixels +height = 297.0*96.0/25.4 # default A4 height in pixels line = get_line() polylines = 0 flag = 0 # (0, 1, 2, 3) = (none, LAYER, LTYPE, DIMTXT) @@ -415,7 +415,7 @@ else: xmin = float(options.xmin) ymin = float(options.ymin) desc.text = '%s - scale = %f, origin = (%f, %f), auto = %s' % (unicode(args[0], options.input_encode), scale, xmin, ymin, options.auto) -scale *= 90.0/25.4 # convert from mm to pixels +scale *= 96.0/25.4 # convert from mm to pixels if not layer_nodes.has_key('0'): attribs = {inkex.addNS('groupmode','inkscape'): 'layer', inkex.addNS('label','inkscape'): '0'} @@ -487,7 +487,7 @@ while line[0] and (line[1] != 'ENDSEC' or not inENTITIES): w = 0.5 # default lineweight for POINT if vals[groups['370']]: # Common Lineweight if vals[groups['370']][0] > 0: - w = 90.0/25.4*vals[groups['370']][0]/100.0 + w = 96.0/25.4*vals[groups['370']][0]/100.0 if w < 0.5: w = 0.5 style = simplestyle.formatStyle({'stroke': '%s' % color, 'fill': 'none', 'stroke-width': '%.1f' % w}) diff --git a/share/extensions/dxf_outlines.inx b/share/extensions/dxf_outlines.inx index ad3aef17f..c6f71d269 100644 --- a/share/extensions/dxf_outlines.inx +++ b/share/extensions/dxf_outlines.inx @@ -10,14 +10,14 @@ false true - <_item value="72./90">pt - <_item value="1./15">pc + <_item value="72./96">pt + <_item value="1./16">pc <_item value="1.">px - <_item value="25.4/90">mm - <_item value="2.54/90">cm - <_item value=".0254/90">m - <_item value="1./90">in - <_item value="1./1080">ft + <_item value="25.4/96">mm + <_item value="2.54/96">cm + <_item value=".0254/96">m + <_item value="1./96">in + <_item value="1./1152">ft <_item value="latin_1">Latin 1 @@ -34,7 +34,7 @@ <_param name="inputhelp" type="description" xml:space="preserve">- AutoCAD Release 14 DXF format. -- The base unit parameter specifies in what unit the coordinates are output (90 px = 1 in). +- The base unit parameter specifies in what unit the coordinates are output (96 px = 1 in). - Supported element types - paths (lines and splines) - rectangles diff --git a/share/extensions/dxf_outlines.py b/share/extensions/dxf_outlines.py index f5cf37aff..f7e57c32e 100755 --- a/share/extensions/dxf_outlines.py +++ b/share/extensions/dxf_outlines.py @@ -76,7 +76,7 @@ class MyEffect(inkex.Effect): default=True) self.OptionParser.add_option("--units", action="store", type="string", dest="units", - default="72./90") # Points + default="72./96") # Points self.OptionParser.add_option("--encoding", action="store", type="string", dest="char_encode", default="latin_1") @@ -324,7 +324,7 @@ class MyEffect(inkex.Effect): scale = eval(self.options.units) if not scale: - scale = 25.4/90 # if no scale is specified, assume inch as baseunit + scale = 25.4/96 # if no scale is specified, assume inch as baseunit h = self.unittouu(self.document.getroot().xpath('@height', namespaces=inkex.NSS)[0]) self.groupmat = [[[scale, 0.0, 0.0], [0.0, -scale, h*scale]]] doc = self.document.getroot() diff --git a/share/extensions/gimp_xcf.inx b/share/extensions/gimp_xcf.inx index 10bcef627..30406b62d 100644 --- a/share/extensions/gimp_xcf.inx +++ b/share/extensions/gimp_xcf.inx @@ -11,7 +11,7 @@ false false false - 90 + 96 <_param name="instructions" type="description" xml:space="preserve">This extension exports the document to Gimp XCF format according to the following options: diff --git a/share/extensions/gimp_xcf.py b/share/extensions/gimp_xcf.py index c2a8cb274..11c9d041f 100755 --- a/share/extensions/gimp_xcf.py +++ b/share/extensions/gimp_xcf.py @@ -63,7 +63,7 @@ class MyEffect(inkex.Effect): help="Add background color to each layer") self.OptionParser.add_option("-i", "--dpi", action="store", type="string", - dest="resolution", default="90", + dest="resolution", default="96", help="File resolution") def output(self): diff --git a/share/extensions/layout_nup.inx b/share/extensions/layout_nup.inx index bdf650722..2b7734fc3 100644 --- a/share/extensions/layout_nup.inx +++ b/share/extensions/layout_nup.inx @@ -15,8 +15,8 @@ cm mm - 765 - 990 + 816 + 1056 <_param name="pgMargin" type="description" appearance="header">Page margins 0 0 diff --git a/share/extensions/layout_nup_pageframe.py b/share/extensions/layout_nup_pageframe.py index 59da1f4bb..471a75dd3 100755 --- a/share/extensions/layout_nup_pageframe.py +++ b/share/extensions/layout_nup_pageframe.py @@ -38,7 +38,7 @@ def expandTuple(unit, x, length = 4): #@-node:tbrown.20070622103716.1:expandTuple #@+node:tbrown.20070622103716.2:GenerateNup def GenerateNup(unit="px", - pgSize=("8.5*90","11*90"), + pgSize=("8.5*96","11*96"), pgMargin=(0,0), pgPadding=(0,0), num=(2,2), diff --git a/share/extensions/perfectboundcover.py b/share/extensions/perfectboundcover.py index 6cdab7eab..9f81dbb36 100755 --- a/share/extensions/perfectboundcover.py +++ b/share/extensions/perfectboundcover.py @@ -135,7 +135,7 @@ class PerfectBoundCover(inkex.Effect): for guide in guides: newguide = inkex.etree.Element(inkex.addNS('guide','sodipodi')) newguide.set("orientation", guide[0]) - newguide.set("position", "%f" % (guide[1] * 90)) + newguide.set("position", "%f" % (guide[1] * 96)) namedview[0].append(newguide) ''' diff --git a/share/extensions/print_win32_vector.py b/share/extensions/print_win32_vector.py index ca166d25a..37c2021ac 100644 --- a/share/extensions/print_win32_vector.py +++ b/share/extensions/print_win32_vector.py @@ -199,7 +199,7 @@ class MyEffect(inkex.Effect): if mygdi.StartDocA(self.hDC, byref(docInfo)) < 0: exit() # user clicked Cancel - self.scale = (ord(pDevMode[58]) + 256.0*ord(pDevMode[59]))/90 # use PrintQuality from DEVMODE + self.scale = (ord(pDevMode[58]) + 256.0*ord(pDevMode[59]))/96 # use PrintQuality from DEVMODE self.groupmat = [[[self.scale, 0.0, 0.0], [0.0, self.scale, 0.0]]] doc = self.document.getroot() self.process_group(doc) diff --git a/share/extensions/svg2fxg.xsl b/share/extensions/svg2fxg.xsl index db9f61f22..3853b4d7b 100755 --- a/share/extensions/svg2fxg.xsl +++ b/share/extensions/svg2fxg.xsl @@ -832,22 +832,22 @@ extension-element-prefixes="math"> - + - + - + - + - + - + diff --git a/share/extensions/svg2xaml.xsl b/share/extensions/svg2xaml.xsl index 040e6bcb2..fa785fa4f 100755 --- a/share/extensions/svg2xaml.xsl +++ b/share/extensions/svg2xaml.xsl @@ -854,22 +854,22 @@ exclude-result-prefixes="rdf xlink xs exsl libxslt"> - + - + - + - + - + - + diff --git a/share/extensions/synfig_prepare.py b/share/extensions/synfig_prepare.py index e06efde9b..c6ad48c97 100755 --- a/share/extensions/synfig_prepare.py +++ b/share/extensions/synfig_prepare.py @@ -457,17 +457,17 @@ def get_dimension(s="1024"): elif s[-2:] == "px": return float(s[:-2]) elif s[-2:] == "pt": - return float(s[:-2])*1.25 + return float(s[:-2])*1.333 elif s[-2:] == "em": return float(s[:-2])*16 elif s[-2:] == "mm": - return float(s[:-2])*3.54 + return float(s[:-2])*3.779 elif s[-2:] == "pc": - return float(s[:-2])*15 + return float(s[:-2])*16 elif s[-2:] == "cm": - return float(s[:-2])*35.43 + return float(s[:-2])*37.79 elif s[-2:] == "in": - return float(s[:-2])*90 + return float(s[:-2])*96 else: return 1024 diff --git a/share/extensions/test/svg/default-inkscape-SVG.svg b/share/extensions/test/svg/default-inkscape-SVG.svg index a6a610fdb..259e13c0d 100644 --- a/share/extensions/test/svg/default-inkscape-SVG.svg +++ b/share/extensions/test/svg/default-inkscape-SVG.svg @@ -8,8 +8,8 @@ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://web.resource.org/cc/" xmlns:dc="http://purl.org/dc/elements/1.1/" - width="744.09448819" - height="1052.3622047"> + width="793.7007874" + height="1122.519685"> + width="793.7007874" + height="1122.519685"> + width="793.7007874" + height="1122.519685"> diff --git a/share/extensions/webslicer_create_rect.inx b/share/extensions/webslicer_create_rect.inx index 5b3b447e9..85578e24e 100644 --- a/share/extensions/webslicer_create_rect.inx +++ b/share/extensions/webslicer_create_rect.inx @@ -11,7 +11,7 @@ JPG GIF - 90 + 96 Force Dimension must be set as <width>x<height> -- cgit v1.2.3 From 42eb288d19390918f05c6f0754e45d25f9881a19 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Wed, 5 Nov 2014 22:06:17 +0100 Subject: Fixing typos found by Firas Hanife. (bzr r13673) --- share/extensions/dimension.inx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'share/extensions') diff --git a/share/extensions/dimension.inx b/share/extensions/dimension.inx index 343ad27bf..d89e5afa4 100644 --- a/share/extensions/dimension.inx +++ b/share/extensions/dimension.inx @@ -7,7 +7,7 @@ pathmodifier.py 50 50 - + <_item value="geometric">Geometric <_item value="visual">Visual -- cgit v1.2.3 From 1974d9f76ad669ef5fb457a25beecde57100d8b0 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 8 Nov 2014 04:41:49 +0100 Subject: This extension is a DPI switcher from 90 to 96 and from 96 to 90. (bzr r13677) --- share/extensions/dpiswitcher.inx | 21 +++++++ share/extensions/dpiswitcher.py | 128 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 share/extensions/dpiswitcher.inx create mode 100644 share/extensions/dpiswitcher.py (limited to 'share/extensions') diff --git a/share/extensions/dpiswitcher.inx b/share/extensions/dpiswitcher.inx new file mode 100644 index 000000000..5978f1e2c --- /dev/null +++ b/share/extensions/dpiswitcher.inx @@ -0,0 +1,21 @@ + + + <_name>DPI Switcher + org.inkscape.dpiswitcher + dpiswitcher.py + inkex.py + + <_item>DPI Switch from 90 to 96 + <_item>DPI Switch from 96 to 90 + + + all + + + + + + diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py new file mode 100644 index 000000000..6c8bcca66 --- /dev/null +++ b/share/extensions/dpiswitcher.py @@ -0,0 +1,128 @@ +#!/usr/bin/env python +''' +This extension scale or reduce a document to fit diferent SVG DPI -90/96- + +Copyright (C) 2012 Jabiertxo Arraiza, jabier.arraiza@marker.es + +Version 0.3 - 96 to 90 DPI + +TODO: +Comment Better!!! + +CHANGE LOG +0.1 Start 15/10/2014 + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +''' + +import inkex, sys, re, string +from lxml import etree + +class DPISwitcher(inkex.Effect): + + def __init__(self): + inkex.Effect.__init__(self) + self.OptionParser.add_option("--switcher", action="store", + type="string", dest="switcher", default="DPI Switch from 90 to 96", + help="Select the DPI switch you want") + self.factor = 0.0; + + def scaleRoot(self, svg): + widthNumber = re.sub("[a-zA-Z]", "", svg.get('width')) + heightNumber = re.sub("[a-zA-Z]", "", svg.get('height')) + if svg.get('viewBox'): + widthNumber = svg.get('viewBox').split(" ")[2] + heightNumber = svg.get('viewBox').split(" ")[3] + widthDoc = str(float(widthNumber) * self.factor) + heightDoc = str(float(heightNumber) * self.factor) + if svg.get('height'): + svg.set('height', heightDoc) + if svg.get('width'): + svg.set('width', widthDoc) + svg.set('viewBox',"0 0 " + widthDoc + " " + heightDoc) + xpathStr = '//svg:rect | //svg:image | //svg:path | //svg:circle | //svg:ellipse | //svg:text' + elements = svg.xpath(xpathStr, namespaces=inkex.NSS) + for element in elements: + if element.get('transform'): + if "matrix" in str(element.get('transform')): + result = re.sub(r".*?((matrix|MATRIX).*?\))", self.scaleMatrixElement, str(element.get('transform'))) + element.set('transform', result) + if "scale" in str(element.get('transform')): + result = re.sub(r".*?((scale|SCALE).*?\))", self.scaleElement, str(element.get('transform'))) + element.set('transform', result) + else: + element.set('transform', "scale(" + str(self.factor) + ", " + str(self.factor) + ")") + self.scaleGuides(svg) + self.scaleGrid(svg) + + def scaleGrid(self, svg): + xpathStr = '//inkscape:grid' + grids = svg.xpath(xpathStr, namespaces=inkex.NSS) + for grid in grids: + empspacingNumber = float(grid.get("empspacing")) * self.factor + spacingxNumber = float(grid.get("spacingx").replace("px", "")) * self.factor + spacingyNumber = float(grid.get("spacingy").replace("px", "")) * self.factor + originxNumber = float(grid.get("originx").replace("px", "")) * self.factor + originyNumber = float(grid.get("originy").replace("px", "")) * self.factor + grid.set("empspacing", str(empspacingNumber)) + grid.set("spacingx", str(spacingxNumber) + "px") + grid.set("spacingy", str(spacingyNumber) + "px") + grid.set("originx", str(originxNumber) + "px") + grid.set("originy", str(originyNumber) + "px") + + def scaleGuides(self, svg): + xpathStr = '//sodipodi:guide' + guides = svg.xpath(xpathStr, namespaces=inkex.NSS) + for guide in guides: + point = string.split(guide.get("position"), ",") + guide.set("position", str(float(point[0].strip()) * self.factor) + "," + str(float(point[1].strip()) * self.factor)) + + #a dictionary of unit to user unit conversion factors + __uuconv = {'in':96.0, 'pt':1.33333333333, 'px':1.0, 'mm':3.77952755913, 'cm':37.7952755913, + 'm':3779.52755913, 'km':3779527.55913, 'pc':16.0, 'yd':3456.0 , 'ft':1152.0} + + __uuconvLegazy = {'in':90.0, 'pt':1.25, 'px':1, 'mm':3.5433070866, 'cm':35.433070866, 'm':3543.3070866, + 'km':3543307.0866, 'pc':15.0, 'yd':3240 , 'ft':1080} + + def scaleElement(self, m): + scaleVal = m.group(1).replace("scale","").replace("SCALE","").replace(" ","").replace("(","").replace(")","").split(",") + return "scale(" + str(float(scaleVal[0]) * self.factor) + "," + str(float(scaleVal[1]) * self.factor) + ")" + + def scaleMatrixElement(self, m): + scaleMatrixVal = m.group(1).replace("matrix","").replace("MATRIX","").replace(" ","").replace("(","").replace(")","").split(",") + return "matrix(" + str(float(scaleMatrixVal[0]) * self.factor) + "," + scaleMatrixVal[1] + "," + scaleMatrixVal[2] + "," + str(float(scaleMatrixVal[3]) * self.factor) + "," + scaleMatrixVal[4] + "," + scaleMatrixVal[5] + ")" + + def effect(self): + self.factor = 90.0/96.0 + if self.options.switcher == "DPI Switch from 90 to 96": + self.factor = 96.0/90.0 + saveout = sys.stdout + sys.stdout = sys.stderr + svg = self.document.getroot() + namedview = svg.find(inkex.addNS('namedview', 'sodipodi')) + unit = namedview.get(inkex.addNS('document-units', 'inkscape')) + unitExponent = 0.0; + if unit and unit <> "px": + if self.options.switcher == "DPI Switch from 90 to 96": + unitExponent = 1.0/(self.factor/self.__uuconv[unit]) + else: + unitExponent = 1.0/(self.factor/self.__uuconvLegazy[unit]) + self.factor = self.factor * unitExponent + namedview.set(inkex.addNS('document-units', 'inkscape'), "px") + self.scaleRoot(svg); + sys.stdout = saveout + +effect = DPISwitcher() +effect.affect() -- cgit v1.2.3 From d974312de3bd976e256f00078081fb52a40d309b Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 8 Nov 2014 04:59:43 +0100 Subject: a little retouch to extension dpiswitcher (bzr r13678) --- share/extensions/dpiswitcher.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py index 6c8bcca66..5283fa401 100644 --- a/share/extensions/dpiswitcher.py +++ b/share/extensions/dpiswitcher.py @@ -37,7 +37,7 @@ class DPISwitcher(inkex.Effect): self.OptionParser.add_option("--switcher", action="store", type="string", dest="switcher", default="DPI Switch from 90 to 96", help="Select the DPI switch you want") - self.factor = 0.0; + self.factor = 90.0/96.0 def scaleRoot(self, svg): widthNumber = re.sub("[a-zA-Z]", "", svg.get('width')) @@ -105,7 +105,6 @@ class DPISwitcher(inkex.Effect): return "matrix(" + str(float(scaleMatrixVal[0]) * self.factor) + "," + scaleMatrixVal[1] + "," + scaleMatrixVal[2] + "," + str(float(scaleMatrixVal[3]) * self.factor) + "," + scaleMatrixVal[4] + "," + scaleMatrixVal[5] + ")" def effect(self): - self.factor = 90.0/96.0 if self.options.switcher == "DPI Switch from 90 to 96": self.factor = 96.0/90.0 saveout = sys.stdout -- cgit v1.2.3 From d26272b598909a0bb54ad8844c08dab28abd5d48 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 8 Nov 2014 16:59:04 +0100 Subject: This fix a bug https://bugs.launchpad.net/inkscape/+bug/1389723 on comment #15 by Alvin Penner. (bzr r13680) --- share/extensions/dpiswitcher.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py index 5283fa401..1183e7482 100644 --- a/share/extensions/dpiswitcher.py +++ b/share/extensions/dpiswitcher.py @@ -38,6 +38,7 @@ class DPISwitcher(inkex.Effect): type="string", dest="switcher", default="DPI Switch from 90 to 96", help="Select the DPI switch you want") self.factor = 90.0/96.0 + self.unitExponent = 0.0; def scaleRoot(self, svg): widthNumber = re.sub("[a-zA-Z]", "", svg.get('width')) @@ -45,8 +46,9 @@ class DPISwitcher(inkex.Effect): if svg.get('viewBox'): widthNumber = svg.get('viewBox').split(" ")[2] heightNumber = svg.get('viewBox').split(" ")[3] - widthDoc = str(float(widthNumber) * self.factor) - heightDoc = str(float(heightNumber) * self.factor) + widthDoc = str(float(widthNumber) * self.factor * self.unitExponent) + print self.factor + heightDoc = str(float(heightNumber) * self.factor * self.unitExponent) if svg.get('height'): svg.set('height', heightDoc) if svg.get('width'): @@ -112,13 +114,11 @@ class DPISwitcher(inkex.Effect): svg = self.document.getroot() namedview = svg.find(inkex.addNS('namedview', 'sodipodi')) unit = namedview.get(inkex.addNS('document-units', 'inkscape')) - unitExponent = 0.0; if unit and unit <> "px": if self.options.switcher == "DPI Switch from 90 to 96": - unitExponent = 1.0/(self.factor/self.__uuconv[unit]) + self.unitExponent = 1.0/(self.factor/self.__uuconv[unit]) else: - unitExponent = 1.0/(self.factor/self.__uuconvLegazy[unit]) - self.factor = self.factor * unitExponent + self.unitExponent = 1.0/(self.factor/self.__uuconvLegazy[unit]) namedview.set(inkex.addNS('document-units', 'inkscape'), "px") self.scaleRoot(svg); sys.stdout = saveout -- cgit v1.2.3 From 68d171d343fdc5a84ad520edffdd8fccc74efb1a Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sat, 8 Nov 2014 21:46:10 +0100 Subject: Fix a bug pointed by su_v in IRC aboutr shapes (bzr r13682) --- share/extensions/dpiswitcher.inx | 4 +-- share/extensions/dpiswitcher.py | 59 +++++++++++++++++++++++++++------------- 2 files changed, 42 insertions(+), 21 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/dpiswitcher.inx b/share/extensions/dpiswitcher.inx index 5978f1e2c..145fd9357 100644 --- a/share/extensions/dpiswitcher.inx +++ b/share/extensions/dpiswitcher.inx @@ -6,8 +6,8 @@ dpiswitcher.py inkex.py - <_item>DPI Switch from 90 to 96 - <_item>DPI Switch from 96 to 90 + <_item value="0">DPI Switch from 90 to 96 + <_item value="1">DPI Switch from 96 to 90 all diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py index 1183e7482..b4630ae4c 100644 --- a/share/extensions/dpiswitcher.py +++ b/share/extensions/dpiswitcher.py @@ -4,14 +4,11 @@ This extension scale or reduce a document to fit diferent SVG DPI -90/96- Copyright (C) 2012 Jabiertxo Arraiza, jabier.arraiza@marker.es -Version 0.3 - 96 to 90 DPI +Version 0.4 - DPI Switcher TODO: Comment Better!!! -CHANGE LOG -0.1 Start 15/10/2014 - This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or @@ -35,10 +32,10 @@ class DPISwitcher(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) self.OptionParser.add_option("--switcher", action="store", - type="string", dest="switcher", default="DPI Switch from 90 to 96", + type="string", dest="switcher", default="0", help="Select the DPI switch you want") self.factor = 90.0/96.0 - self.unitExponent = 0.0; + self.unit = "px" def scaleRoot(self, svg): widthNumber = re.sub("[a-zA-Z]", "", svg.get('width')) @@ -46,9 +43,8 @@ class DPISwitcher(inkex.Effect): if svg.get('viewBox'): widthNumber = svg.get('viewBox').split(" ")[2] heightNumber = svg.get('viewBox').split(" ")[3] - widthDoc = str(float(widthNumber) * self.factor * self.unitExponent) - print self.factor - heightDoc = str(float(heightNumber) * self.factor * self.unitExponent) + widthDoc = str(float(widthNumber) * self.factor) + heightDoc = str(float(heightNumber) * self.factor) if svg.get('height'): svg.set('height', heightDoc) if svg.get('width'): @@ -57,15 +53,30 @@ class DPISwitcher(inkex.Effect): xpathStr = '//svg:rect | //svg:image | //svg:path | //svg:circle | //svg:ellipse | //svg:text' elements = svg.xpath(xpathStr, namespaces=inkex.NSS) for element in elements: + box3DSide = element.get(inkex.addNS('box3dsidetype', 'inkscape')) + if box3DSide: + continue if element.get('transform'): if "matrix" in str(element.get('transform')): - result = re.sub(r".*?((matrix|MATRIX).*?\))", self.scaleMatrixElement, str(element.get('transform'))) + result = re.sub(r".*?((matrix).*?\))", self.scaleMatrixElement, str(element.get('transform'))) element.set('transform', result) if "scale" in str(element.get('transform')): - result = re.sub(r".*?((scale|SCALE).*?\))", self.scaleElement, str(element.get('transform'))) + result = re.sub(r".*?((scale).*?\))", self.scaleElement, str(element.get('transform'))) element.set('transform', result) + if "scale" not in str(element.get('transform')) and "matrix" not in str(element.get('transform')): + element.set('transform', str(element.get('transform')) + "scale(" + str(self.factor) + ", " + str(self.factor) + ")") else: element.set('transform', "scale(" + str(self.factor) + ", " + str(self.factor) + ")") + xpathStr = '//svg:g' + elements = svg.xpath(xpathStr, namespaces=inkex.NSS) + for element in elements: + if element.get('transform'): + if "matrix" in str(element.get('transform')): + result = re.sub(r".*?((matrix).*?\))", self.translateMatrixElement, str(element.get('transform'))) + element.set('transform', result) + if "translate" in str(element.get('transform')): + result = re.sub(r".*?((translate).*?\))", self.translateElement, str(element.get('transform'))) + element.set('transform', result) self.scaleGuides(svg) self.scaleGrid(svg) @@ -99,27 +110,37 @@ class DPISwitcher(inkex.Effect): 'km':3543307.0866, 'pc':15.0, 'yd':3240 , 'ft':1080} def scaleElement(self, m): - scaleVal = m.group(1).replace("scale","").replace("SCALE","").replace(" ","").replace("(","").replace(")","").split(",") + scaleVal = m.group(1).replace("scale","").replace(" ","").replace("(","").replace(")","").split(",") return "scale(" + str(float(scaleVal[0]) * self.factor) + "," + str(float(scaleVal[1]) * self.factor) + ")" def scaleMatrixElement(self, m): - scaleMatrixVal = m.group(1).replace("matrix","").replace("MATRIX","").replace(" ","").replace("(","").replace(")","").split(",") + scaleMatrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","").split(",") return "matrix(" + str(float(scaleMatrixVal[0]) * self.factor) + "," + scaleMatrixVal[1] + "," + scaleMatrixVal[2] + "," + str(float(scaleMatrixVal[3]) * self.factor) + "," + scaleMatrixVal[4] + "," + scaleMatrixVal[5] + ")" + def translateElement(self, m): + translateVal = m.group(1).replace("translate","").replace(" ","").replace("(","").replace(")","").split(",") + return "translate(" + str(float(translateVal[0]) * self.factor) + "," + str(float(translateVal[1]) * self.factor) + ")" + + def translateMatrixElement(self, m): + translateMatrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","").split(",") + return "matrix(" + translateMatrixVal[0] + "," + translateMatrixVal[1] + "," + translateMatrixVal[2] + "," + translateMatrixVal[3] + "," + str(float(translateMatrixVal[4]) * self.factor) + "," + str(float(translateMatrixVal[5]) * self.factor) + ")" + def effect(self): - if self.options.switcher == "DPI Switch from 90 to 96": + if self.options.switcher == "0": self.factor = 96.0/90.0 saveout = sys.stdout sys.stdout = sys.stderr svg = self.document.getroot() namedview = svg.find(inkex.addNS('namedview', 'sodipodi')) - unit = namedview.get(inkex.addNS('document-units', 'inkscape')) - if unit and unit <> "px": - if self.options.switcher == "DPI Switch from 90 to 96": - self.unitExponent = 1.0/(self.factor/self.__uuconv[unit]) + self.unit = namedview.get(inkex.addNS('document-units', 'inkscape')) + if self.unit and self.unit <> "px": + unitExponent = 0.0 + if self.options.switcher == "0": + unitExponent = 1.0/(self.factor/self.__uuconv[self.unit]) else: - self.unitExponent = 1.0/(self.factor/self.__uuconvLegazy[unit]) + unitExponent = 1.0/(self.factor/self.__uuconvLegazy[self.unit]) namedview.set(inkex.addNS('document-units', 'inkscape'), "px") + self.factor = self.factor * unitExponent self.scaleRoot(svg); sys.stdout = saveout -- cgit v1.2.3 From 0549127f3066a1451b7f0b5496e294ffd6761aad Mon Sep 17 00:00:00 2001 From: Alvin Penner Date: Sun, 9 Nov 2014 14:06:26 -0500 Subject: add option to read dxf input scale from file (Bug 1388851) Fixed bugs: - https://launchpad.net/bugs/1388851 (bzr r13692) --- share/extensions/dxf_input.inx | 12 +++++++++--- share/extensions/dxf_input.py | 16 ++++++++++++---- 2 files changed, 21 insertions(+), 7 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/dxf_input.inx b/share/extensions/dxf_input.inx index d51a07c39..4488774a3 100644 --- a/share/extensions/dxf_input.inx +++ b/share/extensions/dxf_input.inx @@ -6,8 +6,12 @@ inkex.py - true - 1.0 + + + + + + 1.0 0.0 0.0 false @@ -22,9 +26,11 @@ <_param name="inputhelp" type="description" xml:space="preserve">- AutoCAD Release 13 and newer. -- assume dxf drawing is in mm. +- for manual scaling, assume dxf drawing is in mm. - assume svg drawing is in pixels, at 96 dpi. - scale factor and origin apply only to manual scaling. +- 'Automatic scaling' will fit the width of an A4 page. +- 'Read from file' uses the variable $MEASUREMENT. - layers are preserved only on File->Open, not Import. - limited support for BLOCKS, use AutoCAD Explode Blocks instead, if needed. diff --git a/share/extensions/dxf_input.py b/share/extensions/dxf_input.py index 972895cb8..f0a1296f1 100755 --- a/share/extensions/dxf_input.py +++ b/share/extensions/dxf_input.py @@ -344,7 +344,7 @@ colors = { 1: '#FF0000', 2: '#FFFF00', 3: '#00FF00', 4: '#00FFFF', 5: ' 250: '#333333', 251: '#505050', 252: '#696969', 253: '#828282', 254: '#BEBEBE', 255: '#FFFFFF'} parser = inkex.optparse.OptionParser(usage="usage: %prog [options] SVGfile", option_class=inkex.InkOption) -parser.add_option("--auto", action="store", type="inkbool", dest="auto", default=True) +parser.add_option("--scalemethod", action="store", type="string", dest="scalemethod", default="manual") parser.add_option("--scale", action="store", type="string", dest="scale", default="1.0") parser.add_option("--xmin", action="store", type="string", dest="xmin", default="0.0") parser.add_option("--ymin", action="store", type="string", dest="ymin", default="0.0") @@ -366,6 +366,7 @@ inkex.etree.SubElement(pattern, 'path', {'d': 'M4 0 l-4,4', 'stroke': '#000000', stream = open(args[0], 'r') xmax = xmin = ymin = 0.0 height = 297.0*96.0/25.4 # default A4 height in pixels +measurement = 0 # default inches line = get_line() polylines = 0 flag = 0 # (0, 1, 2, 3) = (none, LAYER, LTYPE, DIMTXT) @@ -376,7 +377,10 @@ DIMTXT = {} # store DIMENSION text sizes while line[0] and line[1] != 'BLOCKS': line = get_line() - if options.auto: + if options.scalemethod == 'file': + if line[1] == '$MEASUREMENT': + measurement = get_group('70') + elif options.scalemethod == 'auto': if line[1] == '$EXTMIN': xmin = get_group('10') ymin = get_group('20') @@ -406,7 +410,11 @@ while line[0] and line[1] != 'BLOCKS': if line[0] == '0' and line[1] == 'ENDTAB': flag = 0 -if options.auto: +if options.scalemethod == 'file': + scale = 25.4 # default inches + if measurement == 1.0: + scale = 1.0 # use mm +elif options.scalemethod == 'auto': scale = 1.0 if xmax > xmin: scale = 210.0/(xmax - xmin) # scale to A4 width @@ -414,7 +422,7 @@ else: scale = float(options.scale) # manual scale factor xmin = float(options.xmin) ymin = float(options.ymin) -desc.text = '%s - scale = %f, origin = (%f, %f), auto = %s' % (unicode(args[0], options.input_encode), scale, xmin, ymin, options.auto) +desc.text = '%s - scale = %f, origin = (%f, %f), method = %s' % (unicode(args[0], options.input_encode), scale, xmin, ymin, options.scalemethod) scale *= 96.0/25.4 # convert from mm to pixels if not layer_nodes.has_key('0'): -- cgit v1.2.3 From 3b8481a788dc641039219ba93514794fd2551b20 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sun, 9 Nov 2014 21:23:51 +0100 Subject: From bug #1389723 Roadmap for 0.92: (this bug) ================= TODO Non-pixel units are allowed but everything in a document should use the same units including guides and grids. TODO (Guides and grids need code to do this.) DONE An extension that saves a document in pixels should be added to allow backwards compatability with 0.91. It should be possible to avoid overwriting Inkscape version until any necessary conversion is done. If a conversion appears to be needed, a pop-up can ask the author if it should be done. Roadmap for 0.91: (bug #1387864) ================= TODO: Everything should use only pixels as is (mostly) done in 0.48 (including templates). TODO: The ability to switch document units should be disabled (it's broken in several ways). TODO: Font size should be stored in pixels. DONE: Some templates in 0.48 templates do use 'mm' so there does need to be a script to convert files based on those templates to 96dpi. (bzr r13693) --- share/extensions/dpiswitcher.py | 73 +++++++++++++++++++++++++---------------- 1 file changed, 44 insertions(+), 29 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py index b4630ae4c..d35a46597 100644 --- a/share/extensions/dpiswitcher.py +++ b/share/extensions/dpiswitcher.py @@ -35,7 +35,8 @@ class DPISwitcher(inkex.Effect): type="string", dest="switcher", default="0", help="Select the DPI switch you want") self.factor = 90.0/96.0 - self.unit = "px" + self.units = "px" + self.unitExponent = 1.0 def scaleRoot(self, svg): widthNumber = re.sub("[a-zA-Z]", "", svg.get('width')) @@ -43,13 +44,17 @@ class DPISwitcher(inkex.Effect): if svg.get('viewBox'): widthNumber = svg.get('viewBox').split(" ")[2] heightNumber = svg.get('viewBox').split(" ")[3] - widthDoc = str(float(widthNumber) * self.factor) - heightDoc = str(float(heightNumber) * self.factor) + widthDoc = str(float(widthNumber) * self.factor * self.unitExponent) + heightDoc = str(float(heightNumber) * self.factor * self.unitExponent) if svg.get('height'): svg.set('height', heightDoc) if svg.get('width'): svg.set('width', widthDoc) svg.set('viewBox',"0 0 " + widthDoc + " " + heightDoc) + self.scaleGuides(svg) + self.scaleGrid(svg) + if self.options.switcher == "1": + self.factor = self.factor * self.unitExponent xpathStr = '//svg:rect | //svg:image | //svg:path | //svg:circle | //svg:ellipse | //svg:text' elements = svg.xpath(xpathStr, namespaces=inkex.NSS) for element in elements: @@ -77,30 +82,34 @@ class DPISwitcher(inkex.Effect): if "translate" in str(element.get('transform')): result = re.sub(r".*?((translate).*?\))", self.translateElement, str(element.get('transform'))) element.set('transform', result) - self.scaleGuides(svg) - self.scaleGrid(svg) - - def scaleGrid(self, svg): - xpathStr = '//inkscape:grid' - grids = svg.xpath(xpathStr, namespaces=inkex.NSS) - for grid in grids: - empspacingNumber = float(grid.get("empspacing")) * self.factor - spacingxNumber = float(grid.get("spacingx").replace("px", "")) * self.factor - spacingyNumber = float(grid.get("spacingy").replace("px", "")) * self.factor - originxNumber = float(grid.get("originx").replace("px", "")) * self.factor - originyNumber = float(grid.get("originy").replace("px", "")) * self.factor - grid.set("empspacing", str(empspacingNumber)) - grid.set("spacingx", str(spacingxNumber) + "px") - grid.set("spacingy", str(spacingyNumber) + "px") - grid.set("originx", str(originxNumber) + "px") - grid.set("originy", str(originyNumber) + "px") - + def scaleGuides(self, svg): xpathStr = '//sodipodi:guide' guides = svg.xpath(xpathStr, namespaces=inkex.NSS) for guide in guides: point = string.split(guide.get("position"), ",") - guide.set("position", str(float(point[0].strip()) * self.factor) + "," + str(float(point[1].strip()) * self.factor)) + guide.set("position", str(float(point[0].strip()) * self.factor ) + "," + str(float(point[1].strip()) * self.factor )) + + def scaleGrid(self, svg): + xpathStr = '//inkscape:grid' + grids = svg.xpath(xpathStr, namespaces=inkex.NSS) + for grid in grids: + if self.options.switcher == "0": + self.unitExponent = 1.0/(self.factor/self.__uuconv[grid.get("units")]) + self.factor = self.factor * self.unitExponent + grid.set("units", "px") + if grid.get("spacingx"): + spacingx = str(float(re.sub("[a-zA-Z]", "", grid.get("spacingx"))) * self.factor) + "px" + grid.set("spacingx", str(spacingx)) + if grid.get("spacingy"): + spacingy = str(float(re.sub("[a-zA-Z]", "", grid.get("spacingy"))) * self.factor) + "px" + grid.set("spacingy", str(spacingy)) + if grid.get("originx"): + originx = str(float(re.sub("[a-zA-Z]", "", grid.get("originx"))) * self.factor) + "px" + grid.set("originx", str(originx)) + if grid.get("originy"): + originy = str(float(re.sub("[a-zA-Z]", "", grid.get("originy"))) * self.factor) + "px" + grid.set("originy", str(originy)) #a dictionary of unit to user unit conversion factors __uuconv = {'in':96.0, 'pt':1.33333333333, 'px':1.0, 'mm':3.77952755913, 'cm':37.7952755913, @@ -132,15 +141,21 @@ class DPISwitcher(inkex.Effect): sys.stdout = sys.stderr svg = self.document.getroot() namedview = svg.find(inkex.addNS('namedview', 'sodipodi')) - self.unit = namedview.get(inkex.addNS('document-units', 'inkscape')) - if self.unit and self.unit <> "px": - unitExponent = 0.0 + namedview.set(inkex.addNS('document-units', 'inkscape'), "px") + self.units = re.sub("[0-9]*\.?[0-9]", "", svg.get('width')) + if self.units and self.units <> "px": if self.options.switcher == "0": - unitExponent = 1.0/(self.factor/self.__uuconv[self.unit]) + self.unitExponent = 1.0/(self.factor/self.__uuconv[self.units]) else: - unitExponent = 1.0/(self.factor/self.__uuconvLegazy[self.unit]) - namedview.set(inkex.addNS('document-units', 'inkscape'), "px") - self.factor = self.factor * unitExponent + self.unitExponent = 1.0/(self.factor/self.__uuconvLegazy[self.units]) + ''' + else: + self.scaleGuides(svg) + self.unitExponent = 1.0 + self.scaleGrid(svg) + sys.stdout = saveout + return + ''' self.scaleRoot(svg); sys.stdout = saveout -- cgit v1.2.3 From d973faeac0f9dc8a0b100362ca93c79241b569af Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sun, 9 Nov 2014 22:04:21 +0100 Subject: fixed a bug pointed by su_v about transformations (bzr r13694) --- share/extensions/dpiswitcher.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'share/extensions') diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py index d35a46597..57ca4f731 100644 --- a/share/extensions/dpiswitcher.py +++ b/share/extensions/dpiswitcher.py @@ -68,6 +68,18 @@ class DPISwitcher(inkex.Effect): if "scale" in str(element.get('transform')): result = re.sub(r".*?((scale).*?\))", self.scaleElement, str(element.get('transform'))) element.set('transform', result) + if "matrix" in str(element.get('transform')): + result = re.sub(r".*?((matrix).*?\))", self.translateMatrixElement, str(element.get('transform'))) + element.set('transform', result) + if "translate" in str(element.get('transform')): + result = re.sub(r".*?((translate).*?\))", self.translateElement, str(element.get('transform'))) + element.set('transform', result) + if "matrix" in str(element.get('transform')): + result = re.sub(r".*?((matrix).*?\))", self.skewMatrixElement, str(element.get('transform'))) + element.set('transform', result) + if "skew" in str(element.get('transform')): + result = re.sub(r".*?((translate).*?\))", self.skewElement, str(element.get('transform'))) + element.set('transform', result) if "scale" not in str(element.get('transform')) and "matrix" not in str(element.get('transform')): element.set('transform', str(element.get('transform')) + "scale(" + str(self.factor) + ", " + str(self.factor) + ")") else: @@ -134,6 +146,14 @@ class DPISwitcher(inkex.Effect): translateMatrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","").split(",") return "matrix(" + translateMatrixVal[0] + "," + translateMatrixVal[1] + "," + translateMatrixVal[2] + "," + translateMatrixVal[3] + "," + str(float(translateMatrixVal[4]) * self.factor) + "," + str(float(translateMatrixVal[5]) * self.factor) + ")" + def skewElement(self, m): + skeweVal = m.group(1).replace("skew","").replace(" ","").replace("(","").replace(")","").split(",") + return "skew(" + str(float(skewVal[0]) * self.factor) + "," + str(float(skewVal[1]) * self.factor) + ")" + + def skewMatrixElement(self, m): + skewMatrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","").split(",") + return "matrix(" + skewMatrixVal[0] + "," + str(float(skewMatrixVal[1]) * self.factor) + "," + str(float(skewMatrixVal[4]) * self.factor) + "," + skewMatrixVal[3] + "," + skewMatrixVal[4] + "," + skewMatrixVal[5]+ ")" + def effect(self): if self.options.switcher == "0": self.factor = 96.0/90.0 -- cgit v1.2.3 From 7f6a9bd0980238ee25285bd23b060f6310b04ee4 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sun, 9 Nov 2014 23:04:22 +0100 Subject: Allow shorteners transforms in DPI switcher.A bit of refactor. (bzr r13695) --- share/extensions/dpiswitcher.py | 73 ++++++++++++++++++++++++++--------------- 1 file changed, 46 insertions(+), 27 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py index 57ca4f731..051a72ee1 100644 --- a/share/extensions/dpiswitcher.py +++ b/share/extensions/dpiswitcher.py @@ -63,20 +63,14 @@ class DPISwitcher(inkex.Effect): continue if element.get('transform'): if "matrix" in str(element.get('transform')): - result = re.sub(r".*?((matrix).*?\))", self.scaleMatrixElement, str(element.get('transform'))) + result = re.sub(r".*?((matrix).*?\))", self.matrixElement, str(element.get('transform'))) element.set('transform', result) if "scale" in str(element.get('transform')): result = re.sub(r".*?((scale).*?\))", self.scaleElement, str(element.get('transform'))) element.set('transform', result) - if "matrix" in str(element.get('transform')): - result = re.sub(r".*?((matrix).*?\))", self.translateMatrixElement, str(element.get('transform'))) - element.set('transform', result) if "translate" in str(element.get('transform')): result = re.sub(r".*?((translate).*?\))", self.translateElement, str(element.get('transform'))) element.set('transform', result) - if "matrix" in str(element.get('transform')): - result = re.sub(r".*?((matrix).*?\))", self.skewMatrixElement, str(element.get('transform'))) - element.set('transform', result) if "skew" in str(element.get('transform')): result = re.sub(r".*?((translate).*?\))", self.skewElement, str(element.get('transform'))) element.set('transform', result) @@ -88,12 +82,15 @@ class DPISwitcher(inkex.Effect): elements = svg.xpath(xpathStr, namespaces=inkex.NSS) for element in elements: if element.get('transform'): - if "matrix" in str(element.get('transform')): - result = re.sub(r".*?((matrix).*?\))", self.translateMatrixElement, str(element.get('transform'))) - element.set('transform', result) if "translate" in str(element.get('transform')): result = re.sub(r".*?((translate).*?\))", self.translateElement, str(element.get('transform'))) element.set('transform', result) + if "matrix" in str(element.get('transform')): + result = re.sub(r".*?((matrix).*?\))", self.matrixElementNoScale, str(element.get('transform'))) + element.set('transform', result) + if "skew" in str(element.get('transform')): + result = re.sub(r".*?((translate).*?\))", self.skewElement, str(element.get('transform'))) + element.set('transform', result) def scaleGuides(self, svg): xpathStr = '//sodipodi:guide' @@ -131,28 +128,50 @@ class DPISwitcher(inkex.Effect): 'km':3543307.0866, 'pc':15.0, 'yd':3240 , 'ft':1080} def scaleElement(self, m): - scaleVal = m.group(1).replace("scale","").replace(" ","").replace("(","").replace(")","").split(",") - return "scale(" + str(float(scaleVal[0]) * self.factor) + "," + str(float(scaleVal[1]) * self.factor) + ")" + scaleVal = m.group(1).replace("scale","").replace(" ","").replace("(","").replace(")","") + total = scaleVal.count(',') + if total == 1: + scaleVal = scaleVal.split(",") + return "scale(" + str(float(scaleVal[0]) * self.factor) + "," + str(float(scaleVal[1]) * self.factor) + ")" + else: + return "scale(" + str(float(scaleVal) * self.factor) + ")" - def scaleMatrixElement(self, m): - scaleMatrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","").split(",") - return "matrix(" + str(float(scaleMatrixVal[0]) * self.factor) + "," + scaleMatrixVal[1] + "," + scaleMatrixVal[2] + "," + str(float(scaleMatrixVal[3]) * self.factor) + "," + scaleMatrixVal[4] + "," + scaleMatrixVal[5] + ")" def translateElement(self, m): - translateVal = m.group(1).replace("translate","").replace(" ","").replace("(","").replace(")","").split(",") - return "translate(" + str(float(translateVal[0]) * self.factor) + "," + str(float(translateVal[1]) * self.factor) + ")" - - def translateMatrixElement(self, m): - translateMatrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","").split(",") - return "matrix(" + translateMatrixVal[0] + "," + translateMatrixVal[1] + "," + translateMatrixVal[2] + "," + translateMatrixVal[3] + "," + str(float(translateMatrixVal[4]) * self.factor) + "," + str(float(translateMatrixVal[5]) * self.factor) + ")" + translateVal = m.group(1).replace("translate","").replace(" ","").replace("(","").replace(")","") + total = translateVal.count(',') + if total == 1: + translateVal = translateVal.split(",") + return "translate(" + str(float(translateVal[0]) * self.factor) + "," + str(float(translateVal[1]) * self.factor) + ")" + else: + return "translate(" + str(float(translateVal) * self.factor) + ")" def skewElement(self, m): - skeweVal = m.group(1).replace("skew","").replace(" ","").replace("(","").replace(")","").split(",") - return "skew(" + str(float(skewVal[0]) * self.factor) + "," + str(float(skewVal[1]) * self.factor) + ")" - - def skewMatrixElement(self, m): - skewMatrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","").split(",") - return "matrix(" + skewMatrixVal[0] + "," + str(float(skewMatrixVal[1]) * self.factor) + "," + str(float(skewMatrixVal[4]) * self.factor) + "," + skewMatrixVal[3] + "," + skewMatrixVal[4] + "," + skewMatrixVal[5]+ ")" + skeweVal = m.group(1).replace("skew","").replace(" ","").replace("(","").replace(")","") + total = skewVal.count(',') + if total == 1: + skeweVal = skewVal.split(",") + return "skew(" + str(float(skewVal[0]) * self.factor) + "," + str(float(skewVal[1]) * self.factor) + ")" + else: + return "skew(" + str(float(skewVal) * self.factor) + ")" + + def matrixElement(self, m): + matrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","") + total = matrixVal.count(',') + matrixVal = matrixVal.split(",") + if total > 2: + return "matrix(" + str(float(matrixVal[0]) * self.factor) + "," + str(float(matrixVal[1]) * self.factor) + "," + str(float(matrixVal[2]) * self.factor) + "," + str(float(matrixVal[3]) * self.factor) + "," + str(float(matrixVal[4]) * self.factor) + "," + str(float(matrixVal[5]) * self.factor) + ")" + else: + return "matrix(" + str(float(matrixVal[0]) * self.factor) + "," + str(float(matrixVal[1]) * self.factor) + "," + str(float(matrixVal[2]) * self.factor) + ")" + + def matrixElementNoScale(self, m): + matrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","") + total = matrixVal.count(',') + matrixVal = matrixVal.split(",") + if total > 2: + return "matrix(" + matrixVal[0] + "," + str(float(matrixVal[1]) * self.factor) + "," + matrixVal[2] + "," + str(float(matrixVal[3]) * self.factor) + "," + str(float(matrixVal[4]) * self.factor) + "," + str(float(matrixVal[5]) * self.factor) + ")" + else: + return "matrix(" + matrixVal[0] + "," + str(float(matrixVal[1]) * self.factor) + "," + str(float(matrixVal[2]) * self.factor) + ")" def effect(self): if self.options.switcher == "0": -- cgit v1.2.3 From cd6113d3cc7e7f3468b488ee5fb6c28f9576e3b9 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Sun, 9 Nov 2014 23:51:30 +0100 Subject: improve regex from DPI Switcher (bzr r13696) --- share/extensions/dpiswitcher.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py index 051a72ee1..a1a7a1a52 100644 --- a/share/extensions/dpiswitcher.py +++ b/share/extensions/dpiswitcher.py @@ -63,16 +63,16 @@ class DPISwitcher(inkex.Effect): continue if element.get('transform'): if "matrix" in str(element.get('transform')): - result = re.sub(r".*?((matrix).*?\))", self.matrixElement, str(element.get('transform'))) + result = re.sub(r".*?matrix( \(|\()(.*?)\)", self.matrixElement, str(element.get('transform'))) element.set('transform', result) if "scale" in str(element.get('transform')): - result = re.sub(r".*?((scale).*?\))", self.scaleElement, str(element.get('transform'))) + result = re.sub(r".*?scale( \(|\()(.*?)\)", self.scaleElement, str(element.get('transform'))) element.set('transform', result) if "translate" in str(element.get('transform')): - result = re.sub(r".*?((translate).*?\))", self.translateElement, str(element.get('transform'))) + result = re.sub(r".*?translate( \(|\()(.*?)\)", self.translateElement, str(element.get('transform'))) element.set('transform', result) if "skew" in str(element.get('transform')): - result = re.sub(r".*?((translate).*?\))", self.skewElement, str(element.get('transform'))) + result = re.sub(r".*?skew( \(|\()(.*?)\)", self.skewElement, str(element.get('transform'))) element.set('transform', result) if "scale" not in str(element.get('transform')) and "matrix" not in str(element.get('transform')): element.set('transform', str(element.get('transform')) + "scale(" + str(self.factor) + ", " + str(self.factor) + ")") @@ -82,14 +82,14 @@ class DPISwitcher(inkex.Effect): elements = svg.xpath(xpathStr, namespaces=inkex.NSS) for element in elements: if element.get('transform'): - if "translate" in str(element.get('transform')): - result = re.sub(r".*?((translate).*?\))", self.translateElement, str(element.get('transform'))) - element.set('transform', result) if "matrix" in str(element.get('transform')): - result = re.sub(r".*?((matrix).*?\))", self.matrixElementNoScale, str(element.get('transform'))) + result = re.sub(r".*?matrix( \(|\()(.*?)\)", self.matrixGroupElement, str(element.get('transform'))) + element.set('transform', result) + if "translate" in str(element.get('transform')): + result = re.sub(r".*?translate( \(|\()(.*?)\)", self.translateElement, str(element.get('transform'))) element.set('transform', result) if "skew" in str(element.get('transform')): - result = re.sub(r".*?((translate).*?\))", self.skewElement, str(element.get('transform'))) + result = re.sub(r".*?skew( \(|\()(.*?)\)", self.skewElement, str(element.get('transform'))) element.set('transform', result) def scaleGuides(self, svg): @@ -128,7 +128,7 @@ class DPISwitcher(inkex.Effect): 'km':3543307.0866, 'pc':15.0, 'yd':3240 , 'ft':1080} def scaleElement(self, m): - scaleVal = m.group(1).replace("scale","").replace(" ","").replace("(","").replace(")","") + scaleVal = m.group(2).replace(" ","") total = scaleVal.count(',') if total == 1: scaleVal = scaleVal.split(",") @@ -138,7 +138,7 @@ class DPISwitcher(inkex.Effect): def translateElement(self, m): - translateVal = m.group(1).replace("translate","").replace(" ","").replace("(","").replace(")","") + translateVal = m.group(2).replace(" ","") total = translateVal.count(',') if total == 1: translateVal = translateVal.split(",") @@ -147,7 +147,7 @@ class DPISwitcher(inkex.Effect): return "translate(" + str(float(translateVal) * self.factor) + ")" def skewElement(self, m): - skeweVal = m.group(1).replace("skew","").replace(" ","").replace("(","").replace(")","") + skeweVal = m.group(2).replace(" ","") total = skewVal.count(',') if total == 1: skeweVal = skewVal.split(",") @@ -156,7 +156,7 @@ class DPISwitcher(inkex.Effect): return "skew(" + str(float(skewVal) * self.factor) + ")" def matrixElement(self, m): - matrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","") + matrixVal = m.group(2).replace(" ","") total = matrixVal.count(',') matrixVal = matrixVal.split(",") if total > 2: @@ -164,8 +164,8 @@ class DPISwitcher(inkex.Effect): else: return "matrix(" + str(float(matrixVal[0]) * self.factor) + "," + str(float(matrixVal[1]) * self.factor) + "," + str(float(matrixVal[2]) * self.factor) + ")" - def matrixElementNoScale(self, m): - matrixVal = m.group(1).replace("matrix","").replace(" ","").replace("(","").replace(")","") + def matrixGroupElement(self, m): + matrixVal = m.group(2).replace(" ","") total = matrixVal.count(',') matrixVal = matrixVal.split(",") if total > 2: -- cgit v1.2.3 From a213372bccdad1d36a559e97482f4ce3ddcdc133 Mon Sep 17 00:00:00 2001 From: Jabier Arraiza Cenoz Date: Mon, 10 Nov 2014 21:46:54 +0100 Subject: Add a extra info page pointed by suv in bug page (bzr r13701) --- share/extensions/dpiswitcher.inx | 12 +++++-- share/extensions/dpiswitcher.py | 68 ++++++++++++++++++++++++++++++---------- 2 files changed, 61 insertions(+), 19 deletions(-) (limited to 'share/extensions') diff --git a/share/extensions/dpiswitcher.inx b/share/extensions/dpiswitcher.inx index 145fd9357..a4f487c97 100644 --- a/share/extensions/dpiswitcher.inx +++ b/share/extensions/dpiswitcher.inx @@ -5,10 +5,18 @@ org.inkscape.dpiswitcher dpiswitcher.py inkex.py - + + + <_item value="0">DPI Switch from 90 to 96 <_item value="1">DPI Switch from 96 to 90 - + + + + <_param name="d" type="description">Choose this tab if you would like to see page info previously to apply DPI Switcher. + + + all diff --git a/share/extensions/dpiswitcher.py b/share/extensions/dpiswitcher.py index a1a7a1a52..b110c259f 100644 --- a/share/extensions/dpiswitcher.py +++ b/share/extensions/dpiswitcher.py @@ -34,6 +34,9 @@ class DPISwitcher(inkex.Effect): self.OptionParser.add_option("--switcher", action="store", type="string", dest="switcher", default="0", help="Select the DPI switch you want") + self.OptionParser.add_option("--action", action="store", + type="string", dest="action", + default=None, help="") self.factor = 90.0/96.0 self.units = "px" self.unitExponent = 1.0 @@ -174,28 +177,59 @@ class DPISwitcher(inkex.Effect): return "matrix(" + matrixVal[0] + "," + str(float(matrixVal[1]) * self.factor) + "," + str(float(matrixVal[2]) * self.factor) + ")" def effect(self): - if self.options.switcher == "0": - self.factor = 96.0/90.0 + action = self.options.action.strip("\"") # TODO Is this a bug? (Extra " characters) saveout = sys.stdout sys.stdout = sys.stderr svg = self.document.getroot() - namedview = svg.find(inkex.addNS('namedview', 'sodipodi')) - namedview.set(inkex.addNS('document-units', 'inkscape'), "px") - self.units = re.sub("[0-9]*\.?[0-9]", "", svg.get('width')) - if self.units and self.units <> "px": + if action == "page_info": + print ":::SVG document related info:::" + width = svg.get('width') + if width: + print "width: " + width + height = svg.get('height') + if height: + print "height: " + height + viewBox = svg.get('viewBox') + if viewBox: + print "viewBox: " + viewBox + namedview = svg.find(inkex.addNS('namedview', 'sodipodi')) + docunits= namedview.get(inkex.addNS('document-units', 'inkscape')) + if docunits: + print "document-units: " + docunits + units = namedview.get('units') + if units: + print "units: " + units + xpathStr = '//sodipodi:guide' + guides = svg.xpath(xpathStr, namespaces=inkex.NSS) + xpathStr = '//inkscape:grid' + if guides: + numberGuides = len(guides) + print "Document has " + str(numberGuides) + " guides" + grids = svg.xpath(xpathStr, namespaces=inkex.NSS) + i = 1 + for grid in grids: + print "Grid number " + str(i) + ": Units: " + grid.get("units") + i = i+1 + else: if self.options.switcher == "0": - self.unitExponent = 1.0/(self.factor/self.__uuconv[self.units]) + self.factor = 96.0/90.0 + namedview = svg.find(inkex.addNS('namedview', 'sodipodi')) + namedview.set(inkex.addNS('document-units', 'inkscape'), "px") + self.units = re.sub("[0-9]*\.?[0-9]", "", svg.get('width')) + if self.units and self.units <> "px": + if self.options.switcher == "0": + self.unitExponent = 1.0/(self.factor/self.__uuconv[self.units]) + else: + self.unitExponent = 1.0/(self.factor/self.__uuconvLegazy[self.units]) + ''' else: - self.unitExponent = 1.0/(self.factor/self.__uuconvLegazy[self.units]) - ''' - else: - self.scaleGuides(svg) - self.unitExponent = 1.0 - self.scaleGrid(svg) - sys.stdout = saveout - return - ''' - self.scaleRoot(svg); + self.scaleGuides(svg) + self.unitExponent = 1.0 + self.scaleGrid(svg) + sys.stdout = saveout + return + ''' + self.scaleRoot(svg); sys.stdout = saveout effect = DPISwitcher() -- cgit v1.2.3