diff options
| author | Sebastian Wüst <sebi@timewaster.de> | 2013-11-11 23:52:44 +0000 |
|---|---|---|
| committer | Sebastian Wüst <sebi@timewaster.de> | 2013-11-11 23:52:44 +0000 |
| commit | e58d9e092e8717807db86836c65845d1a52be6d3 (patch) | |
| tree | 6544eea9093de91c3dc525228adcbabbc02cdc79 /share | |
| parent | Fix make check again, new translatable strings have been added in r12787. (diff) | |
| download | inkscape-e58d9e092e8717807db86836c65845d1a52be6d3.tar.gz inkscape-e58d9e092e8717807db86836c65845d1a52be6d3.zip | |
removed recursion to avoid problems on big documents
(bzr r12793)
Diffstat (limited to 'share')
| -rw-r--r-- | share/extensions/hpgl_encoder.py | 63 | ||||
| -rwxr-xr-x | share/extensions/hpgl_output.py | 2 | ||||
| -rw-r--r-- | share/extensions/plotter.py | 2 |
3 files changed, 40 insertions, 27 deletions
diff --git a/share/extensions/hpgl_encoder.py b/share/extensions/hpgl_encoder.py index 4523afb7f..7623751b6 100644 --- a/share/extensions/hpgl_encoder.py +++ b/share/extensions/hpgl_encoder.py @@ -88,10 +88,10 @@ class hpglEncoder: def getHpgl(self): # dryRun to find edges - self.groupmat = [[[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, 0.0], [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, 0.0]]] - self.groupmat[0] = simpletransform.composeTransform(self.groupmat[0], simpletransform.parseTransform('rotate(' + self.options.orientation + ')')) + groupmat = [[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, 0.0], [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, 0.0]] + groupmat = simpletransform.composeTransform(groupmat, simpletransform.parseTransform('rotate(' + self.options.orientation + ')')) self.vData = [['', -1.0, -1.0], ['', -1.0, -1.0], ['', -1.0, -1.0], ['', -1.0, -1.0]] - self.process_group(self.doc, self.groupmat) + self.process_groups(self.doc, groupmat) if self.divergenceX == 'False' or self.divergenceY == 'False' or self.sizeX == 'False' or self.sizeY == 'False': raise Exception('NO_PATHS') # live run @@ -102,9 +102,9 @@ class hpglEncoder: elif self.options.useToolOffset: self.options.offsetX += self.options.toolOffset self.options.offsetY += self.options.toolOffset - self.groupmat = [[[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, - self.divergenceX + self.options.offsetX], - [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, - self.divergenceY + self.options.offsetY]]] - self.groupmat[0] = simpletransform.composeTransform(self.groupmat[0], simpletransform.parseTransform('rotate(' + self.options.orientation + ')')) + groupmat = [[self.mirrorX * self.scaleX * self.viewBoxTransformX, 0.0, - self.divergenceX + self.options.offsetX], + [0.0, self.mirrorY * self.scaleY * self.viewBoxTransformY, - self.divergenceY + self.options.offsetY]] + groupmat = simpletransform.composeTransform(groupmat, simpletransform.parseTransform('rotate(' + self.options.orientation + ')')) self.vData = [['', -1.0, -1.0], ['', -1.0, -1.0], ['', -1.0, -1.0], ['', -1.0, -1.0]] # store first hpgl commands self.hpgl = 'IN;SP%d' % self.options.pen @@ -113,32 +113,49 @@ class hpglEncoder: self.calcOffset('PU', 0, 0) self.calcOffset('PD', 0, self.options.toolOffset * 8) # start conversion - self.process_group(self.doc, self.groupmat) + self.process_groups(self.doc, groupmat) # shift an empty node in in order to process last node in cache self.calcOffset('PU', 0, 0) # add return to zero point self.hpgl += ';PU0,0;' return self.hpgl - def process_group(self, group, groupmat): - # process groups + def process_groups(self, doc, groupmat): + # flatten groups to avoid recursion + paths = [] + for node in doc: + if (node.tag == inkex.addNS('g', 'svg') and self.isGroupVisible(node)) or node.tag == inkex.addNS('path', 'svg'): + paths.append([node.tag, node, self.mergeTransform(node, groupmat)]) + doc = '' + hasGroups = True + while hasGroups: + hasGroups = False + for i, elm in enumerate(paths): + if paths[i][0] == inkex.addNS('g', 'svg') and self.isGroupVisible(paths[i][1]): + hasGroups = True + for path in paths[i][1]: + if (path.tag == inkex.addNS('g', 'svg') and self.isGroupVisible(path)) or path.tag == inkex.addNS('path', 'svg'): + paths.append([path.tag, path, self.mergeTransform(path, paths[i][2])]) + paths[i][0] = '' + for node in paths: + if node[0] == inkex.addNS('path', 'svg'): + self.process_path(node[1], node[2]) + + def mergeTransform(self, doc, matrix): + # get and merge two matrixes into one + trans = doc.get('transform') + if trans: + return simpletransform.composeTransform(matrix, simpletransform.parseTransform(trans)) + else: + return matrix + + def isGroupVisible(self, group): style = group.get('style') if style: style = simplestyle.parseStyle(style) - if 'display' in style: - if style['display'] == 'none': - return - trans = group.get('transform') - if trans: - groupmat.append(simpletransform.composeTransform(groupmat[-1], simpletransform.parseTransform(trans))) - for node in group: - if node.tag == inkex.addNS('path', 'svg'): - self.process_path(node, groupmat[-1]) - if node.tag == inkex.addNS('g', 'svg'): - # TODO: Remove recursion - self.process_group(node, groupmat) - if trans: - groupmat.pop() + if 'display' in style and style['display'] == 'none': + return False + return True def process_path(self, node, mat): # process path diff --git a/share/extensions/hpgl_output.py b/share/extensions/hpgl_output.py index 94596a4a0..93be82980 100755 --- a/share/extensions/hpgl_output.py +++ b/share/extensions/hpgl_output.py @@ -69,8 +69,6 @@ class MyEffect(inkex.Effect): print self.hpgl if __name__ == '__main__': - # Raise recursion limit to avoid exceptions on big documents - sys.setrecursionlimit(20000) # start extension e = MyEffect() e.affect() diff --git a/share/extensions/plotter.py b/share/extensions/plotter.py index d2ca75fb3..6cc235228 100644 --- a/share/extensions/plotter.py +++ b/share/extensions/plotter.py @@ -127,8 +127,6 @@ class MyEffect(inkex.Effect): mySerial.close() if __name__ == '__main__': - # raise recursion limit to avoid exceptions on big documents - sys.setrecursionlimit(20000) # start extension e = MyEffect() e.affect() |
