From 5fe80b2fa500a0223708bac6d6a7d89b751963a8 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Thu, 10 Dec 2020 15:13:06 +0200 Subject: [PATCH] - NCC Tool - remade the 'Beginner/Advanced' Mode --- CHANGELOG.md | 4 + appTools/ToolIsolation.py | 2 +- appTools/ToolNCC.py | 236 ++++++++++++++++++++++++++++++-------- 3 files changed, 192 insertions(+), 50 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index efa8b543..f215dd6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta ================================================= +10.12.2020 + +- NCC Tool - remade the 'Beginner/Advanced' Mode + 9.11.2020 - simplifying the UI for the Milling Tool when in 'Beginner' mode diff --git a/appTools/ToolIsolation.py b/appTools/ToolIsolation.py index ae8f9894..cb612343 100644 --- a/appTools/ToolIsolation.py +++ b/appTools/ToolIsolation.py @@ -3281,7 +3281,7 @@ class IsoUI: grid1.addWidget(separator_line, 2, 0, 1, 2) # ############################################################# - # ############### Tool selection ############################## + # ############### Tool adding ################################# # ############################################################# self.grid3 = QtWidgets.QGridLayout() diff --git a/appTools/ToolNCC.py b/appTools/ToolNCC.py index 22031c4a..aaf40a48 100644 --- a/appTools/ToolNCC.py +++ b/appTools/ToolNCC.py @@ -60,10 +60,10 @@ class NonCopperClear(AppTool, Gerber): # ############################################################################# self.ui.tools_table.setupContextMenu() self.ui.tools_table.addContextMenu( - _("Add"), self.on_add_tool_by_key, icon=QtGui.QIcon(self.app.resource_location + "/plus16.png") + _("Add"), self.on_tool_add_by_key, icon=QtGui.QIcon(self.app.resource_location + "/plus16.png") ) self.ui.tools_table.addContextMenu( - _("Add from DB"), self.on_add_tool_by_key, icon=QtGui.QIcon(self.app.resource_location + "/plus16.png") + _("Add from DB"), self.on_tool_add_by_key, icon=QtGui.QIcon(self.app.resource_location + "/plus16.png") ) self.ui.tools_table.addContextMenu( _("Delete"), lambda: @@ -223,6 +223,8 @@ class NonCopperClear(AppTool, Gerber): # ############################################################################# # ############################ SIGNALS ######################################## # ############################################################################# + self.ui.level.toggled.connect(self.on_level_changed) + self.ui.find_optimal_button.clicked.connect(self.on_find_optimal_tooldia) # Custom Signal self.optimal_found_sig.connect(lambda val: self.ui.new_tooldia_entry.set_value(float(val))) @@ -482,37 +484,6 @@ class NonCopperClear(AppTool, Gerber): self.blockSignals(False) - def on_add_tool_by_key(self): - # tool_add_popup = FCInputDialog(title='%s...' % _("New Tool"), - # text='%s:' % _('Enter a Tool Diameter'), - # min=0.0001, max=10000.0000, decimals=self.decimals) - btn_icon = QtGui.QIcon(self.app.resource_location + '/open_excellon32.png') - - tool_add_popup = FCInputDialogSpinnerButton(title='%s...' % _("New Tool"), - text='%s:' % _('Enter a Tool Diameter'), - min=0.0001, max=10000.0000, decimals=self.decimals, - button_icon=btn_icon, - callback=self.on_find_optimal_tooldia, - parent=self.app.ui) - tool_add_popup.setWindowIcon(QtGui.QIcon(self.app.resource_location + '/letter_t_32.png')) - - def find_optimal(valor): - tool_add_popup.set_value(float(valor)) - - self.optimal_found_sig.connect(find_optimal) - - val, ok = tool_add_popup.get_results() - if ok: - if float(val) == 0: - self.app.inform.emit('[WARNING_NOTCL] %s' % - _("Please enter a tool diameter with non-zero value, in Float format.")) - self.optimal_found_sig.disconnect(find_optimal) - return - self.on_tool_add(custom_dia=float(val)) - else: - self.app.inform.emit('[WARNING_NOTCL] %s...' % _("Adding Tool cancelled")) - self.optimal_found_sig.disconnect(find_optimal) - def set_tool_ui(self): self.units = self.app.defaults['units'].upper() self.old_tool_dia = self.app.defaults["tools_ncc_newdia"] @@ -574,6 +545,10 @@ class NonCopperClear(AppTool, Gerber): self.ui.new_tooldia_entry.set_value(self.app.defaults["tools_ncc_newdia"]) + # Show/Hide Advanced Options + app_mode = self.app.defaults["global_app_level"] + self.change_level(app_mode) + # init the working variables self.default_data.clear() self.default_data = { @@ -658,6 +633,114 @@ class NonCopperClear(AppTool, Gerber): self.ui.tools_table.drag_drop_sig.connect(self.rebuild_ui) + def change_level(self, level): + """ + + :param level: application level: either 'b' or 'a' + :type level: str + :return: + """ + + if level == 'a': + self.ui.level.setChecked(True) + else: + self.ui.level.setChecked(False) + + def on_level_changed(self, checked): + if not checked: + self.ui.level.setText('%s' % _('Beginner')) + self.ui.level.setStyleSheet(""" + QToolButton + { + color: green; + } + """) + + # Add Tool section + self.ui.tool_sel_label.hide() + self.ui.new_tooldia_lbl.hide() + self.ui.new_tooldia_entry.hide() + self.ui.search_and_add_btn.hide() + self.ui.addtool_from_db_btn.hide() + self.ui.find_optimal_button.hide() + self.ui.deltool_btn.hide() + self.ui.add_tool_separator_line.hide() + + # Tool parameters section + if self.ncc_tools: + for tool in self.ncc_tools: + tool_data = self.ncc_tools[tool]['data'] + + tool_data['tools_ncc_operation'] = "clear" + tool_data['tools_ncc_milling_type'] = "cl" + + tool_data['tools_ncc_offset_choice'] = False + tool_data['tools_ncc_offset_value'] = 0.0 + tool_data['tools_ncc_rest'] = False + + self.ui.op_label.hide() + self.ui.op_radio.hide() + self.ui.milling_type_label.hide() + self.ui.milling_type_radio.hide() + self.ui.ncc_choice_offset_cb.hide() + self.ui.ncc_offset_spinner.hide() + + self.ui.ncc_rest_cb.hide() + + # All param section + self.ui.all_param_separator_line2.hide() + self.ui.apply_param_to_all.hide() + + # Context Menu section + self.ui.tools_table.removeContextMenu() + else: + self.ui.level.setText('%s' % _('Advanced')) + self.ui.level.setStyleSheet(""" + QToolButton + { + color: red; + } + """) + + # Add Tool section + self.ui.tool_sel_label.show() + self.ui.new_tooldia_lbl.show() + self.ui.new_tooldia_entry.show() + self.ui.search_and_add_btn.show() + self.ui.addtool_from_db_btn.show() + self.ui.find_optimal_button.show() + self.ui.deltool_btn.show() + self.ui.add_tool_separator_line.show() + + # Tool parameters section + if self.ncc_tools: + app_defaults = self.app.defaults + for tool in self.ncc_tools: + tool_data = self.ncc_tools[tool]['data'] + + tool_data['tools_ncc_operation'] = app_defaults['tools_ncc_operation'] + tool_data['tools_ncc_milling_type'] = app_defaults['tools_ncc_milling_type'] + + tool_data['tools_ncc_offset_choice'] = app_defaults['tools_ncc_offset_choice'] + tool_data['tools_ncc_offset_value'] = app_defaults['tools_ncc_offset_value'] + tool_data['tools_ncc_rest'] = app_defaults['tools_ncc_rest'] + + self.ui.op_label.show() + self.ui.op_radio.show() + self.ui.milling_type_label.show() + self.ui.milling_type_radio.show() + self.ui.ncc_choice_offset_cb.show() + self.ui.ncc_offset_spinner.show() + + self.ui.ncc_rest_cb.show() + + # All param section + self.ui.all_param_separator_line2.show() + self.ui.apply_param_to_all.show() + + # Context Menu section + self.ui.tools_table.setupContextMenu() + def rebuild_ui(self): # read the table tools uid current_uid_list = [] @@ -1318,6 +1401,37 @@ class NonCopperClear(AppTool, Gerber): if muted is None: self.app.inform.emit('[success] %s' % _("Default tool added to Tool Table.")) + def on_tool_add_by_key(self): + # tool_add_popup = FCInputDialog(title='%s...' % _("New Tool"), + # text='%s:' % _('Enter a Tool Diameter'), + # min=0.0001, max=10000.0000, decimals=self.decimals) + btn_icon = QtGui.QIcon(self.app.resource_location + '/open_excellon32.png') + + tool_add_popup = FCInputDialogSpinnerButton(title='%s...' % _("New Tool"), + text='%s:' % _('Enter a Tool Diameter'), + min=0.0001, max=10000.0000, decimals=self.decimals, + button_icon=btn_icon, + callback=self.on_find_optimal_tooldia, + parent=self.app.ui) + tool_add_popup.setWindowIcon(QtGui.QIcon(self.app.resource_location + '/letter_t_32.png')) + + def find_optimal(valor): + tool_add_popup.set_value(float(valor)) + + self.optimal_found_sig.connect(find_optimal) + + val, ok = tool_add_popup.get_results() + if ok: + if float(val) == 0: + self.app.inform.emit('[WARNING_NOTCL] %s' % + _("Please enter a tool diameter with non-zero value, in Float format.")) + self.optimal_found_sig.disconnect(find_optimal) + return + self.on_tool_add(custom_dia=float(val)) + else: + self.app.inform.emit('[WARNING_NOTCL] %s...' % _("Adding Tool cancelled")) + self.optimal_found_sig.disconnect(find_optimal) + def on_tool_edit(self, item): self.blockSignals(True) @@ -3970,6 +4084,9 @@ class NccUI: self.tools_box.setContentsMargins(0, 0, 0, 0) self.tools_frame.setLayout(self.tools_box) + self.title_box = QtWidgets.QHBoxLayout() + self.tools_box.addLayout(self.title_box) + # ## Title title_label = FCLabel("%s" % self.toolName) title_label.setStyleSheet(""" @@ -3979,13 +4096,34 @@ class NccUI: font-weight: bold; } """) - self.tools_box.addWidget(title_label) + title_label.setToolTip( + _("Create a Geometry object with\n" + "toolpaths to cover the space outside the copper pattern.") + ) + + self.title_box.addWidget(title_label) + + # App Level label + self.level = QtWidgets.QToolButton() + self.level.setToolTip( + _( + "BASIC is suitable for a beginner. Many parameters\n" + "are hidden from the user in this mode.\n" + "ADVANCED mode will make available all parameters.\n\n" + "To change the application LEVEL, go to:\n" + "Edit -> Preferences -> General and check:\n" + "'APP. LEVEL' radio button." + ) + ) + # self.level.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter) + self.level.setCheckable(True) + self.title_box.addWidget(self.level) # ## Form Layout form_layout = QtWidgets.QFormLayout() self.tools_box.addLayout(form_layout) - self.type_obj_combo_label = FCLabel('%s:' % _("Obj Type")) + self.type_obj_combo_label = FCLabel('%s:' % _("Type")) self.type_obj_combo_label.setToolTip( _("Specify the type of object to be cleared of excess copper.\n" "It can be of type: Gerber or Geometry.\n" @@ -4008,10 +4146,10 @@ class NccUI: # self.object_combo.setCurrentIndex(1) self.object_combo.is_last = True - self.object_label = FCLabel('%s:' % _("Object")) - self.object_label.setToolTip(_("Object to be cleared of excess copper.")) + # self.object_label = FCLabel('%s:' % _("Object")) + # self.object_label.setToolTip(_("Object to be cleared of excess copper.")) - form_layout.addRow(self.object_label, self.object_combo) + form_layout.addRow(self.object_combo) separator_line = QtWidgets.QFrame() separator_line.setFrameShape(QtWidgets.QFrame.HLine) @@ -4182,10 +4320,10 @@ class NccUI: button_grid.addWidget(self.deltool_btn, 0, 1, 2, 1) # ############################################################################################################# - separator_line = QtWidgets.QFrame() - separator_line.setFrameShape(QtWidgets.QFrame.HLine) - separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - self.grid3.addWidget(separator_line, 11, 0, 1, 2) + self.add_tool_separator_line = QtWidgets.QFrame() + self.add_tool_separator_line.setFrameShape(QtWidgets.QFrame.HLine) + self.add_tool_separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) + self.grid3.addWidget(self.add_tool_separator_line, 11, 0, 1, 2) self.tool_data_label = FCLabel( "%s: %s %d" % (_('Parameters for'), _("Tool"), int(1))) @@ -4198,8 +4336,8 @@ class NccUI: self.grid3.addWidget(self.tool_data_label, 12, 0, 1, 2) # Operation - op_label = FCLabel('%s:' % _('Operation')) - op_label.setToolTip( + self.op_label = FCLabel('%s:' % _('Operation')) + self.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" @@ -4212,7 +4350,7 @@ class NccUI: ], orientation='horizontal', stretch=False) self.op_radio.setObjectName("n_operation") - self.grid3.addWidget(op_label, 13, 0) + self.grid3.addWidget(self.op_label, 13, 0) self.grid3.addWidget(self.op_radio, 13, 1) # Milling Type Radio Button @@ -4356,10 +4494,10 @@ class NccUI: ) self.grid3.addWidget(self.apply_param_to_all, 22, 0, 1, 2) - separator_line = QtWidgets.QFrame() - separator_line.setFrameShape(QtWidgets.QFrame.HLine) - separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) - self.grid3.addWidget(separator_line, 23, 0, 1, 2) + self.all_param_separator_line2 = QtWidgets.QFrame() + self.all_param_separator_line2.setFrameShape(QtWidgets.QFrame.HLine) + self.all_param_separator_line2.setFrameShadow(QtWidgets.QFrame.Sunken) + self.grid3.addWidget(self.all_param_separator_line2, 23, 0, 1, 2) # General Parameters self.gen_param_label = FCLabel('%s' % _("Common Parameters"))