Browse Source

- in NCC Tool modified the UI

Marius Stanciu 6 years ago
parent
commit
b6663ddd43
3 changed files with 167 additions and 111 deletions
  1. 1 0
      FlatCAMApp.py
  2. 1 0
      README.md
  3. 165 111
      flatcamTools/ToolNonCopperClear.py

+ 1 - 0
FlatCAMApp.py

@@ -773,6 +773,7 @@ class App(QtCore.QObject):
             # NCC Tool
             # NCC Tool
             "tools_ncctools": "1.0, 0.5",
             "tools_ncctools": "1.0, 0.5",
             "tools_nccorder": 'rev',
             "tools_nccorder": 'rev',
+            "tools_nccoperation": 'clear',
             "tools_nccoverlap": 40,
             "tools_nccoverlap": 40,
             "tools_nccmargin": 1.0,
             "tools_nccmargin": 1.0,
             "tools_nccmethod": "seed",
             "tools_nccmethod": "seed",

+ 1 - 0
README.md

@@ -12,6 +12,7 @@ CAD program, and create G-Code for Isolation routing.
 20.02.2020
 20.02.2020
 
 
 - in Paint Tool replaced the Selection radio with a combobox GUI element that is more compact
 - in Paint Tool replaced the Selection radio with a combobox GUI element that is more compact
+- in NCC Tool modified the UI
 
 
 19.02.2020
 19.02.2020
 
 

+ 165 - 111
flatcamTools/ToolNonCopperClear.py

@@ -124,8 +124,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.tools_table = FCTable()
         self.tools_table = FCTable()
         self.tools_box.addWidget(self.tools_table)
         self.tools_box.addWidget(self.tools_table)
 
 
-        self.tools_table.setColumnCount(5)
-        self.tools_table.setHorizontalHeaderLabels(['#', _('Diameter'), _('TT'), '', _("Operation")])
+        self.tools_table.setColumnCount(4)
+        self.tools_table.setHorizontalHeaderLabels(['#', _('Diameter'), _('TT'), ''])
         self.tools_table.setColumnHidden(3, True)
         self.tools_table.setColumnHidden(3, True)
         self.tools_table.setSortingEnabled(False)
         self.tools_table.setSortingEnabled(False)
         # self.tools_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
         # self.tools_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
@@ -155,37 +155,17 @@ class NonCopperClear(FlatCAMTool, Gerber):
               "Choosing the 'V-Shape' Tool Type automatically will select the Operation Type\n"
               "Choosing the 'V-Shape' Tool Type automatically will select the Operation Type\n"
               "in the resulting geometry as Isolation."))
               "in the resulting geometry as Isolation."))
 
 
-        self.tools_table.horizontalHeaderItem(4).setToolTip(
-            _("The 'Operation' can be:\n"
-              "- Isolation -> will ensure that the non-copper clearing is always complete.\n"
-              "If it's not successful then the non-copper clearing will fail, too.\n"
-              "- Clear -> the regular non-copper clearing."))
+        # self.tools_table.horizontalHeaderItem(4).setToolTip(
+        #     _("The 'Operation' can be:\n"
+        #       "- Isolation -> will ensure that the non-copper clearing is always complete.\n"
+        #       "If it's not successful then the non-copper clearing will fail, too.\n"
+        #       "- Clear -> the regular non-copper clearing."))
 
 
         grid1 = QtWidgets.QGridLayout()
         grid1 = QtWidgets.QGridLayout()
         self.tools_box.addLayout(grid1)
         self.tools_box.addLayout(grid1)
         grid1.setColumnStretch(0, 0)
         grid1.setColumnStretch(0, 0)
         grid1.setColumnStretch(1, 1)
         grid1.setColumnStretch(1, 1)
 
 
