diff options
| author | Sebastian Wüst <sebi@timewaster.de> | 2015-02-01 20:23:16 +0000 |
|---|---|---|
| committer | Sebastian Wüst <sebi@timewaster.de> | 2015-02-01 20:23:16 +0000 |
| commit | 30bac6d345187673068e4ffeb0ff58b30253d7ed (patch) | |
| tree | 4bd39f643ce9c2b2ddb4818ddd232c1136fa12ce | |
| parent | patch by Mark Harmer to allow DirUtil test to pass in Windows. (Bug 1409208) (diff) | |
| download | inkscape-30bac6d345187673068e4ffeb0ff58b30253d7ed.tar.gz inkscape-30bac6d345187673068e4ffeb0ff58b30253d7ed.zip | |
fixed import bug when using multiple pens (paths where put into wrong layers), refactored code while on it
(bzr r13888)
| -rw-r--r-- | share/extensions/hpgl_decoder.py | 87 |
1 files changed, 33 insertions, 54 deletions
diff --git a/share/extensions/hpgl_decoder.py b/share/extensions/hpgl_decoder.py index e909790b7..cd900202b 100644 --- a/share/extensions/hpgl_decoder.py +++ b/share/extensions/hpgl_decoder.py @@ -41,84 +41,63 @@ class hpglDecoder: self.scaleY = options.resolutionY / 25.4 # dots/inch to dots/mm self.warning = '' self.textMovements = _("Movements") - self.textPenNumber = _("Pen #") + self.textPenNumber = _("Pen ") + self.layers = {} + self.oldCoordinates = (0.0, self.options.docHeight) def getSvg(self): + actualLayer = 0 # prepare document - self.doc = inkex.etree.parse(StringIO('<svg xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="%smm" height="%smm" viewBox="0 0 %s %s"></svg>' % + self.doc = inkex.etree.parse(StringIO('<svg xmlns:sodipodi="' + inkex.NSS['sodipodi'] + '" xmlns:inkscape="' + inkex.NSS['inkscape'] + '" width="%smm" height="%smm" viewBox="0 0 %s %s"></svg>' % (self.options.docWidth, self.options.docHeight, self.options.docWidth, self.options.docHeight))) inkex.etree.SubElement(self.doc.getroot(), inkex.addNS('namedview', 'sodipodi'), {inkex.addNS('document-units', 'inkscape'): 'mm'}) - actualLayer = 0 - self.layers = {} if self.options.showMovements: self.layers[0] = inkex.etree.SubElement(self.doc.getroot(), 'g', {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): self.textMovements, 'id': self.textMovements}) - # parse paths + # cut stream into commands hpglData = self.hpglString.split(';') + # if number of commands is under needed minimum, no data was found if len(hpglData) < 3: raise Exception('NO_HPGL_DATA') - oldCoordinates = (0.0, self.options.docHeight) - path = '' + # decode commands into svg data for i, command in enumerate(hpglData): if command.strip() != '': if command[:2] == 'IN' or command[:2] == 'FS' or command[:2] == 'VS': - # if Initialize, force or speed command, ignore + # if Initialize, force or speed command ignore it pass elif command[:2] == 'SP': # if Select Pen command - actualLayer = command[2:] - self.createLayer(actualLayer) + actualLayer = int(command[2:]) elif command[:2] == 'PU': # if Pen Up command - if ' L ' in path: - self.addPathToLayer(path, actualLayer) - if self.options.showMovements and oldCoordinates != self.getParameters(command[2:]): - path = 'M %f,%f' % oldCoordinates - path += ' L %f,%f' % self.getParameters(command[2:]) - self.addPathToLayer(path, 0) - path = 'M %f,%f' % self.getParameters(command[2:]) - oldCoordinates = self.getParameters(command[2:]) + self.parametersToPath(command[2:], 0, True) elif command[:2] == 'PD': # if Pen Down command - parameterString = command[2:] - if parameterString.strip() != '': - parameterString = parameterString.replace(';', '').strip() - parameter = parameterString.split(',') - for i, param in enumerate(parameter): - if i % 2 == 0: - parameter[i] = str(float(param) / self.scaleX) - else: - parameter[i] = str(self.options.docHeight - (float(param) / self.scaleY)) - parameterString = ','.join(parameter) - path += ' L %s' % parameterString - oldCoordinates = (float(parameter[-2]), float(parameter[-1])) + self.parametersToPath(command[2:], actualLayer + 1, False) else: self.warning = 'UNKNOWN_COMMANDS' - if ' L ' in path: - self.addPathToLayer(path, actualLayer) return (self.doc, self.warning) - def createLayer(self, layerNumber): - try: - self.layers[layerNumber] - except KeyError: - self.layers[layerNumber] = inkex.etree.SubElement(self.doc.getroot(), 'g', - {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): self.textPenNumber + layerNumber, 'id': self.textPenNumber + layerNumber}) - - def addPathToLayer(self, path, layerNumber): - lineColor = '000000' - if layerNumber == 0: - lineColor = 'ff0000' - inkex.etree.SubElement(self.layers[layerNumber], 'path', {'d': path, 'style': 'stroke:#' + lineColor + '; stroke-width:0.4; fill:none;'}) + def parametersToPath(self, parameters, layerNum, isPU): + # split params and sanity check them + parameters = parameters.strip().split(',') + if len(parameters) > 0 and len(parameters) % 2 == 0: + for i, param in enumerate(parameters): + # convert params to document units + if i % 2 == 0: + parameters[i] = str(float(param) / self.scaleX) + else: + parameters[i] = str(self.options.docHeight - (float(param) / self.scaleY)) + # create path and add it to the corresponding layer + if not isPU or (self.options.showMovements and isPU): + # create layer if it does not exist + try: + self.layers[layerNum] + except KeyError: + self.layers[layerNum] = inkex.etree.SubElement(self.doc.getroot(), 'g', + {inkex.addNS('groupmode', 'inkscape'): 'layer', inkex.addNS('label', 'inkscape'): self.textPenNumber + str(layerNum - 1), 'id': self.textPenNumber + str(layerNum - 1)}) + path = 'M %f,%f L %s' % (self.oldCoordinates[0], self.oldCoordinates[1], ','.join(parameters)) + inkex.etree.SubElement(self.layers[layerNum], 'path', {'d': path, 'style': 'stroke:#' + ('ff0000' if isPU else '000000') + '; stroke-width:0.2; fill:none;'}) + self.oldCoordinates = (float(parameters[-2]), float(parameters[-1])) - def getParameters(self, parameterString): - # process coordinates - if parameterString.strip() == '': - parameterString = '0,0;' - # remove command delimiter - parameterString = parameterString.replace(';', '').strip() - # split parameter - parameter = parameterString.split(',') - # convert to svg coordinate system and return - return (float(parameter[0]) / self.scaleX, self.options.docHeight - (float(parameter[1]) / self.scaleY)) # vim: expandtab shiftwidth=4 tabstop=8 softtabstop=4 fileencoding=utf-8 textwidth=99
\ No newline at end of file |
