diff options
| author | Sebastian Wüst <sebi@timewaster.de> | 2013-07-14 15:06:36 +0000 |
|---|---|---|
| committer | Sebastian Wüst <sebi@timewaster.de> | 2013-07-14 15:06:36 +0000 |
| commit | 8d0d0ff393bde4b53bcd9c8e57b59d1a3021ba77 (patch) | |
| tree | d87e049da3d2b0a619e335727d96d32bc5e1b5f7 | |
| parent | minor changes (diff) | |
| download | inkscape-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.py | 31 | ||||
| -rw-r--r-- | share/extensions/hpgl_input.py | 38 | ||||
| -rwxr-xr-x | share/extensions/hpgl_output.py | 3 | ||||
| -rw-r--r-- | share/extensions/plotter.py | 14 |
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. |