-        # Milling Type Radio Button
-        self.milling_type_label = QtWidgets.QLabel('%s:' % _('Milling Type'))
-        self.milling_type_label.setToolTip(
-            _("Milling type when the selected tool is of type: 'iso_op':\n"
-              "- climb / best for precision milling and to reduce tool usage\n"
-              "- conventional / useful when there is no backlash compensation")
-        )
-
-        self.milling_type_radio = RadioSet([{'label': _('Climb'), 'value': 'cl'},
-                                            {'label': _('Conventional'), 'value': 'cv'}])
-        self.milling_type_radio.setToolTip(
-            _("Milling type when the selected tool is of type: 'iso_op':\n"
-              "- climb / best for precision milling and to reduce tool usage\n"
-              "- conventional / useful when there is no backlash compensation")
-        )
-        self.milling_type_radio.setObjectName(_("Milling Type"))
-
-        grid1.addWidget(self.milling_type_label, 0, 0)
-        grid1.addWidget(self.milling_type_radio, 0, 1)
-
         # Tool order
         # Tool order
         self.ncc_order_label = QtWidgets.QLabel('%s:' % _('Tool order'))
         self.ncc_order_label = QtWidgets.QLabel('%s:' % _('Tool order'))
         self.ncc_order_label.setToolTip(_("This set the way that the tools in the tools table are used.\n"
         self.ncc_order_label.setToolTip(_("This set the way that the tools in the tools table are used.\n"
@@ -213,9 +193,6 @@ class NonCopperClear(FlatCAMTool, Gerber):
         separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
         separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
         grid1.addWidget(separator_line, 2, 0, 1, 2)
         grid1.addWidget(separator_line, 2, 0, 1, 2)
 
 
-        self.milling_type_label.hide()
-        self.milling_type_radio.hide()
-
         # #############################################################
         # #############################################################
         # ############### Tool selection ##############################
         # ############### Tool selection ##############################
         # #############################################################
         # #############################################################
@@ -356,6 +333,47 @@ class NonCopperClear(FlatCAMTool, Gerber):
         )
         )
         self.grid3.addWidget(self.tool_data_label, 12, 0, 1, 2)
         self.grid3.addWidget(self.tool_data_label, 12, 0, 1, 2)
 
 
+        # Operation
+        op_label = QtWidgets.QLabel('%s:' % _('Operation'))
+        op_label.setToolTip(
+            _("The 'Operation' can be:\n"
+              "- Isolation -> will ensure that the non-copper clearing is always complete.\n"
+              "If it's not successful then the non-copper clearing will fail, too.\n"
+              "- Clear -> the regular non-copper clearing.")
+        )
+
+        self.op_radio = RadioSet([
+            {"label": _("Clear"), "value": "clear"},
+            {"label": _("Isolation"), "value": "iso"}
+        ], orientation='horizontal', stretch=False)
+        self.op_radio.setObjectName("n_operation")
+
+        self.grid3.addWidget(op_label, 13, 0)
+        self.grid3.addWidget(self.op_radio, 13, 1)
+
+        # Milling Type Radio Button
+        self.milling_type_label = QtWidgets.QLabel('%s:' % _('Milling Type'))
+        self.milling_type_label.setToolTip(
+            _("Milling type when the selected tool is of type: 'iso_op':\n"
+              "- climb / best for precision milling and to reduce tool usage\n"
+              "- conventional / useful when there is no backlash compensation")
+        )
+
+        self.milling_type_radio = RadioSet([{'label': _('Climb'), 'value': 'cl'},
+                                            {'label': _('Conventional'), 'value': 'cv'}])
+        self.milling_type_radio.setToolTip(
+            _("Milling type when the selected tool is of type: 'iso_op':\n"
+              "- climb / best for precision milling and to reduce tool usage\n"
+              "- conventional / useful when there is no backlash compensation")
+        )
+        self.milling_type_radio.setObjectName("n_milling_type")
+
+        self.milling_type_label.setEnabled(False)
+        self.milling_type_radio.setEnabled(False)
+
+        self.grid3.addWidget(self.milling_type_label, 14, 0)
+        self.grid3.addWidget(self.milling_type_radio, 14, 1)
+
         # Overlap Entry
         # Overlap Entry
         nccoverlabel = QtWidgets.QLabel('%s:' % _('Overlap'))
         nccoverlabel = QtWidgets.QLabel('%s:' % _('Overlap'))
         nccoverlabel.setToolTip(
         nccoverlabel.setToolTip(
@@ -372,10 +390,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.ncc_overlap_entry.setWrapping(True)
         self.ncc_overlap_entry.setWrapping(True)
         self.ncc_overlap_entry.setRange(0.000, 99.9999)
         self.ncc_overlap_entry.setRange(0.000, 99.9999)
         self.ncc_overlap_entry.setSingleStep(0.1)
         self.ncc_overlap_entry.setSingleStep(0.1)
-        self.ncc_overlap_entry.setObjectName(_("Overlap"))
+        self.ncc_overlap_entry.setObjectName("n_overlap")
 
 
-        self.grid3.addWidget(nccoverlabel, 13, 0)
-        self.grid3.addWidget(self.ncc_overlap_entry, 13, 1)
+        self.grid3.addWidget(nccoverlabel, 15, 0)
+        self.grid3.addWidget(self.ncc_overlap_entry, 15, 1)
 
 
         # Margin
         # Margin
         nccmarginlabel = QtWidgets.QLabel('%s:' % _('Margin'))
         nccmarginlabel = QtWidgets.QLabel('%s:' % _('Margin'))
@@ -385,10 +403,10 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.ncc_margin_entry = FCDoubleSpinner(callback=self.confirmation_message)
         self.ncc_margin_entry = FCDoubleSpinner(callback=self.confirmation_message)
         self.ncc_margin_entry.set_precision(self.decimals)
         self.ncc_margin_entry.set_precision(self.decimals)
         self.ncc_margin_entry.set_range(-9999.9999, 9999.9999)
         self.ncc_margin_entry.set_range(-9999.9999, 9999.9999)
-        self.ncc_margin_entry.setObjectName(_("Margin"))
+        self.ncc_margin_entry.setObjectName("n_margin")
 
 
-        self.grid3.addWidget(nccmarginlabel, 14, 0)
-        self.grid3.addWidget(self.ncc_margin_entry, 14, 1)
+        self.grid3.addWidget(nccmarginlabel, 16, 0)
+        self.grid3.addWidget(self.ncc_margin_entry, 16, 1)
 
 
         # Method
         # Method
         methodlabel = QtWidgets.QLabel('%s:' % _('Method'))
         methodlabel = QtWidgets.QLabel('%s:' % _('Method'))
@@ -403,34 +421,34 @@ class NonCopperClear(FlatCAMTool, Gerber):
             {"label": _("Seed-based"), "value": "seed"},
             {"label": _("Seed-based"), "value": "seed"},
             {"label": _("Straight lines"), "value": "lines"}
             {"label": _("Straight lines"), "value": "lines"}
         ], orientation='vertical', stretch=False)
         ], orientation='vertical', stretch=False)
