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

- minor UI changes for Gerber UI
- after an object move, the apertures plotted shapes are deleted from canvas and the mark all button is deselected
- fixed offset, rotate, scale, skew for follow_geometry. Fixed the move tool also.
- fixed offset, rotate, scale, skew for 'solid_geometry' inside the self.apertures.

Marius Stanciu 6 лет назад
Родитель
Сommit
d79d6cf2bc
6 измененных файлов с 71 добавлено и 13 удалено
  1. 20 8
      FlatCAMObj.py
  2. 3 3
      ObjectUI.py
  3. 10 0
      README.md
  4. 33 1
      camlib.py
  5. 4 0
      flatcamTools/ToolMove.py
  6. 1 1
      flatcamTools/ToolProperties.py

+ 20 - 8
FlatCAMObj.py

@@ -365,6 +365,8 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
     Represents Gerber code.
     Represents Gerber code.
     """
     """
     optionChanged = QtCore.pyqtSignal(str)
     optionChanged = QtCore.pyqtSignal(str)
+    replotApertures = QtCore.pyqtSignal()
+
     ui_type = GerberObjectUI
     ui_type = GerberObjectUI
 
 
     @staticmethod
     @staticmethod
@@ -481,9 +483,10 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
         :return: None
         :return: None
         """
         """
         FlatCAMObj.set_ui(self, ui)
         FlatCAMObj.set_ui(self, ui)
-
         FlatCAMApp.App.log.debug("FlatCAMGerber.set_ui()")
         FlatCAMApp.App.log.debug("FlatCAMGerber.set_ui()")
 
 
