summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Wüst <sebi@timewaster.de>2013-07-14 15:06:36 +0000
committerSebastian Wüst <sebi@timewaster.de>2013-07-14 15:06:36 +0000
commit8d0d0ff393bde4b53bcd9c8e57b59d1a3021ba77 (patch)
treed87e049da3d2b0a619e335727d96d32bc5e1b5f7
parentminor changes (diff)
downloadinkscape-8d0d0ff393bde4b53bcd9c8e57b59d1a3021ba77.tar.gz
inkscape-8d0d0ff393bde4b53bcd9c8e57b59d1a3021ba77.zip
changed how decoder is called and errors are passed
(bzr r12417.1.3)
-rw-r--r--share/extensions/hpgl_decoder.py31
-rw-r--r--share/extensions/hpgl_input.py38
-rwxr-xr-xshare/extensions/hpgl_output.py3
-rw-r--r--share/extensions/plotter.py14
4 files changed, 47 insertions, 39 deletions
diff --git a/share/extensions/hpgl_decoder.py b/share/extensions/hpgl_decoder.py
index 1a455829e..a2427cc8e 100644
--- a/share/extensions/hpgl_decoder.py
+++ b/share/extensions/hpgl_decoder.py
@@ -26,24 +26,25 @@ import inkex
class hpglDecoder:
- def __init__(self, options):
+ def __init__(self, hpglString, options):
''' options:
"resolutionX":float
"resolutionY":float
"showMovements":bool
'''
+ 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.hasUnknownCommands = False
+ self.warnings = []
- def getSvg(self, data):
+ def getSvg(self):
# parse hpgl data
- data = data.split(';')
- if data[-1].strip() == '':
- data.pop()
- if len(data) < 3:
- return (False, True, '')
+ hpglData = self.hpglString.split(';')
+ if hpglData[-1].strip() == '':
+ hpglData.pop()
+ if len(hpglData) < 3:
+ raise Exception('NO_HPGL_DATA')
# prepare document
doc = inkex.etree.parse(StringIO('<svg xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" width="%s" height="%s"></svg>' % (self.options.docWidth, self.options.docHeight)))
layerDrawing = inkex.etree.SubElement(doc.getroot(), 'g', {inkex.addNS('groupmode','inkscape'):'layer', inkex.addNS('label','inkscape'):'Drawing'})
@@ -52,14 +53,14 @@ class hpglDecoder:
# parse paths
oldCoordinates = (0.0, self.options.docHeight)
path = ''
- for i, command in enumerate(data):
+ for i, command in enumerate(hpglData):
if command.strip() != '':
# TODO:2013-07-13:Sebastian Wüst:Implement the "HP-GL/2 kernel" set of commands.
if command[:2] == 'PU': # if Pen Up command
- if " L" in path:
+ if ' L' in path:
# TODO:2013-07-13:Sebastian Wüst:Make a method for adding a SubElement.
inkex.etree.SubElement(layerDrawing, 'path', {'d':path, 'style':'stroke:#000000; stroke-width:0.3; fill:none;'})
- if self.options.showMovements and i != len(data) - 1:
+ if self.options.showMovements and i != len(hpglData) - 1:
path = 'M %f,%f' % oldCoordinates
path += ' L %f,%f' % self.getCoordinates(command[2:])
inkex.etree.SubElement(layerMovements, 'path', {'d':path, 'style':'stroke:#ff0000; stroke-width:0.3; fill:none;'})
@@ -73,16 +74,16 @@ class hpglDecoder:
# TODO:2013-07-13:Sebastian Wüst:Every pen number should go to a different layer.
pass
else:
- self.hasUnknownCommands = True
- if " L" in path:
+ self.warnings.append('UNKNOWN_COMMANDS')
+ if ' L' in path:
inkex.etree.SubElement(layerDrawing, 'path', {'d':path, 'style':'stroke:#000000; stroke-width:0.3; fill:none;'})
- return (self.hasUnknownCommands, False, doc)
+ return (doc, self.warnings)
def getCoordinates(self, coord):
# process coordinates
(x, y) = coord.split(',')
x = float(x) / self.scaleX; # convert to pixels coordinate system
y = self.options.docHeight - float(y) / self.scaleY; # convert to pixels coordinate system, flip vertically for inkscape coordinate system
- return (x, y)
+ return (x, y)
# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99 \ No newline at end of file
diff --git a/share/extensions/hpgl_input.py b/share/extensions/hpgl_input.py
index 8290cf0a7..41e7cc608 100644
--- a/share/extensions/hpgl_input.py
+++ b/share/extensions/hpgl_input.py
@@ -28,11 +28,12 @@ inkex.localize()
# parse options
-parser = inkex.optparse.OptionParser(usage="usage: %prog [options] HPGLfile", option_class=inkex.InkOption)
-parser.add_option("--resolutionX", action="store", type="float", dest="resolutionX", default=1016.0, help="Resolution X (dpi)")
-parser.add_option("--resolutionY", action="store", type="float", dest="resolutionY", default=1016.0, help="Resolution Y (dpi)")
-parser.add_option("--showMovements", action="store", type="inkbool", dest="showMovements", default="FALSE", help="Show Movements between paths")
+parser = inkex.optparse.OptionParser(usage='usage: %prog [options] HPGLfile', option_class=inkex.InkOption)
+parser.add_option('--resolutionX', action='store', type='float', dest='resolutionX', default=1016.0, help='Resolution X (dpi)')
+parser.add_option('--resolutionY', action='store', type='float', dest='resolutionY', default=1016.0, help='Resolution Y (dpi)')
+parser.add_option('--showMovements', action='store', type='inkbool', dest='showMovements', default='FALSE', help='Show Movements between paths')
(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)
@@ -40,22 +41,23 @@ options.docHeight = 297.0 * 3.5433070866 # 297mm to pixels (DIN A4)
# TODO:2013-07-13:Sebastian Wüst:Load the whole file and try to parse all the different HPGL formats correctly.
# read file (read only one line, there should not be more than one line)
stream = open(args[0], 'r')
-data = stream.readline().strip()
-
-# interpret data
-myHpglDecoder = hpgl_decoder.hpglDecoder(options)
-# TODO:2013-07-13:Sebastian Wüst:Find a better way to pass errors correctly, think about how data is passed.
-(hasUnknownCommands, hasNoHpglData, doc) = myHpglDecoder.getSvg(data)
-
-# issue warning if no hpgl data found
-if hasNoHpglData:
- inkex.errormsg(_("No HPGL data found."))
- print 1
-else:
+hpglString = stream.readline().strip()
+
+# interpret HPGL data
+myHpglDecoder = hpgl_decoder.hpglDecoder(hpglString, options)
+try:
+ doc, warnings = myHpglDecoder.getSvg()
# issue warning if unknown commands where found
- if hasUnknownCommands:
+ if 'UNKNOWN_COMMANDS' in warnings:
inkex.errormsg(_("The HPGL data contained unknown (unsupported) commands, there is a possibility that the drawing is missing some content."))
# deliver document to inkscape
- doc.write(inkex.sys.stdout)
+ doc.write(inkex.sys.stdout)
+except Exception as inst:
+ if inst.args[0] == 'NO_HPGL_DATA':
+ # issue error if no hpgl data found
+ inkex.errormsg(_("No HPGL data found."))
+ print 1
+ else:
+ raise Exception(inst)
# vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99 \ No newline at end of file
diff --git a/share/extensions/hpgl_output.py b/share/extensions/hpgl_output.py
index cc87c6947..1a12b5a49 100755
--- a/share/extensions/hpgl_output.py
+++ b/share/extensions/hpgl_output.py
@@ -29,7 +29,7 @@ inkex.localize()
class MyEffect(inkex.Effect):
def __init__(self):
inkex.Effect.__init__(self)
- self.OptionParser.add_option("--tab", action="store", type="string", dest="tab")
+ self.OptionParser.add_option("--tab", action="store", type="string", dest="tab")
self.OptionParser.add_option("--resolutionX", action="store", type="float", dest="resolutionX", default=1016.0, help="Resolution X (dpi)")
self.OptionParser.add_option("--resolutionY", action="store", type="float", dest="resolutionY", default=1016.0, help="Resolution Y (dpi)")
self.OptionParser.add_option("--pen", action="store", type="int", dest="pen", default=1, help="Pen number")
@@ -49,7 +49,6 @@ class MyEffect(inkex.Effect):
def effect(self):
# get hpgl data
- # TODO:2013-07-13:Sebastian Wüst:Think about how data is passed.
myHpglEncoder = hpgl_encoder.hpglEncoder(self.document.getroot(), self.options)
# TODO:2013-07-13:Sebastian Wüst:Find a better way to pass errors correctly.
self.hpgl = myHpglEncoder.getHpgl()
diff --git a/share/extensions/plotter.py b/share/extensions/plotter.py
index f17c7dcf0..d54f9ed6c 100644
--- a/share/extensions/plotter.py
+++ b/share/extensions/plotter.py
@@ -71,10 +71,16 @@ class MyEffect(inkex.Effect):
self.options.showMovements = True
self.options.docWidth = float(inkex.unittouu(self.document.getroot().get('width')))
self.options.docHeight = float(inkex.unittouu(self.document.getroot().get('height')))
- myHpglDecoder = hpgl_decoder.hpglDecoder(self.options)
- (hasUnknownCommands, hasNoHpglData, doc) = myHpglDecoder.getSvg(self.hpgl)
- if not hasNoHpglData:
- self.document = doc
+ myHpglDecoder = hpgl_decoder.hpglDecoder(self.hpgl, self.options)
+ try:
+ doc, warnings = myHpglDecoder.getSvg()
+ # deliver document to inkscape
+ self.document = doc
+ except Exception as inst:
+ if inst.args[0] == 'NO_HPGL_DATA':
+ # do nothing
+ else:
+ raise Exception(inst)
'''
# send data to plotter
# TODO:2013-07-13:Sebastian Wüst:Somehow slow down sending to avoid buffer overruns in the plotter on very large drawings.