From a39e8e5fc1641ab003d4374a0a2649a0bfbe5b9f Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Sun, 20 Mar 2011 15:32:19 +0000 Subject: Fix #26555: SVG Import (stars wrong scale) Transformation for non-container objects was applied twice when they were USEd. Get rid of confusing checks for special cases in USE.createGeom and use special flag (instancing) which tells geometry is it "normal" geometry creation or geometry creation initiated by USE node (SYMBOL would be handled differently int this two cases) Quick tests showed none regressions. --- io_curve_svg/import_svg.py | 77 +++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 45 deletions(-) diff --git a/io_curve_svg/import_svg.py b/io_curve_svg/import_svg.py index 565db959..c39f8efa 100644 --- a/io_curve_svg/import_svg.py +++ b/io_curve_svg/import_svg.py @@ -1022,7 +1022,7 @@ class SVGGeometry: pass - def _doCreateGeom(self): + def _doCreateGeom(self, instancing): """ Internal handler to create real geometries """ @@ -1041,7 +1041,7 @@ class SVGGeometry: return None - def createGeom(self): + def createGeom(self, instancing): """ Create real geometries """ @@ -1055,7 +1055,7 @@ class SVGGeometry: if matrix is not None: self._pushMatrix(matrix) - self._doCreateGeom() + self._doCreateGeom(instancing) if matrix is not None: self._popMatrix() @@ -1092,13 +1092,13 @@ class SVGGeometryContainer(SVGGeometry): if ob is not None: self._geometries.append(ob) - def _doCreateGeom(self): + def _doCreateGeom(self, instancing): """ Create real geometries """ for geom in self._geometries: - geom.createGeom() + geom.createGeom(instancing) def getGeometries(self): """ @@ -1139,7 +1139,7 @@ class SVGGeometryPATH(SVGGeometry): self._splines = pathParser.getSplines() self._styles = SVGParseStyles(self._node, self._context) - def _doCreateGeom(self): + def _doCreateGeom(self, instancing): """ Create real geometries """ @@ -1190,7 +1190,7 @@ class SVGGeometryDEFS(SVGGeometryContainer): Container for referenced elements """ - def _doCreateGeom(self): + def createGeom(self, instancing): """ Create real geometries """ @@ -1203,12 +1203,26 @@ class SVGGeometrySYMBOL(SVGGeometryContainer): Referenced element """ - def _doCreateGeom(self): + def _doCreateGeom(self, instancing): """ Create real geometries """ - pass + self._pushMatrix(self.getNodeMatrix()) + + super()._doCreateGeom(False) + + self._popMatrix() + + def createGeom(self, instancing): + """ + Create real geometries + """ + + if not instancing: + return + + super().createGeom(instancing) class SVGGeometryG(SVGGeometryContainer): @@ -1224,7 +1238,7 @@ class SVGGeometryUSE(SVGGeometry): User of referenced elements """ - def _doCreateGeom(self): + def _doCreateGeom(self, instancing): """ Create real geometries """ @@ -1239,34 +1253,7 @@ class SVGGeometryUSE(SVGGeometry): self._pushMatrix(self.getNodeMatrix()) - geomMatrix = None - nodeMatrix = None - - if not isinstance(geom, SVGGeometryUSE): - geomMatrix = geom.getTransformMatrix() - - if isinstance(geom, SVGGeometrySYMBOL): - nodeMatrix = geom.getNodeMatrix() - - if nodeMatrix: - self._pushMatrix(nodeMatrix) - - if geomMatrix: - self._pushMatrix(geomMatrix) - - if isinstance(geom, SVGGeometryContainer): - geometries = geom.getGeometries() - else: - geometries = [geom] - - for g in geometries: - g.createGeom() - - if geomMatrix: - self._popMatrix() - - if nodeMatrix: - self._popMatrix() + geom.createGeom(True) self._popMatrix() @@ -1345,7 +1332,7 @@ class SVGGeometryRECT(SVGGeometry): bezt.handle_left_type = 'VECTOR' bezt.handle_right_type = 'VECTOR' - def _doCreateGeom(self): + def _doCreateGeom(self, instancing): """ Create real geometries """ @@ -1467,7 +1454,7 @@ class SVGGeometryELLIPSE(SVGGeometry): self._rx = self._node.getAttribute('rx') or '0' self._ry = self._node.getAttribute('ry') or '0' - def _doCreateGeom(self): + def _doCreateGeom(self, instancing): """ Create real geometries """ @@ -1585,7 +1572,7 @@ class SVGGeometryLINE(SVGGeometry): self._x2 = self._node.getAttribute('x2') or '0' self._y2 = self._node.getAttribute('y2') or '0' - def _doCreateGeom(self): + def _doCreateGeom(self, instancing): """ Create real geometries """ @@ -1666,7 +1653,7 @@ class SVGGeometryPOLY(SVGGeometry): self._points.append((float(prev), float(p))) prev = None - def _doCreateGeom(self): + def _doCreateGeom(self, instancing): """ Create real geometries """ @@ -1728,7 +1715,7 @@ class SVGGeometrySVG(SVGGeometryContainer): Main geometry holder """ - def _doCreateGeom(self): + def _doCreateGeom(self, instancing): """ Create real geometries """ @@ -1738,7 +1725,7 @@ class SVGGeometrySVG(SVGGeometryContainer): self._pushMatrix(self.getNodeMatrix()) self._pushRect(rect) - super()._doCreateGeom() + super()._doCreateGeom(False) self._popRect() self._popMatrix() @@ -1824,7 +1811,7 @@ def load_svg(filepath): loader = SVGLoader(filepath) loader.parse() - loader.createGeom() + loader.createGeom(False) def load(operator, context, filepath=""): -- cgit v1.2.3