summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Wüst <sebi@timewaster.de>2015-02-01 20:23:16 +0000
committerSebastian Wüst <sebi@timewaster.de>2015-02-01 20:23:16 +0000
commit30bac6d345187673068e4ffeb0ff58b30253d7ed (patch)
tree4bd39f643ce9c2b2ddb4818ddd232c1136fa12ce
parentpatch by Mark Harmer to allow DirUtil test to pass in Windows. (Bug 1409208) (diff)
downloadinkscape-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.py87
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