-        self.ncc_method_radio.setObjectName(_("Method"))
+        self.ncc_method_radio.setObjectName("n_method")
 
 
-        self.grid3.addWidget(methodlabel, 15, 0)
-        self.grid3.addWidget(self.ncc_method_radio, 15, 1)
+        self.grid3.addWidget(methodlabel, 17, 0)
+        self.grid3.addWidget(self.ncc_method_radio, 17, 1)
 
 
         # Connect lines
         # Connect lines
         self.ncc_connect_cb = FCCheckBox('%s' % _("Connect"))
         self.ncc_connect_cb = FCCheckBox('%s' % _("Connect"))
-        self.ncc_connect_cb.setObjectName(_("Connect"))
+        self.ncc_connect_cb.setObjectName("n_connect")
 
 
         self.ncc_connect_cb.setToolTip(
         self.ncc_connect_cb.setToolTip(
             _("Draw lines between resulting\n"
             _("Draw lines between resulting\n"
               "segments to minimize tool lifts.")
               "segments to minimize tool lifts.")
         )
         )
-        self.grid3.addWidget(self.ncc_connect_cb, 16, 0)
+        self.grid3.addWidget(self.ncc_connect_cb, 18, 0)
 
 
         # Contour
         # Contour
         self.ncc_contour_cb = FCCheckBox('%s' % _("Contour"))
         self.ncc_contour_cb = FCCheckBox('%s' % _("Contour"))
-        self.ncc_contour_cb.setObjectName(_("Contour"))
+        self.ncc_contour_cb.setObjectName("n_contour")
 
 
         self.ncc_contour_cb.setToolTip(
         self.ncc_contour_cb.setToolTip(
             _("Cut around the perimeter of the polygon\n"
             _("Cut around the perimeter of the polygon\n"
               "to trim rough edges.")
               "to trim rough edges.")
         )
         )
-        self.grid3.addWidget(self.ncc_contour_cb, 16, 1)
+        self.grid3.addWidget(self.ncc_contour_cb, 18, 1)
 
 
         # ## NCC Offset choice
         # ## NCC Offset choice
         self.ncc_choice_offset_cb = FCCheckBox('%s' % _("Offset"))
         self.ncc_choice_offset_cb = FCCheckBox('%s' % _("Offset"))
