summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Dufour <nicoduf@yahoo.fr>2012-02-09 05:25:41 +0000
committerJazzyNico <nicoduf@yahoo.fr>2012-02-09 05:25:41 +0000
commitcb3c5f1d6220fb6494e7e21be697c23eeaeb75e8 (patch)
tree9285e72e3fa7a2f0168d1022cc4106331b139d3e
parentExtensions. Unit tests improvement. (diff)
downloadinkscape-cb3c5f1d6220fb6494e7e21be697c23eeaeb75e8.tar.gz
inkscape-cb3c5f1d6220fb6494e7e21be697c23eeaeb75e8.zip
Extensions. PEP8, error handling and various extension fixes.
(bzr r10954)
-rw-r--r--share/extensions/Makefile.am6
-rwxr-xr-xshare/extensions/dxf_outlines.py22
-rwxr-xr-xshare/extensions/gimp_xcf.py166
-rwxr-xr-xshare/extensions/inkex.py5
-rwxr-xr-xshare/extensions/markers_strokepaint.py2
-rw-r--r--share/extensions/printing_marks.inx (renamed from share/extensions/printing-marks.inx)4
-rwxr-xr-xshare/extensions/printing_marks.py (renamed from share/extensions/printing-marks.py)7
-rwxr-xr-xshare/extensions/summersnight.py16
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()