+        self.replotApertures.connect(self.on_replot_apertures)
+
         self.form_fields.update({
         self.form_fields.update({
             "plot": self.ui.plot_cb,
             "plot": self.ui.plot_cb,
             "multicolored": self.ui.multicolored_cb,
             "multicolored": self.ui.multicolored_cb,
@@ -694,12 +697,12 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
 
 
     def on_mark_cb_click_table(self):
     def on_mark_cb_click_table(self):
         self.ui_disconnect()
         self.ui_disconnect()
-        cw = self.sender()
-        cw_index = self.ui.apertures_table.indexAt(cw.pos())
-        cw_row = cw_index.row()
+        # cw = self.sender()
+        # cw_index = self.ui.apertures_table.indexAt(cw.pos())
+        # cw_row = cw_index.row()
         check_row = 0
         check_row = 0
 
 
-        self.mark_shapes.clear(update=True)
+        self.clear_plot_apertures()
         for aperture in self.apertures:
         for aperture in self.apertures:
             # find the apertures_table row associated with the aperture
             # find the apertures_table row associated with the aperture
             for row in range(self.ui.apertures_table.rowCount()):
             for row in range(self.ui.apertures_table.rowCount()):
@@ -742,7 +745,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                 # self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True)
                 # self.plot_apertures(color='#2d4606bf', marked_aperture=aperture, visible=True)
                 self.plot_apertures(color='#FD6A02', marked_aperture=aperture, visible=True)
                 self.plot_apertures(color='#FD6A02', marked_aperture=aperture, visible=True)
             else:
             else:
-                self.mark_shapes.clear(update=True)
+                self.clear_plot_apertures()
 
 
         self.ui_connect()
         self.ui_connect()
 
 
@@ -1056,7 +1059,7 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
             # on hide disable all mark plots
             # on hide disable all mark plots
             for row in range(self.ui.apertures_table.rowCount()):
             for row in range(self.ui.apertures_table.rowCount()):
                 self.ui.apertures_table.cellWidget(row, 5).set_value(False)
                 self.ui.apertures_table.cellWidget(row, 5).set_value(False)
-            self.mark_shapes.clear(update=True)
+            self.clear_plot_apertures()
 
 
     def on_scale_aperture_click(self, signal):
     def on_scale_aperture_click(self, signal):
         try:
         try:
@@ -1322,10 +1325,19 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                     self.app.progress.emit(100)
                     self.app.progress.emit(100)
 
 
                 except (ObjectDeleted, AttributeError):
                 except (ObjectDeleted, AttributeError):
-                    self.mark_shapes.clear(update=True)
+                    self.clear_plot_apertures()
 
 
             self.app.worker_task.emit({'fcn': job_thread, 'params': [self]})
             self.app.worker_task.emit({'fcn': job_thread, 'params': [self]})
 
 
+    def clear_plot_apertures(self):
+        self.mark_shapes.clear(update=True)
+
+    def clear_mark_all(self):
+        self.ui.mark_all_cb.set_value(False)
+
+    def on_replot_apertures(self):
+        pass
+
     def serialize(self):
     def serialize(self):
         return {
         return {
             "options": self.options,
             "options": self.options,

+ 3 - 3
ObjectUI.py

@@ -398,7 +398,7 @@ class GerberObjectUI(ObjectUI):
         self.generate_iso_button.setFixedWidth(90)
         self.generate_iso_button.setFixedWidth(90)
         hlay_1.addWidget(self.generate_iso_button)
         hlay_1.addWidget(self.generate_iso_button)
 
 
-        hlay_1.addStretch()
+        # hlay_1.addStretch()
 
 
         self.generate_ext_iso_button = QtWidgets.QPushButton('Ext Geo')
         self.generate_ext_iso_button = QtWidgets.QPushButton('Ext Geo')
         self.generate_ext_iso_button.setToolTip(
         self.generate_ext_iso_button.setToolTip(
@@ -406,7 +406,7 @@ class GerberObjectUI(ObjectUI):
             "for isolation routing containing\n"
             "for isolation routing containing\n"
             "only the exteriors geometry."
             "only the exteriors geometry."
         )
         )
-        # self.generate_ext_iso_button.setFixedWidth(60)
+        # self.generate_ext_iso_button.setFixedWidth(100)
         hlay_1.addWidget(self.generate_ext_iso_button)
         hlay_1.addWidget(self.generate_ext_iso_button)
 
 
         self.generate_int_iso_button = QtWidgets.QPushButton('Int Geo')
         self.generate_int_iso_button = QtWidgets.QPushButton('Int Geo')
@@ -415,7 +415,7 @@ class GerberObjectUI(ObjectUI):
             "for isolation routing containing\n"
             "for isolation routing containing\n"
             "only the interiors geometry."
             "only the interiors geometry."
         )
         )
-        # self.generate_int_iso_button.setFixedWidth(60)
+        # self.generate_ext_iso_button.setFixedWidth(90)
         hlay_1.addWidget(self.generate_int_iso_button)
         hlay_1.addWidget(self.generate_int_iso_button)
 
 
         # when the follow checkbox is checked then the exteriors and interiors isolation generation buttons
         # when the follow checkbox is checked then the exteriors and interiors isolation generation buttons

+ 10 - 0
README.md

@@ -9,6 +9,16 @@ CAD program, and create G-Code for Isolation routing.
 
 
 =================================================
 =================================================
 
 
+3.03.2019
+
+- minor UI changes for Gerber UI
+- after an object move, the apertures plotted shapes are deleted from canvas and the mark all button is deselected
+
+02.03.2019
+
+- fixed offset, rotate, scale, skew for follow_geometry. Fixed the move tool also.
+- fixed offset, rotate, scale, skew for 'solid_geometry' inside the self.apertures.
+
 28.02.2019
 28.02.2019
 
 
 - added a change that when a double click is performed in a object on canvas resulting in a selection, if the notebook is hidden then it will be displayed
 - added a change that when a double click is performed in a object on canvas resulting in a selection, if the notebook is hidden then it will be displayed

+ 33 - 1
camlib.py

@@ -3227,6 +3227,7 @@ class Gerber (Geometry):
                                              yfactor, origin=(px, py))
                                              yfactor, origin=(px, py))
 
 
         self.solid_geometry = scale_geom(self.solid_geometry)
         self.solid_geometry = scale_geom(self.solid_geometry)
+        self.follow_geometry = scale_geom(self.follow_geometry)
 
 
         # we need to scale the geometry stored in the Gerber apertures, too
         # we need to scale the geometry stored in the Gerber apertures, too
         try:
         try:
@@ -3237,6 +3238,7 @@ class Gerber (Geometry):
 
 
         self.app.inform.emit("[success]Gerber Scale done.")
         self.app.inform.emit("[success]Gerber Scale done.")
 
 
+
         ## solid_geometry ???
         ## solid_geometry ???
         #  It's a cascaded union of objects.
         #  It's a cascaded union of objects.
         # self.solid_geometry = affinity.scale(self.solid_geometry, factor,
         # self.solid_geometry = affinity.scale(self.solid_geometry, factor,
@@ -3281,8 +3283,16 @@ class Gerber (Geometry):
                 return affinity.translate(obj, xoff=dx, yoff=dy)
                 return affinity.translate(obj, xoff=dx, yoff=dy)
 
 
         ## Solid geometry
         ## Solid geometry
-        # self.solid_geometry = affinity.translate(self.solid_geometry, xoff=dx, yoff=dy)
         self.solid_geometry = offset_geom(self.solid_geometry)
         self.solid_geometry = offset_geom(self.solid_geometry)
+        self.follow_geometry = offset_geom(self.follow_geometry)
+
+        # we need to offset the geometry stored in the Gerber apertures, too
+        try:
+            for apid in self.apertures:
+                self.apertures[apid]['solid_geometry'] = offset_geom(self.apertures[apid]['solid_geometry'])
+        except Exception as e:
+            log.debug('FlatCAMGeometry.offset() --> %s' % str(e))
+
         self.app.inform.emit("[success]Gerber Offset done.")
         self.app.inform.emit("[success]Gerber Offset done.")
 
 
     def mirror(self, axis, point):
     def mirror(self, axis, point):
@@ -3320,6 +3330,14 @@ class Gerber (Geometry):
                 return affinity.scale(obj, xscale, yscale, origin=(px, py))
                 return affinity.scale(obj, xscale, yscale, origin=(px, py))
 
 
         self.solid_geometry = mirror_geom(self.solid_geometry)
         self.solid_geometry = mirror_geom(self.solid_geometry)
+        self.follow_geometry = mirror_geom(self.follow_geometry)
+
+        # we need to mirror the geometry stored in the Gerber apertures, too
+        try:
+            for apid in self.apertures:
+                self.apertures[apid]['solid_geometry'] = mirror_geom(self.apertures[apid]['solid_geometry'])
+        except Exception as e:
+            log.debug('FlatCAMGeometry.mirror() --> %s' % str(e))
 
 
         #  It's a cascaded union of objects.
         #  It's a cascaded union of objects.
         # self.solid_geometry = affinity.scale(self.solid_geometry,
         # self.solid_geometry = affinity.scale(self.solid_geometry,
@@ -3353,7 +3371,14 @@ class Gerber (Geometry):
                 return affinity.skew(obj, angle_x, angle_y, origin=(px, py))
                 return affinity.skew(obj, angle_x, angle_y, origin=(px, py))
 
 
         self.solid_geometry = skew_geom(self.solid_geometry)
         self.solid_geometry = skew_geom(self.solid_geometry)
+        self.follow_geometry = skew_geom(self.follow_geometry)
 
 
+        # we need to skew the geometry stored in the Gerber apertures, too
+        try:
+            for apid in self.apertures:
+                self.apertures[apid]['solid_geometry'] = skew_geom(self.apertures[apid]['solid_geometry'])
+        except Exception as e:
+            log.debug('FlatCAMGeometry.skew() --> %s' % str(e))
         # self.solid_geometry = affinity.skew(self.solid_geometry, angle_x, angle_y, origin=(px, py))
         # self.solid_geometry = affinity.skew(self.solid_geometry, angle_x, angle_y, origin=(px, py))
 
 
     def rotate(self, angle, point):
     def rotate(self, angle, point):
@@ -3376,7 +3401,14 @@ class Gerber (Geometry):
                 return affinity.rotate(obj, angle, origin=(px, py))
                 return affinity.rotate(obj, angle, origin=(px, py))
 
 
         self.solid_geometry = rotate_geom(self.solid_geometry)
         self.solid_geometry = rotate_geom(self.solid_geometry)
+        self.follow_geometry = rotate_geom(self.follow_geometry)
 
 
+        # we need to rotate the geometry stored in the Gerber apertures, too
+        try:
+            for apid in self.apertures:
+                self.apertures[apid]['solid_geometry'] = rotate_geom(self.apertures[apid]['solid_geometry'])
+        except Exception as e:
+            log.debug('FlatCAMGeometry.rotate() --> %s' % str(e))
         # self.solid_geometry = affinity.rotate(self.solid_geometry, angle, origin=(px, py))
         # self.solid_geometry = affinity.rotate(self.solid_geometry, angle, origin=(px, py))
 
 
 
 

+ 4 - 0
flatcamTools/ToolMove.py

@@ -122,8 +122,12 @@ class ToolMove(FlatCAMTool):
                             else:
                             else:
                                 for sel_obj in obj_list:
                                 for sel_obj in obj_list:
 
 
+                                    # offset
                                     sel_obj.offset((dx, dy))
                                     sel_obj.offset((dx, dy))
                                     sel_obj.plot()
                                     sel_obj.plot()
+                                    sel_obj.clear_plot_apertures()
+                                    sel_obj.clear_mark_all()
+
                                     # Update the object bounding box options
                                     # Update the object bounding box options
                                     a,b,c,d = sel_obj.bounds()
                                     a,b,c,d = sel_obj.bounds()
                                     sel_obj.options['xmin'] = a
                                     sel_obj.options['xmin'] = a

+ 1 - 1
flatcamTools/ToolProperties.py

@@ -163,7 +163,7 @@ class Properties(FlatCAMTool):
                         printed_value = 'Present' if v else 'None'
                         printed_value = 'Present' if v else 'None'
                         self.addChild(geo_tool, [str(k), printed_value], True)
                         self.addChild(geo_tool, [str(k), printed_value], True)
                     elif k == 'data':
                     elif k == 'data':
-                        tool_data = self.addParent(geo_tool, str(k).capilalize(),
+                        tool_data = self.addParent(geo_tool, str(k).capitalize(),
                                                    color=QtGui.QColor("#000000"), font=font)
                                                    color=QtGui.QColor("#000000"), font=font)
                         for data_k, data_v in v.items():
                         for data_k, data_v in v.items():
                             self.addChild(tool_data, [str(data_k), str(data_v)], True)
                             self.addChild(tool_data, [str(data_k), str(data_v)], True)