-        self.ncc_choice_offset_cb.setObjectName(_("Offset"))
+        self.ncc_choice_offset_cb.setObjectName("n_offset")
 
 
         self.ncc_choice_offset_cb.setToolTip(
         self.ncc_choice_offset_cb.setToolTip(
             _("If used, it will add an offset to the copper features.\n"
             _("If used, it will add an offset to the copper features.\n"
@@ -445,7 +463,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.ncc_offset_spinner.set_range(0.00, 10.00)
         self.ncc_offset_spinner.set_range(0.00, 10.00)
         self.ncc_offset_spinner.set_precision(4)
         self.ncc_offset_spinner.set_precision(4)
         self.ncc_offset_spinner.setWrapping(True)
         self.ncc_offset_spinner.setWrapping(True)
-        self.ncc_offset_spinner.setObjectName(_("Offset value"))
+        self.ncc_offset_spinner.setObjectName("n_offset_value")
 
 
         units = self.app.defaults['units'].upper()
         units = self.app.defaults['units'].upper()
         if units == 'MM':
         if units == 'MM':
@@ -483,7 +501,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
 
 
         # Rest Machining
         # Rest Machining
         self.ncc_rest_cb = FCCheckBox('%s' % _("Rest Machining"))
         self.ncc_rest_cb = FCCheckBox('%s' % _("Rest Machining"))
-        self.ncc_rest_cb.setObjectName(_("Rest Machining"))
+        self.ncc_rest_cb.setObjectName("n_rest_machining")
 
 
         self.ncc_rest_cb.setToolTip(
         self.ncc_rest_cb.setToolTip(
             _("If checked, use 'rest machining'.\n"
             _("If checked, use 'rest machining'.\n"
@@ -503,7 +521,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
             {"label": _("Area Selection"), "value": "area"},
             {"label": _("Area Selection"), "value": "area"},
             {'label': _("Reference Object"), 'value': 'box'}
             {'label': _("Reference Object"), 'value': 'box'}
         ], orientation='vertical', stretch=False)
         ], orientation='vertical', stretch=False)
-        self.reference_radio.setObjectName(_("Reference"))
+        self.reference_radio.setObjectName("n_reference")
 
 
         self.reference_label = QtWidgets.QLabel('%s:' % _("Reference"))
         self.reference_label = QtWidgets.QLabel('%s:' % _("Reference"))
         self.reference_label.setToolTip(
         self.reference_label.setToolTip(
@@ -638,6 +656,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.tooldia = None
         self.tooldia = None
 
 
         self.form_fields = {
         self.form_fields = {
+            "nccoperation":self.op_radio,
             "nccoverlap": self.ncc_overlap_entry,
             "nccoverlap": self.ncc_overlap_entry,
             "nccmargin": self.ncc_margin_entry,
             "nccmargin": self.ncc_margin_entry,
             "nccmethod": self.ncc_method_radio,
             "nccmethod": self.ncc_method_radio,
@@ -649,14 +668,15 @@ class NonCopperClear(FlatCAMTool, Gerber):
         }
         }
 
 
         self.name2option = {
         self.name2option = {
-            _('Overlap'): "nccoverlap",
-            _('Margin'): "nccmargin",
-            _('Method'): "nccmethod",
-            _("Connect"): "nccconnect",
-            _("Contour"): "ncccontour",
-            _("Offset"): "nccoffset",
-            _("Offset value"): "nccoffset_value",
-            _('Milling Type'): "milling_type",
+            "n_operation": "nccoperation",
+            "n_overlap": "nccoverlap",
+            "n_margin": "nccmargin",
+            "n_method": "nccmethod",
+            "n_connect": "nccconnect",
+            "n_contour": "ncccontour",
+            "n_offset": "nccoffset",
+            "n_offset_value": "nccoffset_value",
+            "n_milling_type": "milling_type",
         }
         }
 
 
         self.old_tool_dia = None
         self.old_tool_dia = None
@@ -673,6 +693,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.tipangle_entry.returnPressed.connect(self.on_calculate_tooldia)
         self.tipangle_entry.returnPressed.connect(self.on_calculate_tooldia)
         self.cutz_entry.returnPressed.connect(self.on_calculate_tooldia)
         self.cutz_entry.returnPressed.connect(self.on_calculate_tooldia)
 
 
+        self.op_radio.activated_custom.connect(self.on_operation_change)
+
         self.box_combo_type.currentIndexChanged.connect(self.on_combo_box_type)
         self.box_combo_type.currentIndexChanged.connect(self.on_combo_box_type)
         self.reference_radio.group_toggle_fn = self.on_toggle_reference
         self.reference_radio.group_toggle_fn = self.on_toggle_reference
 
 
@@ -690,6 +712,21 @@ class NonCopperClear(FlatCAMTool, Gerber):
         self.object_combo.setRootModelIndex(self.app.collection.index(obj_type, 0, QtCore.QModelIndex()))
         self.object_combo.setRootModelIndex(self.app.collection.index(obj_type, 0, QtCore.QModelIndex()))
         self.object_combo.setCurrentIndex(0)
         self.object_combo.setCurrentIndex(0)
 
 
+    def on_operation_change(self, val):
+        if val == 'iso':
+            self.milling_type_label.setEnabled(True)
+            self.milling_type_radio.setEnabled(True)
+        else:
+            self.milling_type_label.setEnabled(False)
+            self.milling_type_radio.setEnabled(False)
+
+        current_row = self.tools_table.currentRow()
+        try:
+            current_uid = int(self.tools_table.item(current_row, 3).text())
+            self.ncc_tools[current_uid]['data']['nccoperation'] = val
+        except AttributeError:
+            return
+
     def on_row_selection_change(self):
     def on_row_selection_change(self):
         self.blockSignals(True)
         self.blockSignals(True)
 
 
@@ -740,7 +777,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 if form_key == storage_key:
                 if form_key == storage_key:
                     try:
                     try:
                         self.form_fields[form_key].set_value(dict_storage[form_key])
                         self.form_fields[form_key].set_value(dict_storage[form_key])
-                    except Exception:
+                    except Exception as e:
+                        log.debug("NonCopperClear.storage_to_form() --> %s" % str(e))
                         pass
                         pass
 
 
     def form_to_storage(self):
     def form_to_storage(self):
@@ -783,6 +821,20 @@ class NonCopperClear(FlatCAMTool, Gerber):
         if row < 0:
         if row < 0:
             row = 0
             row = 0
 
 
+        tooluid_item = int(self.tools_table.item(row, 3).text())
+        temp_tool_data = dict()
+
+        for tooluid_key, tooluid_val in self.ncc_tools.items():
+            if int(tooluid_key) == tooluid_item:
+                # this will hold the 'data' key of the self.tools[tool] dictionary that corresponds to
+                # the current row in the tool table
+                temp_tool_data = tooluid_val['data']
+                break
+
+        for tooluid_key, tooluid_val in self.ncc_tools.items():
+            tooluid_val['data'] = deepcopy(temp_tool_data)
+
+
         # store all the data associated with the row parameter to the self.tools storage
         # store all the data associated with the row parameter to the self.tools storage
         tooldia_item = float(self.tools_table.item(row, 1).text())
         tooldia_item = float(self.tools_table.item(row, 1).text())
         type_item = self.tools_table.cellWidget(row, 2).currentText()
         type_item = self.tools_table.cellWidget(row, 2).currentText()
@@ -792,35 +844,35 @@ class NonCopperClear(FlatCAMTool, Gerber):
         nccoffset_value_item = float(self.ncc_offset_spinner.get_value())
         nccoffset_value_item = float(self.ncc_offset_spinner.get_value())
 
 
         # this new dict will hold the actual useful data, another dict that is the value of key 'data'
         # this new dict will hold the actual useful data, another dict that is the value of key 'data'
-        temp_tools = {}
-        temp_dia = {}
-        temp_data = {}
-
-        for tooluid_key, tooluid_value in self.ncc_tools.items():
-            for key, value in tooluid_value.items():
-                if key == 'data':
-                    # update the 'data' section
-                    for data_key in tooluid_value[key].keys():
-                        for form_key, form_value in self.form_fields.items():
-                            if form_key == data_key:
-                                temp_data[data_key] = form_value.get_value()
-                        # make sure we make a copy of the keys not in the form (we may use 'data' keys that are
-                        # updated from self.app.defaults
-                        if data_key not in self.form_fields:
-                            temp_data[data_key] = value[data_key]
-                    temp_dia[key] = deepcopy(temp_data)
-                    temp_data.clear()
-
-                elif key == 'solid_geometry':
-                    temp_dia[key] = deepcopy(self.tools[tooluid_key]['solid_geometry'])
-                else:
-                    temp_dia[key] = deepcopy(value)
-
-                temp_tools[tooluid_key] = deepcopy(temp_dia)
-
-        self.ncc_tools.clear()
-        self.ncc_tools = deepcopy(temp_tools)
-        temp_tools.clear()
+        # temp_tools = {}
+        # temp_dia = {}
+        # temp_data = {}
+        #
+        # for tooluid_key, tooluid_value in self.ncc_tools.items():
+        #     for key, value in tooluid_value.items():
+        #         if key == 'data':
+        #             # update the 'data' section
+        #             for data_key in tooluid_value[key].keys():
+        #                 for form_key, form_value in self.form_fields.items():
+        #                     if form_key == data_key:
+        #                         temp_data[data_key] = form_value.get_value()
+        #                 # make sure we make a copy of the keys not in the form (we may use 'data' keys that are
+        #                 # updated from self.app.defaults
+        #                 if data_key not in self.form_fields:
+        #                     temp_data[data_key] = value[data_key]
+        #             temp_dia[key] = deepcopy(temp_data)
+        #             temp_data.clear()
+        #
+        #         elif key == 'solid_geometry':
+        #             temp_dia[key] = deepcopy(self.tools[tooluid_key]['solid_geometry'])
+        #         else:
+        #             temp_dia[key] = deepcopy(value)
+        #
+        #         temp_tools[tooluid_key] = deepcopy(temp_dia)
+        #
+        # self.ncc_tools.clear()
+        # self.ncc_tools = deepcopy(temp_tools)
+        # temp_tools.clear()
 
 
         self.app.inform.emit('[success] %s' % _("Current Tool parameters were applied to all tools."))
         self.app.inform.emit('[success] %s' % _("Current Tool parameters were applied to all tools."))
 
 
@@ -887,6 +939,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
 
 
         self.type_obj_combo.set_value('gerber')
         self.type_obj_combo.set_value('gerber')
 
 
+        self.op_radio.set_value(self.app.defaults["tools_nccoperation"])
         self.ncc_order_radio.set_value(self.app.defaults["tools_nccorder"])
         self.ncc_order_radio.set_value(self.app.defaults["tools_nccorder"])
         self.ncc_overlap_entry.set_value(self.app.defaults["tools_nccoverlap"])
         self.ncc_overlap_entry.set_value(self.app.defaults["tools_nccoverlap"])
         self.ncc_margin_entry.set_value(self.app.defaults["tools_nccmargin"])
         self.ncc_margin_entry.set_value(self.app.defaults["tools_nccmargin"])
@@ -935,6 +988,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
             "toolchangexy": self.app.defaults["geometry_toolchangexy"],
             "toolchangexy": self.app.defaults["geometry_toolchangexy"],
             "startz": self.app.defaults["geometry_startz"],
             "startz": self.app.defaults["geometry_startz"],
 
 
+            "nccoperation": self.app.defaults["tools_nccoperation"],
             "nccmargin": self.app.defaults["tools_nccmargin"],
             "nccmargin": self.app.defaults["tools_nccmargin"],
             "nccmethod": self.app.defaults["tools_nccmethod"],
             "nccmethod": self.app.defaults["tools_nccmethod"],
             "nccconnect": self.app.defaults["tools_nccconnect"],
             "nccconnect": self.app.defaults["tools_nccconnect"],
@@ -968,7 +1022,6 @@ class NonCopperClear(FlatCAMTool, Gerber):
                     'offset_value': 0.0,
                     'offset_value': 0.0,
                     'type': 'Iso',
                     'type': 'Iso',
                     'tool_type': self.tool_type_radio.get_value(),
                     'tool_type': self.tool_type_radio.get_value(),
-                    'operation': 'clear_op',
                     'data': deepcopy(self.default_data),
                     'data': deepcopy(self.default_data),
                     'solid_geometry': []
                     'solid_geometry': []
                 }
                 }
@@ -1032,13 +1085,12 @@ class NonCopperClear(FlatCAMTool, Gerber):
 
 
                     tool_uid_item = QtWidgets.QTableWidgetItem(str(int(tooluid_key)))
                     tool_uid_item = QtWidgets.QTableWidgetItem(str(int(tooluid_key)))
 
 
-                    operation_type = FCComboBox()
-                    operation_type.addItem('iso_op')
-                    # operation_type.setStyleSheet('background-color: rgb(255,255,255)')
-                    operation_type.addItem('clear_op')
-                    # operation_type.setStyleSheet('background-color: rgb(255,255,255)')
-                    op_idx = operation_type.findText(tooluid_value['operation'])
-                    operation_type.setCurrentIndex(op_idx)
+                    # operation_type = FCComboBox()
+                    # operation_type.addItems(['iso_op', 'clear_op'])
+                    #
+                    # # operation_type.setStyleSheet('background-color: rgb(255,255,255)')
+                    # op_idx = operation_type.findText(tooluid_value['operation'])
+                    # operation_type.setCurrentIndex(op_idx)
 
 
                     self.tools_table.setItem(row_no, 1, dia)  # Diameter
                     self.tools_table.setItem(row_no, 1, dia)  # Diameter
                     self.tools_table.setCellWidget(row_no, 2, tool_type_item)
                     self.tools_table.setCellWidget(row_no, 2, tool_type_item)
@@ -1046,7 +1098,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
                     # ## REMEMBER: THIS COLUMN IS HIDDEN IN OBJECTUI.PY # ##
                     # ## REMEMBER: THIS COLUMN IS HIDDEN IN OBJECTUI.PY # ##
                     self.tools_table.setItem(row_no, 3, tool_uid_item)  # Tool unique ID
                     self.tools_table.setItem(row_no, 3, tool_uid_item)  # Tool unique ID
 
 
-                    self.tools_table.setCellWidget(row_no, 4, operation_type)
+                    # self.tools_table.setCellWidget(row_no, 4, operation_type)
 
 
         # make the diameter column editable
         # make the diameter column editable
         for row in range(tool_id):
         for row in range(tool_id):
@@ -1237,19 +1289,19 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 'tool_type': tt,
                 'tool_type': tt,
             })
             })
 
 
