Преглед изворни кода

- fixed the scale, mirror, rotate, skew functions to work with Geometry Objects of multi-geometry type.

Marius Stanciu пре 7 година
родитељ
комит
5a0390f2a4
3 измењених фајлова са 44 додато и 12 уклоњено
  1. 25 9
      FlatCAMObj.py
  2. 2 0
      README.md
  3. 17 3
      camlib.py

+ 25 - 9
FlatCAMObj.py

@@ -3491,16 +3491,32 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         else:
         else:
             px, py = point
             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:
         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.")
         self.app.inform.emit("[success]Geometry Scale done.")
 
 
     def offset(self, vect):
     def offset(self, vect):

+ 2 - 0
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
 - 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.
 - 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.
 - 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
 28.01.2018
 
 

+ 17 - 3
camlib.py

@@ -1354,11 +1354,17 @@ class Geometry(object):
                 return affinity.scale(obj, xscale, yscale, origin=(px,py))
                 return affinity.scale(obj, xscale, yscale, origin=(px,py))
 
 
         try:
         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 ...')
             self.app.inform.emit('[success]Object was mirrored ...')
         except AttributeError:
         except AttributeError:
             self.app.inform.emit("[error_notcl] Failed to mirror. No object selected")
             self.app.inform.emit("[error_notcl] Failed to mirror. No object selected")
 
 
+
+
     def rotate(self, angle, point):
     def rotate(self, angle, point):
         """
         """
         Rotate an object by an angle (in degrees) around the provided coordinates.
         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))
                 return affinity.rotate(obj, angle, origin=(px, py))
 
 
         try:
         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 ...')
             self.app.inform.emit('[success]Object was rotated ...')
         except AttributeError:
         except AttributeError:
             self.app.inform.emit("[error_notcl] Failed to rotate. No object selected")
             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))
                 return affinity.skew(obj, angle_x, angle_y, origin=(px, py))
 
 
         try:
         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 ...')
             self.app.inform.emit('[success]Object was skewed ...')
         except AttributeError:
         except AttributeError:
             self.app.inform.emit("[error_notcl] Failed to skew. No object selected")
             self.app.inform.emit("[error_notcl] Failed to skew. No object selected")