diff --git a/Patro/FileFormat/Svg/SvgFile.py b/Patro/FileFormat/Svg/SvgFile.py index 5d630cd2444cdbccd650c74dedf55669dab1f377..440c7d4cb1a0dae34f37fca394b259602cad6e63 100644 --- a/Patro/FileFormat/Svg/SvgFile.py +++ b/Patro/FileFormat/Svg/SvgFile.py @@ -117,7 +117,9 @@ class RenderState: value = getattr(item, state) if state == 'transform': if value is not None: - self.transform = value * self.transform + # Transform matrix is composed from top to item + # thus left to right + self.transform = self.transform * value elif state == 'style': pass else: @@ -130,7 +132,7 @@ class RenderState: state, value = [x.strip() for x in pair.split(':')] state = state.replace('-', '_') if state == 'transform': - self.transform = value * self.transform + self.transform = self.transform * value else: setattr(self, state, self.to_python(value)) diff --git a/Patro/GeometryEngine/Transformation.py b/Patro/GeometryEngine/Transformation.py index 29a7a12575996b52c3c19b0a54064a1fbe414ba3..79d4047540040df38bf9319e78fc78b427b9b3e6 100644 --- a/Patro/GeometryEngine/Transformation.py +++ b/Patro/GeometryEngine/Transformation.py @@ -180,6 +180,8 @@ class Transformation: def __mul__(self, obj): + """Return self * obj composition.""" + if isinstance(obj, Transformation): # T = T1 * T2 array = np.matmul(self._m, obj.array) @@ -202,6 +204,10 @@ class Transformation: def __imul__(self, obj): + """Set transformation to obj * self composition.""" + + # Fixme: order ??? + if isinstance(obj, Transformation): if obj.type != TransformationType.Identity: # (T = T1) *= T2 diff --git a/examples/file-format/svg/test-svg-import.py b/examples/file-format/svg/test-svg-import.py index 56f8baa27e270f1fc72ee300009a618104866eac..aadc6a233784d2e69d68972c2e3118bddd8fabe3 100644 --- a/examples/file-format/svg/test-svg-import.py +++ b/examples/file-format/svg/test-svg-import.py @@ -104,6 +104,11 @@ class SceneImporter(SvgFileInternal): # 'path12085', # ): # return + # if item.id not in ( + # 'rounded-rectangle', + # 'polygon', + # ): + # return # from Patro.FileFormat.Svg.SvgFormat import PathDataAttribute # self._logger.info(str(item.id) + '\n' + str(item.path_data)) # item.path_data = PathDataAttribute.to_geometry(item.path_data) @@ -126,6 +131,7 @@ class SceneImporter(SvgFileInternal): ) transformation = self._screen_transformation * state.transform + # transformation = state.transform self._logger.info('Sate Transform\n' + str(transformation)) if isinstance(item, SvgFormat.Path): # and state.stroke_dasharray is None @@ -133,19 +139,20 @@ class SceneImporter(SvgFileInternal): if path is not None: # Fixme: # self._logger.info(str(item.id) + '\n' + str(path[0].geometry)) path = path.transform(transformation) - for part in path: - self._update_bounding_box(part) - # self._logger.info(str(item.id) + '\n' + str(path[0].geometry)) + self._update_bounding_box(path) + # self._logger.info('after ' + str(item.id) + '\n' + str(path[0].geometry)) self._scene.add_path(path, path_style) elif isinstance(item, SvgFormat.Rect): path = item.geometry path = path.transform(transformation) + self._update_bounding_box(path) self._scene.add_path(path, path_style) #################################################################################################### # svg_path = find_data_path('svg', 'basic-demo-2.by-hand.svg') svg_path = find_data_path('svg', 'demo.svg') +# svg_path = find_data_path('svg', 'demo.simple.svg') # svg_path = find_data_path('patterns-svg', 'veravenus-little-bias-dress.pattern-a0.svg') # svg_path = find_data_path('patterns-svg', 'veravenus-little-bias-dress.pattern-a0.no-text-zaggy.svg')