-        if cw_col == 4:
-            op = cw.currentText()
-
-            if op == 'iso_op':
-                self.milling_type_label.show()
-                self.milling_type_radio.show()
-            else:
-                self.milling_type_label.hide()
-                self.milling_type_radio.hide()
-
-            self.ncc_tools[current_uid].update({
-                'operation': op
-            })
+        # if cw_col == 4:
+        #     op = cw.currentText()
+        #
+        #     if op == 'iso_op':
+        #         self.milling_type_label.show()
+        #         self.milling_type_radio.show()
+        #     else:
+        #         self.milling_type_label.hide()
+        #         self.milling_type_radio.hide()
+        #
+        #     self.ncc_tools[current_uid].update({
+        #         'operation': op
+        #     })
 
 
     def on_tool_type(self, val):
     def on_tool_type(self, val):
         if val == 'V':
         if val == 'V':
@@ -1350,7 +1402,6 @@ class NonCopperClear(FlatCAMTool, Gerber):
                     'offset_value': 0.0,
                     'offset_value': 0.0,
                     'type': 'Iso',
                     'type': 'Iso',
                     'tool_type': self.tool_type_radio.get_value(),
                     'tool_type': self.tool_type_radio.get_value(),
-                    'operation': 'clear_op',
                     'data': deepcopy(self.default_data),
                     'data': deepcopy(self.default_data),
                     'solid_geometry': []
                     'solid_geometry': []
                 }
                 }
@@ -2022,9 +2073,12 @@ class NonCopperClear(FlatCAMTool, Gerber):
                 else:
                 else:
                     sorted_tools = ncctooldia
                     sorted_tools = ncctooldia
         else:
         else:
-            for row in range(self.tools_table.rowCount()):
-                if self.tools_table.cellWidget(row, 1).currentText() == 'clear_op':
-                    sorted_tools.append(float(self.tools_table.item(row, 1).text()))
+            # for row in range(self.tools_table.rowCount()):
+            #     if self.tools_table.cellWidget(row, 1).currentText() == 'clear_op':
+            #         sorted_tools.append(float(self.tools_table.item(row, 1).text()))
+            for tooluid in self.ncc_tools:
+                if self.ncc_tools[tooluid]['data']['nccoperation'] == 'clear':
+                    sorted_tools.append(self.ncc_tools[tooluid]['tooldia'])
 
 
         # ########################################################################################################
         # ########################################################################################################
         # set the name for the future Geometry object
         # set the name for the future Geometry object