From 5a0390f2a428d31a66313fe29d6f488609ba055f Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 29 Jan 2019 15:56:49 +0200 Subject: [PATCH] - fixed the scale, mirror, rotate, skew functions to work with Geometry Objects of multi-geometry type. --- FlatCAMObj.py | 34 +++++++++++++++++++++++++--------- README.md | 2 ++ camlib.py | 20 +++++++++++++++++--- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 3c62f059..72d63280 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -3491,16 +3491,32 @@ class FlatCAMGeometry(FlatCAMObj, Geometry): else: px, py = point - if type(self.solid_geometry) == list: - geo_list = self.flatten(self.solid_geometry) - self.solid_geometry = [] - # for g in geo_list: - # self.solid_geometry.append(affinity.scale(g, xfactor, yfactor, origin=(px, py))) - self.solid_geometry = [affinity.scale(g, xfactor, yfactor, origin=(px, py)) - for g in geo_list] + # if type(self.solid_geometry) == list: + # geo_list = self.flatten(self.solid_geometry) + # self.solid_geometry = [] + # # for g in geo_list: + # # self.solid_geometry.append(affinity.scale(g, xfactor, yfactor, origin=(px, py))) + # self.solid_geometry = [affinity.scale(g, xfactor, yfactor, origin=(px, py)) + # for g in geo_list] + # else: + # self.solid_geometry = affinity.scale(self.solid_geometry, xfactor, yfactor, + # origin=(px, py)) + # self.app.inform.emit("[success]Geometry Scale done.") + + def scale_recursion(geom): + if type(geom) == list: + geoms=list() + for local_geom in geom: + geoms.append(scale_recursion(local_geom)) + return geoms + else: + return affinity.scale(geom, xfactor, yfactor, origin=(px, py)) + + if self.multigeo is True: + for tool in self.tools: + self.tools[tool]['solid_geometry'] = scale_recursion(self.tools[tool]['solid_geometry']) else: - self.solid_geometry = affinity.scale(self.solid_geometry, xfactor, yfactor, - origin=(px, py)) + self.solid_geometry=scale_recursion(self.solid_geometry) self.app.inform.emit("[success]Geometry Scale done.") def offset(self, vect): diff --git a/README.md b/README.md index 287fdffc..3eeaf1d5 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ CAD program, and create G-Code for Isolation routing. - added more shortcut keys in the Geometry Editor and in Excellon Editor; activated also the zoom (fit, in, out) shortcut keys ('1' , '2', '3') for the editors - disabled the context menu in tools table on Paint Tool in case that the painting method is single. - added protection when trying to do Intersection in Geometry Editor without having selected Geometry items. +- fixed the scale, mirror, rotate, skew functions to work with Geometry Objects of multi-geometry type. + 28.01.2018 diff --git a/camlib.py b/camlib.py index ef317ee6..f544e487 100644 --- a/camlib.py +++ b/camlib.py @@ -1354,11 +1354,17 @@ class Geometry(object): return affinity.scale(obj, xscale, yscale, origin=(px,py)) try: - self.solid_geometry = mirror_geom(self.solid_geometry) + if self.multigeo is True: + for tool in self.tools: + self.tools[tool]['solid_geometry'] = mirror_geom(self.tools[tool]['solid_geometry']) + else: + self.solid_geometry = mirror_geom(self.solid_geometry) self.app.inform.emit('[success]Object was mirrored ...') except AttributeError: self.app.inform.emit("[error_notcl] Failed to mirror. No object selected") + + def rotate(self, angle, point): """ Rotate an object by an angle (in degrees) around the provided coordinates. @@ -1388,7 +1394,11 @@ class Geometry(object): return affinity.rotate(obj, angle, origin=(px, py)) try: - self.solid_geometry = rotate_geom(self.solid_geometry) + if self.multigeo is True: + for tool in self.tools: + self.tools[tool]['solid_geometry'] = rotate_geom(self.tools[tool]['solid_geometry']) + else: + self.solid_geometry = rotate_geom(self.solid_geometry) self.app.inform.emit('[success]Object was rotated ...') except AttributeError: self.app.inform.emit("[error_notcl] Failed to rotate. No object selected") @@ -1420,7 +1430,11 @@ class Geometry(object): return affinity.skew(obj, angle_x, angle_y, origin=(px, py)) try: - self.solid_geometry = skew_geom(self.solid_geometry) + if self.multigeo is True: + for tool in self.tools: + self.tools[tool]['solid_geometry'] = skew_geom(self.tools[tool]['solid_geometry']) + else: + self.solid_geometry = skew_geom(self.solid_geometry) self.app.inform.emit('[success]Object was skewed ...') except AttributeError: self.app.inform.emit("[error_notcl] Failed to skew. No object selected")