diff options
| author | Nicolas Dufour <nicoduf@yahoo.fr> | 2012-02-09 05:25:41 +0000 |
|---|---|---|
| committer | JazzyNico <nicoduf@yahoo.fr> | 2012-02-09 05:25:41 +0000 |
| commit | cb3c5f1d6220fb6494e7e21be697c23eeaeb75e8 (patch) | |
| tree | 9285e72e3fa7a2f0168d1022cc4106331b139d3e | |
| parent | Extensions. Unit tests improvement. (diff) | |
| download | inkscape-cb3c5f1d6220fb6494e7e21be697c23eeaeb75e8.tar.gz inkscape-cb3c5f1d6220fb6494e7e21be697c23eeaeb75e8.zip | |
Extensions. PEP8, error handling and various extension fixes.
(bzr r10954)
| -rw-r--r-- | share/extensions/Makefile.am | 6 | ||||
| -rwxr-xr-x | share/extensions/dxf_outlines.py | 22 | ||||
| -rwxr-xr-x | share/extensions/gimp_xcf.py | 166 | ||||
| -rwxr-xr-x | share/extensions/inkex.py | 5 | ||||
| -rwxr-xr-x | share/extensions/markers_strokepaint.py | 2 | ||||
| -rw-r--r-- | share/extensions/printing_marks.inx (renamed from share/extensions/printing-marks.inx) | 4 | ||||
| -rwxr-xr-x | share/extensions/printing_marks.py (renamed from share/extensions/printing-marks.py) | 7 | ||||
| -rwxr-xr-x | share/extensions/summersnight.py | 16 |
8 files changed, 146 insertions, 82 deletions
diff --git a/share/extensions/Makefile.am b/share/extensions/Makefile.am index 8718de825..eab9a9c6c 100644 --- a/share/extensions/Makefile.am +++ b/share/extensions/Makefile.am @@ -4,7 +4,7 @@ SUBDIRS = \ Barcode \ Poly3DObjects \ test \ - ink2canvas \ + ink2canvas \ xaml2svg extensiondir = $(datadir)/inkscape/extensions @@ -116,7 +116,7 @@ extensions = \ pixelsnap.py \ plt_output.py \ polyhedron_3d.py \ - printing-marks.py \ + printing_marks.py \ ps2dxf.sh \ ps2pdf-ext.py \ pturtle.py \ @@ -304,7 +304,7 @@ modules = \ plt_input.inx \ plt_output.inx \ polyhedron_3d.inx \ - printing-marks.inx \ + printing_marks.inx \ ps_input.inx \ radiusrand.inx \ render_barcode.inx \ diff --git a/share/extensions/dxf_outlines.py b/share/extensions/dxf_outlines.py index e8cb58848..d93e1ff2f 100755 --- a/share/extensions/dxf_outlines.py +++ b/share/extensions/dxf_outlines.py @@ -60,12 +60,22 @@ def get_matrix(u, i, j): class MyEffect(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) - self.OptionParser.add_option("-R", "--ROBO", action="store", type="string", dest="ROBO") - self.OptionParser.add_option("-P", "--POLY", action="store", type="string", dest="POLY") - self.OptionParser.add_option("--units", action="store", type="string", dest="units") - self.OptionParser.add_option("--encoding", action="store", type="string", dest="char_encode", default="latin_1") - self.OptionParser.add_option("--tab", action="store", type="string", dest="tab") - self.OptionParser.add_option("--inputhelp", action="store", type="string", dest="inputhelp") + self.OptionParser.add_option("-R", "--ROBO", action="store", + type="string", dest="ROBO", + default=False) + self.OptionParser.add_option("-P", "--POLY", action="store", + type="string", dest="POLY", + default=True) + self.OptionParser.add_option("--units", action="store", + type="string", dest="units", + default="72./90") # Points + self.OptionParser.add_option("--encoding", action="store", + type="string", dest="char_encode", + default="latin_1") + self.OptionParser.add_option("--tab", action="store", + type="string", dest="tab") + self.OptionParser.add_option("--inputhelp", action="store", + type="string", dest="inputhelp") self.dxf = [] self.handle = 255 # handle for DXF ENTITY self.layers = ['0'] diff --git a/share/extensions/gimp_xcf.py b/share/extensions/gimp_xcf.py index 8c063d660..3cd30ac10 100755 --- a/share/extensions/gimp_xcf.py +++ b/share/extensions/gimp_xcf.py @@ -1,7 +1,8 @@ #!/usr/bin/env python ''' Copyright (C) 2006 Aaron Spike, aaron@ekips.org -Copyright (C) 2010-2011 Nicolas Dufour, nicoduf@yahoo.fr (Windows support and various fixes) +Copyright (C) 2010-2012 Nicolas Dufour, nicoduf@yahoo.fr +(Windows support and various fixes) 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 @@ -17,15 +18,31 @@ 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 -import sys, os, tempfile, shutil + import gettext +import os +import shutil +from subprocess import Popen, PIPE +import sys +import tempfile + +import inkex + +_ = gettext.gettext + +# Define extension exceptions +class GimpXCFError(Exception): pass + +class GimpXCFExpectedIOError(GimpXCFError): pass + +class GimpXCFGimpNotInstalled(GimpXCFError): + def __init__(self): + inkex.errormsg(_('Gimp must be installed and set in your path variable.')) + +class GimpXCFScriptFuError(GimpXCFError): + def __init__(self): + inkex.errormsg(_('An error occured while processing the XCF file.')) -try: - from subprocess import Popen, PIPE - bsubprocess = True -except: - bsubprocess = False class MyEffect(inkex.Effect): def __init__(self): @@ -34,17 +51,17 @@ class MyEffect(inkex.Effect): action="store", type="string", dest="tab") self.OptionParser.add_option("-d", "--guides", - action="store", type="inkbool", - dest="saveGuides", default=False, - help="Save the Guides with the .XCF") + action="store", type="inkbool", + dest="saveGuides", default=False, + help="Save the Guides with the .XCF") self.OptionParser.add_option("-r", "--grid", - action="store", type="inkbool", - dest="saveGrid", default=False, - help="Save the Grid with the .XCF") + action="store", type="inkbool", + dest="saveGrid", default=False, + help="Save the Grid with the .XCF") self.OptionParser.add_option("-b", "--background", - action="store", type="inkbool", - dest="layerBackground", default=False, - help="Add background color to each layer") + action="store", type="inkbool", + dest="layerBackground", default=False, + help="Add background color to each layer") def output(self): pass @@ -61,27 +78,28 @@ class MyEffect(inkex.Effect): pageHeight = int(inkex.unittouu(self.xpathSingle('/svg:svg/@height').split('.')[0])) pageWidth = int(inkex.unittouu(self.xpathSingle('/svg:svg/@width').split('.')[0])) - #create os temp dir + # Create os temp dir (to store exported pngs and Gimp log file) self.tmp_dir = tempfile.mkdtemp() # Guides hGuides = [] vGuides = [] if self.options.saveGuides: - guideXpath = "sodipodi:namedview/sodipodi:guide" #grab all guide tags in the namedview tag + # Grab all guide tags in the namedview tag + guideXpath = "sodipodi:namedview/sodipodi:guide" for guideNode in self.document.xpath(guideXpath, namespaces=inkex.NSS): ori = guideNode.get('orientation') if ori == '0,1': - #this is a horizontal guide + # This is a horizontal guide pos = int(guideNode.get('position').split(',')[1].split('.')[0]) - #GIMP doesn't like guides that are outside of the image + # GIMP doesn't like guides that are outside of the image if pos > 0 and pos < pageHeight: - #the origin is at the top in GIMP land + # The origin is at the top in GIMP land hGuides.append(str(pageHeight - pos)) elif ori == '1,0': - #this is a vertical guide + # This is a vertical guide pos = int(guideNode.get('position').split(',')[0].split('.')[0]) - #GIMP doesn't like guides that are outside of the image + # GIMP doesn't like guides that are outside of the image if pos > 0 and pos < pageWidth: vGuides.append(str(pos)) @@ -91,12 +109,12 @@ class MyEffect(inkex.Effect): # Grid gridSpacingFunc = '' gridOriginFunc = '' - #GIMP only allows one rectangular grid + # GIMP only allows one rectangular grid gridXpath = "sodipodi:namedview/inkscape:grid[@type='xygrid' and (not(@units) or @units='px')]" if (self.options.saveGrid and self.document.xpath(gridXpath, namespaces=inkex.NSS)): gridNode = self.xpathSingle(gridXpath) if gridNode != None: - #these attributes could be nonexistant + # These attributes could be nonexistant spacingX = gridNode.get('spacingx') if spacingX == None: spacingX = '1 ' @@ -121,11 +139,11 @@ class MyEffect(inkex.Effect): opacity += "0" pngs = [] names = [] - valid = 0 + self.valid = 0 path = "/svg:svg/*[name()='g' or @style][@id]" for node in self.document.xpath(path, namespaces=inkex.NSS): if len(node) > 0: # Get rid of empty layers - valid=1 + self.valid = 1 id = node.get('id') if node.get("{" + inkex.NSS["inkscape"] + "}label"): name = node.get("{" + inkex.NSS["inkscape"] + "}label") @@ -133,32 +151,32 @@ class MyEffect(inkex.Effect): name = id filename = os.path.join(self.tmp_dir, "%s.png" % id) command = "inkscape -i \"%s\" -j %s %s -e \"%s\" %s " % (id, area, opacity, filename, svg_file) - if bsubprocess: - p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE) - return_code = p.wait() - f = p.stdout - err = p.stderr - else: - _,f,err = os.popen3(command,'r') + + p = Popen(command, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + return_code = p.wait() + f = p.stdout + err = p.stderr + stdin = p.stdin f.read() f.close() err.close() + stdin.close() + if os.name == 'nt': filename = filename.replace("\\", "/") pngs.append(filename) names.append(name.encode('utf-8')) - if (valid==0): - inkex.errormsg(gettext.gettext('This extension requires at least one non empty layer.')) + if (self.valid == 0): self.clear_tmp() - sys.exit(0) - - filelist = '"%s"' % '" "'.join(pngs) - namelist = '"%s"' % '" "'.join(names) - xcf = os.path.join(self.tmp_dir, "%s.xcf" % docname) - if os.name == 'nt': - xcf = xcf.replace("\\", "/") - script_fu = """ + inkex.errormsg(_('This extension requires at least one non empty layer.')) + else: + filelist = '"%s"' % '" "'.join(pngs) + namelist = '"%s"' % '" "'.join(names) + xcf = os.path.join(self.tmp_dir, "%s.xcf" % docname) + if os.name == 'nt': + xcf = xcf.replace("\\", "/") + script_fu = """ (tracing 1) (define (png-to-layer img png_filename layer_name) @@ -206,27 +224,47 @@ class MyEffect(inkex.Effect): (gimp-image-undo-enable img) (gimp-file-save RUN-NONINTERACTIVE img (car (gimp-image-get-active-layer img)) "%s" "%s")) (gimp-quit 0) - """ % (filelist, namelist, hGList, vGList, gridSpacingFunc, gridOriginFunc, xcf, xcf) - - junk = os.path.join(self.tmp_dir, 'junk_from_gimp.txt') - f = os.popen('gimp -i --batch-interpreter plug-in-script-fu-eval -b - > %s 2>&1' % junk,'w') - f.write(script_fu) - f.close() - # uncomment these lines to see the output from gimp - #err = open(junk, 'r') - #inkex.debug(err.read()) - #err.close() - - x = open(xcf, 'rb') - if os.name == 'nt': + """ % (filelist, namelist, hGList, vGList, gridSpacingFunc, gridOriginFunc, xcf, xcf) + + junk = os.path.join(self.tmp_dir, 'junk_from_gimp.txt') + command = 'gimp -i --batch-interpreter plug-in-script-fu-eval -b - > %s 2>&1' % junk + + p = Popen(command, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE) + f = p.stdin + out = p.stdout + err = p.stderr + f.write(script_fu) + return_code = p.wait() + + if p.returncode != 0: + self.clear_tmp() + raise GimpXCFGimpNotInstalled + + f.close() + err.close() + out.close() + # Uncomment these lines to see the output from gimp + #err = open(junk, 'r') + #inkex.debug(err.read()) + #err.close() + try: - import msvcrt - msvcrt.setmode(1, os.O_BINARY) + x = open(xcf, 'rb') except: - pass - sys.stdout.write(x.read()) - x.close() - self.clear_tmp() + self.clear_tmp() + raise GimpXCFScriptFuError + + if os.name == 'nt': + try: + import msvcrt + msvcrt.setmode(1, os.O_BINARY) + except: + pass + try: + sys.stdout.write(x.read()) + finally: + x.close() + self.clear_tmp() if __name__ == '__main__': diff --git a/share/extensions/inkex.py b/share/extensions/inkex.py index b2b59442b..52b048dc8 100755 --- a/share/extensions/inkex.py +++ b/share/extensions/inkex.py @@ -96,7 +96,10 @@ def errormsg(msg): ... inkex.errormsg(_("This extension requires two selected paths.")) """ - sys.stderr.write((unicode(msg) + "\n").encode("UTF-8")) + if isinstance(msg, unicode): + sys.stderr.write((msg + "\n").encode("UTF-8")) + else: + sys.stderr.write((unicode(msg, "utf-8", errors='replace') + "\n").encode("UTF-8")) def check_inkbool(option, opt, value): if str(value).capitalize() == 'True': diff --git a/share/extensions/markers_strokepaint.py b/share/extensions/markers_strokepaint.py index d357d1988..5c760cd17 100755 --- a/share/extensions/markers_strokepaint.py +++ b/share/extensions/markers_strokepaint.py @@ -69,7 +69,7 @@ class MyEffect(inkex.Effect): defs = self.xpathSingle('/svg:svg//svg:defs') if defs == None: defs = inkex.etree.SubElement(self.document.getroot(),inkex.addNS('defs','svg')) - + for id, node in self.selected.iteritems(): mprops = ['marker','marker-start','marker-mid','marker-end'] try: diff --git a/share/extensions/printing-marks.inx b/share/extensions/printing_marks.inx index 511c9675a..19a29bf02 100644 --- a/share/extensions/printing-marks.inx +++ b/share/extensions/printing_marks.inx @@ -2,7 +2,7 @@ <inkscape-extension xmlns="http://www.inkscape.org/namespace/inkscape/extension"> <_name>Printing Marks</_name> <id>org.inkscape.printing.marks</id> - <dependency type="executable" location="extensions">printing-marks.py</dependency> + <dependency type="executable" location="extensions">printing_marks.py</dependency> <dependency type="executable" location="extensions">inkex.py</dependency> <param name="tab" type="notebook"> @@ -45,7 +45,7 @@ </effect> <script> - <command reldir="extensions" interpreter="python">printing-marks.py</command> + <command reldir="extensions" interpreter="python">printing_marks.py</command> </script> </inkscape-extension> diff --git a/share/extensions/printing-marks.py b/share/extensions/printing_marks.py index 041025708..7d3ab02d1 100755 --- a/share/extensions/printing-marks.py +++ b/share/extensions/printing_marks.py @@ -24,8 +24,11 @@ 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, simplestyle, math from subprocess import Popen, PIPE, STDOUT +import math + +import inkex +import simplestyle class Printing_Marks (inkex.Effect): @@ -66,7 +69,7 @@ class Printing_Marks (inkex.Effect): help="Draw Page Information?") self.OptionParser.add_option("--unit", action="store", type="string", - dest="unit", default=100.0, + dest="unit", default="px", help="Draw measurment") self.OptionParser.add_option("--crop_offset", action="store", type="float", diff --git a/share/extensions/summersnight.py b/share/extensions/summersnight.py index d3521d285..3bfa70cbd 100755 --- a/share/extensions/summersnight.py +++ b/share/extensions/summersnight.py @@ -17,9 +17,17 @@ 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, simplepath, cubicsuperpath, simpletransform, voronoi2svg -from ffgeom import * import gettext +import os + +import cubicsuperpath +import inkex +import simplepath +import simpletransform +import voronoi2svg + +from ffgeom import * + _ = gettext.gettext try: @@ -30,7 +38,8 @@ except: class Project(inkex.Effect): def __init__(self): - inkex.Effect.__init__(self) + inkex.Effect.__init__(self) + def effect(self): if len(self.options.ids) < 2: inkex.errormsg(_("This extension requires two selected paths. \nThe second path must be exactly four nodes long.")) @@ -122,6 +131,7 @@ class Project(inkex.Effect): p = intersectSegments(vert,horz) return [p['x'],p['y']] + if __name__ == '__main__': e = Project() e.affect() |
