From 8d0d0ff393bde4b53bcd9c8e57b59d1a3021ba77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20W=C3=BCst?= Date: Sun, 14 Jul 2013 17:06:36 +0200 Subject: changed how decoder is called and errors are passed (bzr r12417.1.3) --- share/extensions/hpgl_decoder.py | 31 ++++++++++++++++--------------- share/extensions/hpgl_input.py | 38 ++++++++++++++++++++------------------ share/extensions/hpgl_output.py | 3 +-- 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('' % (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. -- cgit v1.2.3