Просмотр исходного кода

- fixed Excellon object move and all the other transformations

Marius Stanciu 6 лет назад
Родитель
Сommit
90ff773546
3 измененных файлов с 85 добавлено и 7 удалено
  1. 1 0
      README.md
  2. 79 6
      camlib.py
  3. 5 1
      flatcamTools/ToolMove.py

+ 1 - 0
README.md

@@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing.
 4.03.2019
 
 - finished work on object hovering
+- fixed Excellon object move and all the other transformations
 
 3.03.2019
 

+ 79 - 6
camlib.py

@@ -3721,7 +3721,6 @@ class Excellon(Geometry):
                             headerless = True
                             try:
                                 self.convert_units({"INCH": "IN", "METRIC": "MM"}[self.excellon_units])
-                                print("Units converted .............................. %s" % self.excellon_units)
                             except Exception as e:
                                 log.warning("Units could not be converted: %s" % str(e))
 
@@ -4427,10 +4426,24 @@ class Excellon(Geometry):
         else:
             px, py = point
 
+        def scale_geom(obj):
+            if type(obj) is list:
+                new_obj = []
+                for g in obj:
+                    new_obj.append(scale_geom(g))
+                return new_obj
+            else:
+                return affinity.scale(obj, xfactor,
+                                             yfactor, origin=(px, py))
+
         # Drills
         for drill in self.drills:
             drill['point'] = affinity.scale(drill['point'], xfactor, yfactor, origin=(px, py))
 
+        # scale solid_geometry
+        for tool in self.tools:
+            self.tools[tool]['solid_geometry'] = scale_geom(self.tools[tool]['solid_geometry'])
+
         # Slots
         for slot in self.slots:
             slot['stop'] = affinity.scale(slot['stop'], xfactor, yfactor, origin=(px, py))
@@ -4449,14 +4462,22 @@ class Excellon(Geometry):
 
         dx, dy = vect
 
+        def offset_geom(obj):
+            if type(obj) is list:
+                new_obj = []
+                for g in obj:
+                    new_obj.append(offset_geom(g))
+                return new_obj
+            else:
+                return affinity.translate(obj, xoff=dx, yoff=dy)
+
         # Drills
         for drill in self.drills:
             drill['point'] = affinity.translate(drill['point'], xoff=dx, yoff=dy)
 
         # offset solid_geometry
         for tool in self.tools:
-            for geo in self.tools[tool]['solid_geometry']:
-                geo = affinity.translate(geo, xoff=dx, yoff=dy)
+            self.tools[tool]['solid_geometry'] = offset_geom(self.tools[tool]['solid_geometry'])
 
         # Slots
         for slot in self.slots:
@@ -4478,11 +4499,24 @@ class Excellon(Geometry):
         px, py = point
         xscale, yscale = {"X": (1.0, -1.0), "Y": (-1.0, 1.0)}[axis]
 
+        def mirror_geom(obj):
+            if type(obj) is list:
+                new_obj = []
+                for g in obj:
+                    new_obj.append(mirror_geom(g))
+                return new_obj
+            else:
+                return affinity.scale(obj, xscale, yscale, origin=(px, py))
+
         # Modify data
         # Drills
         for drill in self.drills:
             drill['point'] = affinity.scale(drill['point'], xscale, yscale, origin=(px, py))
 
+        # mirror solid_geometry
+        for tool in self.tools:
+            self.tools[tool]['solid_geometry'] = mirror_geom(self.tools[tool]['solid_geometry'])
+
         # Slots
         for slot in self.slots:
             slot['stop'] = affinity.scale(slot['stop'], xscale, yscale, origin=(px, py))
@@ -4512,16 +4546,30 @@ class Excellon(Geometry):
         if angle_y is None:
             angle_y = 0.0
 
+        def skew_geom(obj):
+            if type(obj) is list:
+                new_obj = []
+                for g in obj:
+                    new_obj.append(skew_geom(g))
+                return new_obj
+            else:
+                return affinity.skew(obj, angle_x, angle_y, origin=(px, py))
+
         if point is None:
+            px, py = 0, 0
+
             # Drills
             for drill in self.drills:
                 drill['point'] = affinity.skew(drill['point'], angle_x, angle_y,
-                                               origin=(0, 0))
+                                               origin=(px, py))
+            # skew solid_geometry
+            for tool in self.tools:
+                self.tools[tool]['solid_geometry'] = skew_geom(self.tools[tool]['solid_geometry'])
 
             # Slots
             for slot in self.slots:
-                slot['stop'] = affinity.skew(slot['stop'], angle_x, angle_y, origin=(0, 0))
-                slot['start'] = affinity.skew(slot['start'], angle_x, angle_y, origin=(0, 0))
+                slot['stop'] = affinity.skew(slot['stop'], angle_x, angle_y, origin=(px, py))
+                slot['start'] = affinity.skew(slot['start'], angle_x, angle_y, origin=(px, py))
         else:
             px, py = point
             # Drills
@@ -4529,6 +4577,10 @@ class Excellon(Geometry):
                 drill['point'] = affinity.skew(drill['point'], angle_x, angle_y,
                                                origin=(px, py))
 
+            # skew solid_geometry
+            for tool in self.tools:
+                self.tools[tool]['solid_geometry'] = skew_geom( self.tools[tool]['solid_geometry'])
+
             # Slots
             for slot in self.slots:
                 slot['stop'] = affinity.skew(slot['stop'], angle_x, angle_y, origin=(px, py))
@@ -4543,11 +4595,28 @@ class Excellon(Geometry):
         :param point: tuple of coordinates (x, y)
         :return:
         """
+
+        def rotate_geom(obj, origin=None):
+            if type(obj) is list:
+                new_obj = []
+                for g in obj:
+                    new_obj.append(rotate_geom(g))
+                return new_obj
+            else:
+                if origin:
+                    return affinity.rotate(obj, angle, origin=origin)
+                else:
+                    return affinity.rotate(obj, angle, origin=(px, py))
+
         if point is None:
             # Drills
             for drill in self.drills:
                 drill['point'] = affinity.rotate(drill['point'], angle, origin='center')
 
+            # rotate solid_geometry
+            for tool in self.tools:
+                self.tools[tool]['solid_geometry'] = rotate_geom(self.tools[tool]['solid_geometry'], origin='center')
+
             # Slots
             for slot in self.slots:
                 slot['stop'] = affinity.rotate(slot['stop'], angle, origin='center')
@@ -4558,6 +4627,10 @@ class Excellon(Geometry):
             for drill in self.drills:
                 drill['point'] = affinity.rotate(drill['point'], angle, origin=(px, py))
 
+            # rotate solid_geometry
+            for tool in self.tools:
+                self.tools[tool]['solid_geometry'] = rotate_geom(self.tools[tool]['solid_geometry'])
+
             # Slots
             for slot in self.slots:
                 slot['stop'] = affinity.rotate(slot['stop'], angle, origin=(px, py))

+ 5 - 1
flatcamTools/ToolMove.py

@@ -125,7 +125,11 @@ class ToolMove(FlatCAMTool):
                                     # offset
                                     sel_obj.offset((dx, dy))
                                     sel_obj.plot()
-                                    sel_obj.replotApertures.emit()
+
+                                    try:
+                                        sel_obj.replotApertures.emit()
+                                    except:
+                                        pass
 
                                     # Update the object bounding box options
                                     a,b,c,d = sel_obj.bounds()