Przeglądaj źródła

- NCC Tool - now the tools can be reordered (if the order UI radio is set to 'no')
- remade the UI in Paint Tool and the tools in tools table ca now be reordered (if the order UI radio is set to 'no')
- some updates in NCC Tool using code from Paint Tool

Marius Stanciu 5 lat temu
rodzic
commit
1fb1b1cdbe
3 zmienionych plików z 703 dodań i 1088 usunięć
  1. 3 0
      CHANGELOG.md
  2. 128 53
      appTools/ToolNCC.py
  3. 572 1035
      appTools/ToolPaint.py

+ 3 - 0
CHANGELOG.md

@@ -14,6 +14,9 @@ CHANGELOG for FlatCAM beta
 - modified the FCLabel GUI element
 - NCC Tool - remade and optimized the copper clearing with rest machining: now it works as expected with a reasonable performance
 - fixed issue #428 - Cutout Tool -> Freeform geometry was not generated due of trying to get the bounds of the solid_geometry before it was available
+- NCC Tool - now the tools can be reordered (if the order UI radio is set to 'no')
+- remade the UI in Paint Tool and the tools in tools table ca now be reordered (if the order UI radio is set to 'no')
+- some updates in NCC Tool using code from Paint Tool
 
 13.06.2020
 

+ 128 - 53
appTools/ToolNCC.py

@@ -115,7 +115,7 @@ class NonCopperClear(AppTool, Gerber):
         self.select_method = None
         self.tool_type_item_options = []
 
-        self.grb_circle_steps = int(self.app.defaults["gerber_circle_steps"])
+        self.circle_steps = int(self.app.defaults["gerber_circle_steps"])
 
         self.tooldia = None
 
@@ -183,6 +183,14 @@ class NonCopperClear(AppTool, Gerber):
         self.bound_obj_name = ''
 
         self.build_ui()
+
+        # all the tools are selected by default
+        # self.ui.tools_table.selectColumn(0)
+        self.ui.tools_table.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection)
+        for row in range(self.ui.tools_table.rowCount()):
+            self.ui.tools_table.selectRow(row)
+        self.ui.tools_table.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
+
         self.app.ui.notebook.setTabText(2, _("NCC Tool"))
 
     def connect_signals_at_init(self):
@@ -239,14 +247,43 @@ class NonCopperClear(AppTool, Gerber):
         except AttributeError:
             return
 
+    def on_toggle_all_rows(self):
+        """
+        will toggle the selection of all rows in Tools table
+
+        :return:
+        """
+        sel_model = self.ui.tools_table.selectionModel()
+        sel_indexes = sel_model.selectedIndexes()
+
+        # it will iterate over all indexes which means all items in all columns too but I'm interested only on rows
+        sel_rows = set()
+        for idx in sel_indexes:
+            sel_rows.add(idx.row())
+
+        if len(sel_rows) == self.ui.tools_table.rowCount():
+            self.ui.tools_table.clearSelection()
+        else:
+            self.ui.tools_table.selectAll()
+        self.update_ui()
+
     def on_row_selection_change(self):
+        self.update_ui()
+
+    def update_ui(self):
         self.blockSignals(True)
 
-        sel_rows = [it.row() for it in self.ui.tools_table.selectedItems()]
-        # sel_rows = sorted(set(index.row() for index in self.ui.tools_table.selectedIndexes()))
+        sel_rows = set()
+        table_items = self.ui.tools_table.selectedItems()
+        if table_items:
+            for it in table_items:
+                sel_rows.add(it.row())
+            # sel_rows = sorted(set(index.row() for index in self.ui.tools_table.selectedIndexes()))
+        else:
+            sel_rows = [0]
 
         if not sel_rows:
-            sel_rows = [0]
+            return
 
         for current_row in sel_rows:
             # populate the form with the data from the tool associated with the row parameter
@@ -272,8 +309,7 @@ class NonCopperClear(AppTool, Gerber):
                         if int(tooluid_key) == tooluid:
                             for key, value in tooluid_value.items():
                                 if key == 'data':
-                                    form_value_storage = tooluid_value[key]
-                                    self.storage_to_form(form_value_storage)
+                                    self.storage_to_form(tooluid_value['data'])
                 except Exception as e:
                     log.debug("NonCopperClear ---> update_ui() " + str(e))
             else:
@@ -555,6 +591,27 @@ class NonCopperClear(AppTool, Gerber):
 
         self.sel_rect = []
 
+        self.ui.tools_table.drag_drop_sig.connect(self.rebuild_ui)
+
+    def rebuild_ui(self):
+        # read the table tools uid
+        current_uid_list = []
+        for row in range(self.ui.tools_table.rowCount()):
+            uid = int(self.ui.tools_table.item(row,3).text())
+            current_uid_list.append(uid)
+
+        new_tools = {}
+        new_uid = 1
+
+        for current_uid in current_uid_list:
+            new_tools[new_uid] = deepcopy(self.ncc_tools[current_uid])
+            new_uid += 1
+
+        self.ncc_tools = new_tools
+
+        # the tools table changed therefore we need to rebuild it
+        QtCore.QTimer.singleShot(20, self.build_ui)
+
     def build_ui(self):
         self.ui_disconnect()
 
@@ -610,9 +667,6 @@ class NonCopperClear(AppTool, Gerber):
             self.ui.tools_table.item(row, 1).setFlags(
                 QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
 
-        # all the tools are selected by default
-        self.ui.tools_table.selectColumn(0)
-        #
         self.ui.tools_table.resizeColumnsToContents()
         self.ui.tools_table.resizeRowsToContents()
 
@@ -626,20 +680,16 @@ class NonCopperClear(AppTool, Gerber):
         horizontal_header.resizeSection(0, 20)
         horizontal_header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch)
 
-        # self.ui.tools_table.setSortingEnabled(True)
-        # sort by tool diameter
-        # self.ui.tools_table.sortItems(1)
-
         self.ui.tools_table.setMinimumHeight(self.ui.tools_table.getHeight())
         self.ui.tools_table.setMaximumHeight(self.ui.tools_table.getHeight())
 
         self.ui_connect()
 
         # set the text on tool_data_label after loading the object
-        sel_rows = []
+        sel_rows = set()
         sel_items = self.ui.tools_table.selectedItems()
         for it in sel_items:
-            sel_rows.append(it.row())
+            sel_rows.add(it.row())
         if len(sel_rows) > 1:
             self.ui.tool_data_label.setText(
                 "<b>%s: <font color='#0000FF'>%s</font></b>" % (_('Parameters for'), _("Multiple Tools"))
@@ -650,7 +700,7 @@ class NonCopperClear(AppTool, Gerber):
 
         # rows selected
         self.ui.tools_table.clicked.connect(self.on_row_selection_change)
-        self.ui.tools_table.horizontalHeader().sectionClicked.connect(self.on_row_selection_change)
+        self.ui.tools_table.horizontalHeader().sectionClicked.connect(self.on_toggle_all_rows)
 
         for row in range(self.ui.tools_table.rowCount()):
             try:
@@ -771,8 +821,8 @@ class NonCopperClear(AppTool, Gerber):
             self.ui.area_shape_radio.show()
 
             # disable rest-machining for area painting
-            self.ui.ncc_rest_cb.set_value(False)
-            self.ui.ncc_rest_cb.setDisabled(True)
+            # self.ui.ncc_rest_cb.set_value(False)
+            # self.ui.ncc_rest_cb.setDisabled(True)
         else:
             self.ui.reference_combo.show()
             self.ui.reference_combo_label.show()
@@ -954,6 +1004,12 @@ class NonCopperClear(AppTool, Gerber):
         self.blockSignals(False)
         self.build_ui()
 
+        # select the tool just added
+        for row in range(self.ui.tools_table.rowCount()):
+            if int(self.ui.tools_table.item(row, 3).text()) == self.tooluid:
+                self.ui.tools_table.selectRow(row)
+                break
+
     def on_tool_edit(self, item):
         self.blockSignals(True)
 
@@ -999,8 +1055,8 @@ class NonCopperClear(AppTool, Gerber):
         """
         Will delete a tool in the tool table
 
-        :param rows_to_delete: which rows to delete; can be a list
-        :param all_tools: delete all tools in the tool table
+        :param rows_to_delete:  which rows to delete; can be a list
+        :param all_tools:       delete all tools in the tool table
         :return:
         """
         self.blockSignals(True)
@@ -1054,7 +1110,7 @@ class NonCopperClear(AppTool, Gerber):
 
     def on_ncc_click(self):
         """
-        Slot for clicking signal of the self.generate.ncc_button
+        Slot for clicking signal
         :return: None
         """
 
@@ -1070,7 +1126,9 @@ class NonCopperClear(AppTool, Gerber):
 
         self.sel_rect = []
 
-        self.grb_circle_steps = int(self.app.defaults["gerber_circle_steps"])
+        obj_type = self.ui.type_obj_radio.get_value
+        self.circle_steps = int(self.app.defaults["gerber_circle_steps"]) if obj_type == 'gerber' else \
+            int(self.app.defaults["geometry_circle_steps"])
         self.obj_name = self.ui.object_combo.currentText()
 
         # Get source object.
@@ -1089,8 +1147,9 @@ class NonCopperClear(AppTool, Gerber):
         # use the selected tools in the tool table; get diameters for non-copper clear
         self.ncc_dia_list = []
 
-        if self.ui.tools_table.selectedItems():
-            for x in self.ui.tools_table.selectedItems():
+        table_items = self.ui.tools_table.selectedItems()
+        if table_items:
+            for x in table_items:
                 try:
                     self.tooldia = float(self.ui.tools_table.item(x.row(), 1).text())
                 except ValueError:
@@ -1098,8 +1157,7 @@ class NonCopperClear(AppTool, Gerber):
                     try:
                         self.tooldia = float(self.ui.tools_table.item(x.row(), 1).text().replace(',', '.'))
                     except ValueError:
-                        self.app.inform.emit('[ERROR_NOTCL] %s' % _("Wrong Tool Dia value format entered, "
-                                                                    "use a number."))
+                        self.app.inform.emit('[ERROR_NOTCL] %s' % _("Wrong value format entered, use a number."))
                         continue
 
                 # find out which tools is for isolation and which are for copper clearing
@@ -1187,7 +1245,7 @@ class NonCopperClear(AppTool, Gerber):
             if shape_type == "square":
                 if self.first_click is False:
                     self.first_click = True
-                    self.app.inform.emit('[WARNING_NOTCL] %s' % _("Click the end point of the paint area."))
+                    self.app.inform.emit('[WARNING_NOTCL] %s' % _("Click the end point of the area."))
 
                     self.cursor_pos = self.app.plotcanvas.translate_coords(event_pos)
                     if self.app.grid_status():
@@ -1274,11 +1332,8 @@ class NonCopperClear(AppTool, Gerber):
 
             self.sel_rect = cascaded_union(self.sel_rect)
 
-            self.clear_copper(ncc_obj=self.ncc_obj,
-                              sel_obj=self.bound_obj,
-                              ncctooldia=self.ncc_dia_list,
-                              isotooldia=self.iso_dia_list,
-                              outname=self.o_name)
+            self.clear_copper(ncc_obj=self.ncc_obj, sel_obj=self.bound_obj, ncctooldia=self.ncc_dia_list,
+                              isotooldia=self.iso_dia_list, outname=self.o_name)
 
     # called on mouse move
     def on_mouse_move(self, event):
@@ -1386,6 +1441,22 @@ class NonCopperClear(AppTool, Gerber):
                 self.app.plotcanvas.graph_event_disconnect(self.mm)
                 self.app.plotcanvas.graph_event_disconnect(self.kp)
 
+            try:
+                # restore the Grid snapping if it was active before
+                if self.grid_status_memory is True:
+                    self.app.ui.grid_snap_btn.trigger()
+
+                if self.app.is_legacy is False:
+                    self.app.plotcanvas.graph_event_disconnect('mouse_release', self.on_single_poly_mouse_release)
+                    self.app.plotcanvas.graph_event_disconnect('key_press', self.on_key_press)
+                else:
+                    self.app.plotcanvas.graph_event_disconnect(self.mr)
+                    self.app.plotcanvas.graph_event_disconnect(self.kp)
+
+                self.app.tool_shapes.clear(update=True)
+            except Exception as e:
+                log.debug("ToolPaint.on_key_press() _2 --> %s" % str(e))
+
             self.app.mp = self.app.plotcanvas.graph_event_connect('mouse_press',
                                                                   self.app.on_mouse_click_over_plot)
             self.app.mm = self.app.plotcanvas.graph_event_connect('mouse_move',
@@ -1394,6 +1465,7 @@ class NonCopperClear(AppTool, Gerber):
                                                                   self.app.on_mouse_click_release_over_plot)
             self.points = []
             self.poly_drawn = False
+
             self.delete_moving_selection_shape()
             self.delete_tool_selection_shape()
 
@@ -1711,7 +1783,7 @@ class NonCopperClear(AppTool, Gerber):
         if ncc_method == _("Standard"):
             try:
                 cp = self.clear_polygon(pol, tooldia,
-                                        steps_per_circle=self.grb_circle_steps,
+                                        steps_per_circle=self.circle_steps,
                                         overlap=ncc_overlap, contour=ncc_contour,
                                         connect=ncc_connect,
                                         prog_plot=prog_plot)
@@ -1722,7 +1794,7 @@ class NonCopperClear(AppTool, Gerber):
         elif ncc_method == _("Seed"):
             try:
                 cp = self.clear_polygon2(pol, tooldia,
-                                         steps_per_circle=self.grb_circle_steps,
+                                         steps_per_circle=self.circle_steps,
                                          overlap=ncc_overlap, contour=ncc_contour,
                                          connect=ncc_connect,
                                          prog_plot=prog_plot)
@@ -1733,7 +1805,7 @@ class NonCopperClear(AppTool, Gerber):
         elif ncc_method == _("Lines"):
             try:
                 cp = self.clear_polygon3(pol, tooldia,
-                                         steps_per_circle=self.grb_circle_steps,
+                                         steps_per_circle=self.circle_steps,
                                          overlap=ncc_overlap, contour=ncc_contour,
                                          connect=ncc_connect,
                                          prog_plot=prog_plot)
@@ -1745,7 +1817,7 @@ class NonCopperClear(AppTool, Gerber):
             try:
                 self.app.inform.emit(_("Clearing the polygon with the method: lines."))
                 cp = self.clear_polygon3(pol, tooldia,
-                                         steps_per_circle=self.grb_circle_steps,
+                                         steps_per_circle=self.circle_steps,
                                          overlap=ncc_overlap, contour=ncc_contour,
                                          connect=ncc_connect,
                                          prog_plot=prog_plot)
@@ -1755,7 +1827,7 @@ class NonCopperClear(AppTool, Gerber):
                 else:
                     self.app.inform.emit(_("Failed. Clearing the polygon with the method: seed."))
                     cp = self.clear_polygon2(pol, tooldia,
-                                             steps_per_circle=self.grb_circle_steps,
+                                             steps_per_circle=self.circle_steps,
                                              overlap=ncc_overlap, contour=ncc_contour,
                                              connect=ncc_connect,
                                              prog_plot=prog_plot)
@@ -1764,7 +1836,7 @@ class NonCopperClear(AppTool, Gerber):
                     else:
                         self.app.inform.emit(_("Failed. Clearing the polygon with the method: standard."))
                         cp = self.clear_polygon(pol, tooldia,
-                                                steps_per_circle=self.grb_circle_steps,
+                                                steps_per_circle=self.circle_steps,
                                                 overlap=ncc_overlap, contour=ncc_contour,
                                                 connect=ncc_connect,
                                                 prog_plot=prog_plot)
@@ -2741,19 +2813,19 @@ class NonCopperClear(AppTool, Gerber):
                                         if pol is not None and isinstance(pol, Polygon):
                                             if ncc_method == 'standard':
                                                 cp = self.clear_polygon(pol, tool,
-                                                                        self.grb_circle_steps,
+                                                                        self.circle_steps,
                                                                         overlap=overlap, contour=contour,
                                                                         connect=connect,
                                                                         prog_plot=False)
                                             elif ncc_method == 'seed':
                                                 cp = self.clear_polygon2(pol, tool,
-                                                                         self.grb_circle_steps,
+                                                                         self.circle_steps,
                                                                          overlap=overlap, contour=contour,
                                                                          connect=connect,
                                                                          prog_plot=False)
                                             else:
                                                 cp = self.clear_polygon3(pol, tool,
-                                                                         self.grb_circle_steps,
+                                                                         self.circle_steps,
                                                                          overlap=overlap, contour=contour,
                                                                          connect=connect,
                                                                          prog_plot=False)
@@ -2769,15 +2841,15 @@ class NonCopperClear(AppTool, Gerber):
                                 except TypeError:
                                     if isinstance(p, Polygon):
                                         if ncc_method == 'standard':
-                                            cp = self.clear_polygon(p, tool, self.grb_circle_steps,
+                                            cp = self.clear_polygon(p, tool, self.circle_steps,
                                                                     overlap=overlap, contour=contour, connect=connect,
                                                                     prog_plot=False)
                                         elif ncc_method == 'seed':
-                                            cp = self.clear_polygon2(p, tool, self.grb_circle_steps,
+                                            cp = self.clear_polygon2(p, tool, self.circle_steps,
                                                                      overlap=overlap, contour=contour, connect=connect,
                                                                      prog_plot=False)
                                         else:
-                                            cp = self.clear_polygon3(p, tool, self.grb_circle_steps,
+                                            cp = self.clear_polygon3(p, tool, self.circle_steps,
                                                                      overlap=overlap, contour=contour, connect=connect,
                                                                      prog_plot=False)
                                         if cp:
@@ -3137,17 +3209,17 @@ class NonCopperClear(AppTool, Gerber):
                                     try:
                                         if ncc_method == 'standard':
                                             cp = self.clear_polygon(p, tool_used,
-                                                                    self.grb_circle_steps,
+                                                                    self.circle_steps,
                                                                     overlap=overlap, contour=contour, connect=connect,
                                                                     prog_plot=False)
                                         elif ncc_method == 'seed':
                                             cp = self.clear_polygon2(p, tool_used,
-                                                                     self.grb_circle_steps,
+                                                                     self.circle_steps,
                                                                      overlap=overlap, contour=contour, connect=connect,
                                                                      prog_plot=False)
                                         else:
                                             cp = self.clear_polygon3(p, tool_used,
-                                                                     self.grb_circle_steps,
+                                                                     self.circle_steps,
                                                                      overlap=overlap, contour=contour, connect=connect,
                                                                      prog_plot=False)
                                         cleared_geo.append(list(cp.get_objects()))
@@ -3166,19 +3238,19 @@ class NonCopperClear(AppTool, Gerber):
                                             try:
                                                 if ncc_method == 'standard':
                                                     cp = self.clear_polygon(poly_p, tool_used,
-                                                                            self.grb_circle_steps,
+                                                                            self.circle_steps,
                                                                             overlap=overlap, contour=contour,
                                                                             connect=connect,
                                                                             prog_plot=False)
                                                 elif ncc_method == 'seed':
                                                     cp = self.clear_polygon2(poly_p, tool_used,
-                                                                             self.grb_circle_steps,
+                                                                             self.circle_steps,
                                                                              overlap=overlap, contour=contour,
                                                                              connect=connect,
                                                                              prog_plot=False)
                                                 else:
                                                     cp = self.clear_polygon3(poly_p, tool_used,
-                                                                             self.grb_circle_steps,
+                                                                             self.circle_steps,
                                                                              overlap=overlap, contour=contour,
                                                                              connect=connect,
                                                                              prog_plot=False)
@@ -3479,8 +3551,11 @@ class NonCopperClear(AppTool, Gerber):
         self.ui_connect()
         self.build_ui()
 
-        # if self.ui.tools_table.rowCount() != 0:
-        #     self.param_frame.setDisabled(False)
+        # select the tool just added
+        for row in range(self.ui.tools_table.rowCount()):
+            if int(self.ui.tools_table.item(row, 3).text()) == self.tooluid:
+                self.ui.tools_table.selectRow(row)
+                break
 
     def on_ncc_tool_add_from_db_clicked(self):
         """
@@ -3589,7 +3664,7 @@ class NccUI:
         )
         self.tools_box.addWidget(self.tools_table_label)
 
-        self.tools_table = FCTable()
+        self.tools_table = FCTable(drag_drop=True)
         self.tools_box.addWidget(self.tools_table)
 
         self.tools_table.setColumnCount(4)

Plik diff jest za duży
+ 572 - 1035
appTools/ToolPaint.py


Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików