X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=share%2Fextensions%2Fsummersnight.py;h=2c08c35c4569c874f3f6e88526da360cdc2d6364;hb=785664a2cf66bbb874bc72d3a3301ff26b1213fd;hp=b94d2b9b7786b33a0f65cdd6277705a0edced162;hpb=41bb1b5239778726ba20b392a70149d07790b41f;p=inkscape.git diff --git a/share/extensions/summersnight.py b/share/extensions/summersnight.py index b94d2b9b7..2c08c35c4 100755 --- a/share/extensions/summersnight.py +++ b/share/extensions/summersnight.py @@ -17,71 +17,82 @@ 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, os, re, simplepath, cubicsuperpath +import inkex, os, simplepath, cubicsuperpath from ffgeom import * - -uuconv = {'in':90.0, 'pt':1.25, 'px':1, 'mm':3.5433070866, 'cm':35.433070866, 'pc':15.0} -def unittouu(string): - unit = re.compile('(%s)$' % '|'.join(uuconv.keys())) - param = re.compile(r'(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)') - - p = param.match(string) - u = unit.search(string) - if p: - retval = float(p.string[p.start():p.end()]) - else: - retval = 0.0 - if u: - try: - return retval * uuconv[u.string[u.start():u.end()]] - except KeyError: - pass - return retval +import gettext +_ = gettext.gettext class Project(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) def effect(self): if len(self.options.ids) < 2: - inkex.debug("Requires two selected paths. The second must be exctly four nodes long.") - exit() - + inkex.errormsg(_("This extension requires two selected paths.") + + " " + + _("The second path must be exactly four nodes long.")) + exit() + #obj is selected second obj = self.selected[self.options.ids[0]] trafo = self.selected[self.options.ids[1]] - if obj.tagName == 'path' and trafo.tagName == 'path': - #distil trafo into four node points - trafo = cubicsuperpath.parsePath(trafo.attributes.getNamedItem('d').value) - trafo = [[Point(csp[1][0],csp[1][1]) for csp in subs] for subs in trafo][0][:4] - - #vectors pointing away from the trafo origin - self.t1 = Segment(trafo[0],trafo[1]) - self.t2 = Segment(trafo[1],trafo[2]) - self.t3 = Segment(trafo[3],trafo[2]) - self.t4 = Segment(trafo[0],trafo[3]) - - #query inkscape about the bounding box of obj - self.q = {'x':0,'y':0,'width':0,'height':0} - file = self.args[-1] - id = self.options.ids[0] - for query in self.q.keys(): - f = os.popen("inkscape --query-%s --query-id=%s %s" % (query,id,file)) - self.q[query] = float(f.read()) - f.close() - #glean document height from the SVG - docheight = unittouu(inkex.xml.xpath.Evaluate('/svg/@height',self.document)[0].value) - #Flip inkscapes transposed renderer coords - self.q['y'] = docheight - self.q['y'] - self.q['height'] - - #process path - d = obj.attributes.getNamedItem('d') - p = cubicsuperpath.parsePath(d.value) - for subs in p: - for csp in subs: - csp[0] = self.trafopoint(csp[0]) - csp[1] = self.trafopoint(csp[1]) - csp[2] = self.trafopoint(csp[2]) - d.value = cubicsuperpath.formatPath(p) + if obj.get(inkex.addNS('type','sodipodi')): + inkex.errormsg(_("The first selected object is of type '%s'.\nTry using the procedure Path | Object to Path." % obj.get(inkex.addNS('type','sodipodi')))) + exit() + if obj.tag == inkex.addNS('path','svg') or obj.tag == inkex.addNS('g','svg'): + if trafo.tag == inkex.addNS('path','svg'): + #distil trafo into four node points + trafo = cubicsuperpath.parsePath(trafo.get('d')) + if len(trafo[0]) < 4: + inkex.errormsg(_("This extension requires that the second selected path be four nodes long.")) + exit() + trafo = [[Point(csp[1][0],csp[1][1]) for csp in subs] for subs in trafo][0][:4] + + #vectors pointing away from the trafo origin + self.t1 = Segment(trafo[0],trafo[1]) + self.t2 = Segment(trafo[1],trafo[2]) + self.t3 = Segment(trafo[3],trafo[2]) + self.t4 = Segment(trafo[0],trafo[3]) + + #query inkscape about the bounding box of obj + self.q = {'x':0,'y':0,'width':0,'height':0} + file = self.args[-1] + id = self.options.ids[0] + for query in self.q.keys(): + f,err = os.popen3('inkscape --query-%s --query-id=%s "%s"' % (query,id,file))[1:] + self.q[query] = float(f.read()) + f.close() + err.close() + + if obj.tag == inkex.addNS("path",'svg'): + self.process_path(obj) + if obj.tag == inkex.addNS("g",'svg'): + self.process_group(obj) + else: + if trafo.tag == inkex.addNS('g','svg'): + inkex.errormsg(_("The second selected object is a group, not a path.\nTry using the procedure Object | Ungroup.")) + else: + inkex.errormsg(_("The second selected object is not a path.\nTry using the procedure Path | Object to Path.")) + exit() + else: + inkex.errormsg(_("The first selected object is not a path.\nTry using the procedure Path | Object to Path.")) + exit() + + def process_group(self,group): + for node in group: + if node.tag == inkex.addNS('path','svg'): + self.process_path(node) + if node.tag == inkex.addNS('g','svg'): + self.process_group(node) + + def process_path(self,path): + d = path.get('d') + p = cubicsuperpath.parsePath(d) + for subs in p: + for csp in subs: + csp[0] = self.trafopoint(csp[0]) + csp[1] = self.trafopoint(csp[1]) + csp[2] = self.trafopoint(csp[2]) + path.set('d',cubicsuperpath.formatPath(p)) def trafopoint(self,(x,y)): #Transform algorithm thanks to Jose Hevia (freon) @@ -95,5 +106,9 @@ class Project(inkex.Effect): p = intersectSegments(vert,horz) return [p['x'],p['y']] -e = Project() -e.affect() \ No newline at end of file +if __name__ == '__main__': + e = Project() + e.affect() + + +# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 encoding=utf-8 textwidth=99