From 7ff8d893c0e0a2fd06276443354565fa56dd6297 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Tue, 3 Sep 2019 01:13:03 +0300 Subject: [PATCH] - in NCC tool there is now a depth of cut parameter named 'Cut Z' which will dictate how deep the tool will enter into the PCB material - in NCC tool added possibility to choose between the type of tools to be used and when V-shape is used then the tool diameter is calculated from the desired depth of cut and from the V-tip parameters --- FlatCAMApp.py | 10 +- FlatCAMObj.py | 4 +- README.md | 5 + flatcamGUI/FlatCAMGUI.py | 113 +++++++++++++----- flatcamTools/ToolNonCopperClear.py | 180 ++++++++++++++++++++++++----- 5 files changed, 252 insertions(+), 60 deletions(-) diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 434c0ddf..3e80c752 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -631,6 +631,10 @@ class App(QtCore.QObject): "tools_ncc_offset_value": self.ui.tools_defaults_form.tools_ncc_group.ncc_offset_spinner, "tools_nccref": self.ui.tools_defaults_form.tools_ncc_group.reference_radio, "tools_nccmilling_type": self.ui.tools_defaults_form.tools_ncc_group.milling_type_radio, + "tools_ncctool_type": self.ui.tools_defaults_form.tools_ncc_group.tool_type_radio, + "tools_ncccutz": self.ui.tools_defaults_form.tools_ncc_group.cutz_entry, + "tools_ncctipdia": self.ui.tools_defaults_form.tools_ncc_group.tipdia_entry, + "tools_ncctipangle": self.ui.tools_defaults_form.tools_ncc_group.tipangle_entry, # CutOut Tool "tools_cutouttooldia": self.ui.tools_defaults_form.tools_cutout_group.cutout_tooldia_entry, @@ -1014,6 +1018,10 @@ class App(QtCore.QObject): "tools_ncc_offset_value": 0.0000, "tools_nccref": 'itself', "tools_nccmilling_type": 'cl', + "tools_ncctool_type": 'V', + "tools_ncccutz": -0.001968504, + "tools_ncctipdia": 0.00393701, + "tools_ncctipangle": 30, "tools_cutouttooldia": 0.0944882, "tools_cutoutkind": "single", @@ -4123,7 +4131,7 @@ class App(QtCore.QObject): 'cncjob_tooldia', 'tools_paintmargin', 'tools_painttooldia', 'tools_paintoverlap', - "tools_ncctools", "tools_nccoverlap", "tools_nccmargin", + "tools_ncctools", "tools_nccoverlap", "tools_nccmargin", "tools_ncccutz", "tools_ncctipdia" "tools_2sided_drilldia", "tools_film_boundary", "tools_cutouttooldia", 'tools_cutoutmargin', 'tools_cutoutgapsize', "tools_panelize_constrainx", "tools_panelize_constrainy", diff --git a/FlatCAMObj.py b/FlatCAMObj.py index bf87962a..01ea8703 100644 --- a/FlatCAMObj.py +++ b/FlatCAMObj.py @@ -5687,6 +5687,7 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): self.app.inform.emit(_("[success] Machine Code file saved to: %s") % filename) def on_edit_code_click(self, *args): + preamble = str(self.ui.prepend_text.get_value()) postamble = str(self.ui.append_text.get_value()) gc = self.export_gcode(preamble=preamble, postamble=postamble, to_file=True) @@ -5706,13 +5707,14 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob): self.app.ui.code_editor.append(proc_line) except Exception as e: log.debug('FlatCAMCNNJob.on_edit_code_click() -->%s' % str(e)) - self.app.inform.emit(_('[ERROR]FlatCAMCNNJob.on_edit_code_click() -->%s') % str(e)) + self.app.inform.emit(_('[ERROR] FlatCAMCNNJob.on_edit_code_click() -->%s') % str(e)) return self.app.ui.code_editor.moveCursor(QtGui.QTextCursor.Start) self.app.handleTextChanged() self.app.ui.show() + self.app.inform.emit(_('[success] Loaded Machine Code into Code Editor ...')) def gcode_header(self): log.debug("FlatCAMCNCJob.gcode_header()") diff --git a/README.md b/README.md index 4a76b017..86fa9233 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,11 @@ CAD program, and create G-Code for Isolation routing. ================================================= +3.09.2019 + +- in NCC tool there is now a depth of cut parameter named 'Cut Z' which will dictate how deep the tool will enter into the PCB material +- in NCC tool added possibility to choose between the type of tools to be used and when V-shape is used then the tool diameter is calculated from the desired depth of cut and from the V-tip parameters + 2.09.2019 - fixed issue in NCC Tool when using area option diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 9742df95..5a80dd06 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -3448,7 +3448,6 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.vlay = QtWidgets.QVBoxLayout() self.vlay.addWidget(self.tools_ncc_group) self.vlay.addWidget(self.tools_paint_group) - self.vlay.addWidget(self.tools_film_group) self.vlay1 = QtWidgets.QVBoxLayout() self.vlay1.addWidget(self.tools_cutout_group) @@ -3462,6 +3461,7 @@ class ToolsPreferencesUI(QtWidgets.QWidget): self.vlay3 = QtWidgets.QVBoxLayout() self.vlay3.addWidget(self.tools_solderpaste_group) self.vlay3.addWidget(self.tools_sub_group) + self.vlay3.addWidget(self.tools_film_group) self.layout.addLayout(self.vlay) self.layout.addLayout(self.vlay1) @@ -6394,6 +6394,44 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): self.ncc_tool_dia_entry = FCEntry() grid0.addWidget(self.ncc_tool_dia_entry, 0, 1) + # Tool Type Radio Button + self.tool_type_label = QtWidgets.QLabel('%s:' % _('Tool Type')) + self.tool_type_label.setToolTip( + _("Default tool type:\n" + "- 'V-shape'\n" + "- Circular") + ) + + self.tool_type_radio = RadioSet([{'label': _('V-shape'), 'value': 'V'}, + {'label': _('Circular'), 'value': 'C1'}]) + self.tool_type_radio.setToolTip( + _("Default tool type:\n" + "- 'V-shape'\n" + "- Circular") + ) + + grid0.addWidget(self.tool_type_label, 1, 0) + grid0.addWidget(self.tool_type_radio, 1, 1) + + # Tip Dia + self.tipdialabel = QtWidgets.QLabel('%s:' % _('V-Tip Dia')) + self.tipdialabel.setToolTip( + _("The tip diameter for V-Shape Tool")) + self.tipdia_entry = LengthEntry() + + grid0.addWidget(self.tipdialabel, 2, 0) + grid0.addWidget(self.tipdia_entry, 2, 1) + + # Tip Angle + self.tipanglelabel = QtWidgets.QLabel('%s:' % _('V-Tip Angle')) + self.tipanglelabel.setToolTip( + _("The tip angle for V-Shape Tool.\n" + "In degree.")) + self.tipangle_entry = LengthEntry() + + grid0.addWidget(self.tipanglelabel, 3, 0) + grid0.addWidget(self.tipangle_entry, 3, 1) + # Milling Type Radio Button self.milling_type_label = QtWidgets.QLabel('%s:' % _('Milling Type')) self.milling_type_label.setToolTip( @@ -6410,9 +6448,10 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): "- conventional / useful when there is no backlash compensation") ) - grid0.addWidget(self.milling_type_label, 1, 0) - grid0.addWidget(self.milling_type_radio, 1, 1) + grid0.addWidget(self.milling_type_label, 4, 0) + grid0.addWidget(self.milling_type_radio, 4, 1) + # Tool order Radio Button 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" "'No' --> means that the used order is the one in the tool table\n" @@ -6430,9 +6469,25 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): "'Reverse' --> menas that the tools will ordered from big to small\n\n" "WARNING: using rest machining will automatically set the order\n" "in reverse and disable this control.")) - grid0.addWidget(self.ncc_order_label, 2, 0) - grid0.addWidget(self.ncc_order_radio, 2, 1) + grid0.addWidget(self.ncc_order_label, 5, 0) + grid0.addWidget(self.ncc_order_radio, 5, 1) + # Cut Z entry + cutzlabel = QtWidgets.QLabel('%s:' % _('Cut Z')) + cutzlabel.setToolTip( + _("Depth of cut into material. Negative value.\n" + "In FlatCAM units.") + ) + self.cutz_entry = FloatEntry() + self.cutz_entry.setToolTip( + _("Depth of cut into material. Negative value.\n" + "In FlatCAM units.") + ) + + grid0.addWidget(cutzlabel, 6, 0) + grid0.addWidget(self.cutz_entry, 6, 1) + + # Overlap Entry nccoverlabel = QtWidgets.QLabel('%s:' % _('Overlap Rate')) nccoverlabel.setToolTip( _("How much (fraction) of the tool width to overlap each tool pass.\n" @@ -6445,17 +6500,18 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): "Higher values = slow processing and slow execution on CNC\n" "due of too many paths.") ) - grid0.addWidget(nccoverlabel, 3, 0) + grid0.addWidget(nccoverlabel, 7, 0) self.ncc_overlap_entry = FloatEntry() - grid0.addWidget(self.ncc_overlap_entry, 3, 1) + grid0.addWidget(self.ncc_overlap_entry, 7, 1) + # Margin entry nccmarginlabel = QtWidgets.QLabel('%s:' % _('Margin')) nccmarginlabel.setToolTip( _("Bounding box margin.") ) - grid0.addWidget(nccmarginlabel, 4, 0) + grid0.addWidget(nccmarginlabel, 8, 0) self.ncc_margin_entry = FloatEntry() - grid0.addWidget(self.ncc_margin_entry, 4, 1) + grid0.addWidget(self.ncc_margin_entry, 8, 1) # Method methodlabel = QtWidgets.QLabel('%s:' % _('Method')) @@ -6465,13 +6521,13 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): "Seed-based: Outwards from seed.
" "Line-based: Parallel lines.") ) - grid0.addWidget(methodlabel, 5, 0) + grid0.addWidget(methodlabel, 9, 0) self.ncc_method_radio = RadioSet([ {"label": _("Standard"), "value": "standard"}, {"label": _("Seed-based"), "value": "seed"}, {"label": _("Straight lines"), "value": "lines"} ], orientation='vertical', stretch=False) - grid0.addWidget(self.ncc_method_radio, 5, 1) + grid0.addWidget(self.ncc_method_radio, 9, 1) # Connect lines pathconnectlabel = QtWidgets.QLabel('%s:' % _("Connect")) @@ -6479,19 +6535,21 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): _("Draw lines between resulting\n" "segments to minimize tool lifts.") ) - grid0.addWidget(pathconnectlabel, 6, 0) + grid0.addWidget(pathconnectlabel, 10, 0) self.ncc_connect_cb = FCCheckBox() - grid0.addWidget(self.ncc_connect_cb, 6, 1) + grid0.addWidget(self.ncc_connect_cb, 10, 1) + # Contour Checkbox contourlabel = QtWidgets.QLabel('%s:' % _("Contour")) contourlabel.setToolTip( _("Cut around the perimeter of the polygon\n" "to trim rough edges.") ) - grid0.addWidget(contourlabel, 7, 0) + grid0.addWidget(contourlabel, 11, 0) self.ncc_contour_cb = FCCheckBox() - grid0.addWidget(self.ncc_contour_cb, 7, 1) + grid0.addWidget(self.ncc_contour_cb, 11, 1) + # Rest machining CheckBox restlabel = QtWidgets.QLabel('%s:' % _("Rest M.")) restlabel.setToolTip( _("If checked, use 'rest machining'.\n" @@ -6502,9 +6560,9 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): "no more copper to clear or there are no more tools.\n" "If not checked, use the standard algorithm.") ) - grid0.addWidget(restlabel, 8, 0) + grid0.addWidget(restlabel, 12, 0) self.ncc_rest_cb = FCCheckBox() - grid0.addWidget(self.ncc_rest_cb, 8, 1) + grid0.addWidget(self.ncc_rest_cb, 12, 1) # ## NCC Offset choice self.ncc_offset_choice_label = QtWidgets.QLabel('%s:' % _("Offset")) @@ -6514,9 +6572,9 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): "from the copper features.\n" "The value can be between 0 and 10 FlatCAM units.") ) - grid0.addWidget(self.ncc_offset_choice_label, 9, 0) + grid0.addWidget(self.ncc_offset_choice_label, 13, 0) self.ncc_choice_offset_cb = FCCheckBox() - grid0.addWidget(self.ncc_choice_offset_cb, 9, 1) + grid0.addWidget(self.ncc_choice_offset_cb, 13, 1) # ## NCC Offset value self.ncc_offset_label = QtWidgets.QLabel('%s:' % _("Offset value")) @@ -6526,14 +6584,14 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): "from the copper features.\n" "The value can be between 0 and 10 FlatCAM units.") ) - grid0.addWidget(self.ncc_offset_label, 10, 0) + grid0.addWidget(self.ncc_offset_label, 14, 0) self.ncc_offset_spinner = FCDoubleSpinner() self.ncc_offset_spinner.set_range(0.00, 10.00) self.ncc_offset_spinner.set_precision(4) self.ncc_offset_spinner.setWrapping(True) self.ncc_offset_spinner.setSingleStep(0.1) - grid0.addWidget(self.ncc_offset_spinner, 10, 1) + grid0.addWidget(self.ncc_offset_spinner, 14, 1) # ## Reference self.reference_radio = RadioSet([{'label': _('Itself'), 'value': 'itself'}, @@ -6548,8 +6606,8 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI): "- 'Reference Object' - will do non copper clearing within the area\n" "specified by another object.") ) - grid0.addWidget(reference_label, 11, 0) - grid0.addWidget(self.reference_radio, 11, 1) + grid0.addWidget(reference_label, 15, 0) + grid0.addWidget(self.reference_radio, 15, 1) self.layout.addStretch() @@ -7460,7 +7518,8 @@ class FAExcPrefGroupUI(OptionsGroupUI): self.layout.addWidget(self.exc_list_text) self.exc_list_btn = FCButton("Apply") - self.exc_list_btn.setToolTip(_("Apply the file associations.\n" + self.exc_list_btn.setToolTip(_("Apply the file associations between\n" + "FlatCAM and the files with above extensions.\n" "They will be active after next logon.\n" "This work only in Windows.")) self.layout.addWidget(self.exc_list_btn) @@ -7492,7 +7551,8 @@ class FAGcoPrefGroupUI(OptionsGroupUI): self.layout.addWidget(self.gco_list_text) self.gco_list_btn = FCButton("Apply") - self.gco_list_btn.setToolTip(_("Apply the file associations.\n" + self.gco_list_btn.setToolTip(_("Apply the file associations between\n" + "FlatCAM and the files with above extensions.\n" "They will be active after next logon.\n" "This work only in Windows.")) self.layout.addWidget(self.gco_list_btn) @@ -7523,7 +7583,8 @@ class FAGrbPrefGroupUI(OptionsGroupUI): self.grb_list_text.setFont(font) self.grb_list_btn = FCButton("Apply") - self.grb_list_btn.setToolTip(_("Apply the file associations.\n" + self.grb_list_btn.setToolTip(_("Apply the file associations between\n" + "FlatCAM and the files with above extensions.\n" "They will be active after next logon.\n" "This work only in Windows.")) self.layout.addWidget(self.grb_list_btn) diff --git a/flatcamTools/ToolNonCopperClear.py b/flatcamTools/ToolNonCopperClear.py index f03d1b48..9adb6ef7 100644 --- a/flatcamTools/ToolNonCopperClear.py +++ b/flatcamTools/ToolNonCopperClear.py @@ -184,6 +184,23 @@ class NonCopperClear(FlatCAMTool, Gerber): self.milling_type_label.hide() self.milling_type_radio.hide() + # Tool Type Radio Button + self.tool_type_label = QtWidgets.QLabel('%s:' % _('Tool Type')) + self.tool_type_label.setToolTip( + _("Default tool type:\n" + "- 'V-shape'\n" + "- Circular") + ) + + self.tool_type_radio = RadioSet([{'label': _('V-shape'), 'value': 'V'}, + {'label': _('Circular'), 'value': 'C1'}]) + self.tool_type_radio.setToolTip( + _("Default tool type:\n" + "- 'V-shape'\n" + "- Circular") + ) + form.addRow(self.tool_type_label, self.tool_type_radio) + # ### Add a new Tool #### self.addtool_entry_lbl = QtWidgets.QLabel('%s:' % _('Tool Dia')) self.addtool_entry_lbl.setToolTip( @@ -192,6 +209,21 @@ class NonCopperClear(FlatCAMTool, Gerber): self.addtool_entry = FCEntry2() form.addRow(self.addtool_entry_lbl, self.addtool_entry) + # Tip Dia + self.tipdialabel = QtWidgets.QLabel('%s:' % _('V-Tip Dia')) + self.tipdialabel.setToolTip( + _("The tip diameter for V-Shape Tool")) + self.tipdia_entry = LengthEntry() + form.addRow(self.tipdialabel, self.tipdia_entry) + + # Tip Angle + self.tipanglelabel = QtWidgets.QLabel('%s:' % _('V-Tip Angle')) + self.tipanglelabel.setToolTip( + _("The tip angle for V-Shape Tool.\n" + "In degree.")) + self.tipangle_entry = LengthEntry() + form.addRow(self.tipanglelabel, self.tipangle_entry) + grid2 = QtWidgets.QGridLayout() self.tools_box.addLayout(grid2) @@ -226,6 +258,21 @@ class NonCopperClear(FlatCAMTool, Gerber): e_lab_1 = QtWidgets.QLabel('%s:' % _("Parameters")) grid3.addWidget(e_lab_1, 0, 0) + # Cut Z entry + cutzlabel = QtWidgets.QLabel('%s:' % _('Cut Z')) + cutzlabel.setToolTip( + _("Depth of cut into material. Negative value.\n" + "In FlatCAM units.") + ) + self.cutz_entry = FloatEntry() + self.cutz_entry.setToolTip( + _("Depth of cut into material. Negative value.\n" + "In FlatCAM units.") + ) + grid3.addWidget(cutzlabel, 1, 0) + grid3.addWidget(self.cutz_entry, 1, 1) + + # Overlap Entry nccoverlabel = QtWidgets.QLabel('%s:' % _('Overlap Rate')) nccoverlabel.setToolTip( _("How much (fraction) of the tool width to overlap each tool pass.\n" @@ -238,17 +285,17 @@ class NonCopperClear(FlatCAMTool, Gerber): "Higher values = slow processing and slow execution on CNC\n" "due of too many paths.") ) - grid3.addWidget(nccoverlabel, 1, 0) self.ncc_overlap_entry = FCEntry() - grid3.addWidget(self.ncc_overlap_entry, 1, 1) + grid3.addWidget(nccoverlabel, 2, 0) + grid3.addWidget(self.ncc_overlap_entry, 2, 1) nccmarginlabel = QtWidgets.QLabel('%s:' % _('Margin')) nccmarginlabel.setToolTip( _("Bounding box margin.") ) - grid3.addWidget(nccmarginlabel, 2, 0) + grid3.addWidget(nccmarginlabel, 3, 0) self.ncc_margin_entry = FCEntry() - grid3.addWidget(self.ncc_margin_entry, 2, 1) + grid3.addWidget(self.ncc_margin_entry, 3, 1) # Method methodlabel = QtWidgets.QLabel('%s:' % _('Method')) @@ -258,13 +305,13 @@ class NonCopperClear(FlatCAMTool, Gerber): "Seed-based: Outwards from seed.
" "Line-based: Parallel lines.") ) - grid3.addWidget(methodlabel, 3, 0) + grid3.addWidget(methodlabel, 4, 0) self.ncc_method_radio = RadioSet([ {"label": _("Standard"), "value": "standard"}, {"label": _("Seed-based"), "value": "seed"}, {"label": _("Straight lines"), "value": "lines"} ], orientation='vertical', stretch=False) - grid3.addWidget(self.ncc_method_radio, 3, 1) + grid3.addWidget(self.ncc_method_radio, 4, 1) # Connect lines pathconnectlabel = QtWidgets.QLabel('%s:' % _("Connect")) @@ -272,18 +319,18 @@ class NonCopperClear(FlatCAMTool, Gerber): _("Draw lines between resulting\n" "segments to minimize tool lifts.") ) - grid3.addWidget(pathconnectlabel, 4, 0) + grid3.addWidget(pathconnectlabel, 5, 0) self.ncc_connect_cb = FCCheckBox() - grid3.addWidget(self.ncc_connect_cb, 4, 1) + grid3.addWidget(self.ncc_connect_cb, 5, 1) contourlabel = QtWidgets.QLabel('%s:' % _("Contour")) contourlabel.setToolTip( _("Cut around the perimeter of the polygon\n" "to trim rough edges.") ) - grid3.addWidget(contourlabel, 5, 0) + grid3.addWidget(contourlabel, 6, 0) self.ncc_contour_cb = FCCheckBox() - grid3.addWidget(self.ncc_contour_cb, 5, 1) + grid3.addWidget(self.ncc_contour_cb, 6, 1) restlabel = QtWidgets.QLabel('%s:' % _("Rest M.")) restlabel.setToolTip( @@ -295,9 +342,9 @@ class NonCopperClear(FlatCAMTool, Gerber): "no more copper to clear or there are no more tools.\n" "If not checked, use the standard algorithm.") ) - grid3.addWidget(restlabel, 6, 0) + grid3.addWidget(restlabel, 7, 0) self.ncc_rest_cb = FCCheckBox() - grid3.addWidget(self.ncc_rest_cb, 6, 1) + grid3.addWidget(self.ncc_rest_cb, 7, 1) # ## NCC Offset choice self.ncc_offset_choice_label = QtWidgets.QLabel('%s:' % _("Offset")) @@ -307,9 +354,9 @@ class NonCopperClear(FlatCAMTool, Gerber): "from the copper features.\n" "The value can be between 0 and 10 FlatCAM units.") ) - grid3.addWidget(self.ncc_offset_choice_label, 7, 0) + grid3.addWidget(self.ncc_offset_choice_label, 8, 0) self.ncc_choice_offset_cb = FCCheckBox() - grid3.addWidget(self.ncc_choice_offset_cb, 7, 1) + grid3.addWidget(self.ncc_choice_offset_cb, 8, 1) # ## NCC Offset value self.ncc_offset_label = QtWidgets.QLabel('%s:' % _("Offset value")) @@ -319,7 +366,7 @@ class NonCopperClear(FlatCAMTool, Gerber): "from the copper features.\n" "The value can be between 0 and 10 FlatCAM units.") ) - grid3.addWidget(self.ncc_offset_label, 8, 0) + grid3.addWidget(self.ncc_offset_label, 9, 0) self.ncc_offset_spinner = FCDoubleSpinner() self.ncc_offset_spinner.set_range(0.00, 10.00) self.ncc_offset_spinner.set_precision(4) @@ -331,7 +378,7 @@ class NonCopperClear(FlatCAMTool, Gerber): else: self.ncc_offset_spinner.setSingleStep(0.01) - grid3.addWidget(self.ncc_offset_spinner, 8, 1) + grid3.addWidget(self.ncc_offset_spinner, 9, 1) self.ncc_offset_label.hide() self.ncc_offset_spinner.hide() @@ -351,8 +398,8 @@ class NonCopperClear(FlatCAMTool, Gerber): "- 'Reference Object' - will do non copper clearing within the area\n" "specified by another object.") ) - grid3.addWidget(self.reference_label, 9, 0) - grid3.addWidget(self.reference_radio, 9, 1) + grid3.addWidget(self.reference_label, 10, 0) + grid3.addWidget(self.reference_radio, 10, 1) form1 = QtWidgets.QFormLayout() self.tools_box.addLayout(form1) @@ -488,14 +535,20 @@ class NonCopperClear(FlatCAMTool, Gerber): self.ncc_rest_cb.set_value(self.app.defaults["tools_nccrest"]) self.reference_radio.set_value(self.app.defaults["tools_nccref"]) self.milling_type_radio.set_value(self.app.defaults["tools_nccmilling_type"]) + self.cutz_entry.set_value(self.app.defaults["tools_ncccutz"]) + self.tool_type_radio.set_value(self.app.defaults["tools_ncctool_type"]) + self.tipdia_entry.set_value(self.app.defaults["tools_ncctipdia"]) + self.tipangle_entry.set_value(self.app.defaults["tools_ncctipangle"]) + + self.on_tool_type(val=self.tool_type_radio.get_value()) # init the working variables self.default_data.clear() self.default_data.update({ "name": '_ncc', "plot": self.app.defaults["geometry_plot"], - "cutz": self.app.defaults["geometry_cutz"], - "vtipdia": 0.1, + "cutz": float(self.cutz_entry.get_value()), + "vtipdia": 0.2, "vtipangle": 30, "travelz": self.app.defaults["geometry_travelz"], "feedrate": self.app.defaults["geometry_feedrate"], @@ -548,9 +601,9 @@ class NonCopperClear(FlatCAMTool, Gerber): 'offset': 'Path', 'offset_value': 0.0, 'type': 'Iso', - 'tool_type': 'V', + 'tool_type': self.tool_type_radio.get_value(), 'operation': 'clear_op', - 'data': dict(self.default_data), + 'data': deepcopy(self.default_data), 'solid_geometry': [] } }) @@ -671,6 +724,8 @@ class NonCopperClear(FlatCAMTool, Gerber): for col in [2, 4]: self.tools_table.cellWidget(row, col).currentIndexChanged.connect(self.on_tooltable_cellwidget_change) + self.tool_type_radio.activated_custom.connect(self.on_tool_type) + def ui_disconnect(self): try: # if connected, disconnect the signal from the slot on item_changed as it creates issues @@ -678,6 +733,12 @@ class NonCopperClear(FlatCAMTool, Gerber): except (TypeError, AttributeError): pass + try: + # if connected, disconnect the signal from the slot on item_changed as it creates issues + self.tool_type_radio.activated_custom.disconnect(self.on_tool_type) + except (TypeError, AttributeError): + pass + for row in range(self.tools_table.rowCount()): for col in [2, 4]: try: @@ -757,6 +818,22 @@ class NonCopperClear(FlatCAMTool, Gerber): 'tool_type': tt, }) + def on_tool_type(self, val): + if val == 'V': + self.addtool_entry_lbl.hide() + self.addtool_entry.hide() + self.tipdialabel.show() + self.tipdia_entry.show() + self.tipanglelabel.show() + self.tipangle_entry.show() + else: + self.addtool_entry_lbl.show() + self.addtool_entry.show() + self.tipdialabel.hide() + self.tipdia_entry.hide() + self.tipanglelabel.hide() + self.tipangle_entry.hide() + def on_tool_add(self, dia=None, muted=None): self.ui_disconnect() @@ -764,16 +841,55 @@ class NonCopperClear(FlatCAMTool, Gerber): if dia: tool_dia = dia else: - try: - tool_dia = float(self.addtool_entry.get_value()) - except ValueError: - # try to convert comma to decimal point. if it's still not working error message and return + if self.tool_type_radio.get_value() == 'V': + try: - tool_dia = float(self.addtool_entry.get_value().replace(',', '.')) + tip_dia = float(self.tipdia_entry.get_value()) except ValueError: - self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, " - "use a number.")) - return + # try to convert comma to decimal point. if it's still not working error message and return + try: + tip_dia = float(self.tipdia_entry.get_value().replace(',', '.')) + except ValueError: + self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, " + "use a number.")) + return + + try: + tip_angle = float(self.tipangle_entry.get_value()) / 2 + except ValueError: + # try to convert comma to decimal point. if it's still not working error message and return + try: + tip_angle = float(self.tipangle_entry.get_value().replace(',', '.')) / 2 + except ValueError: + self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, " + "use a number.")) + return + + try: + cut_z = float(self.cutz_entry.get_value()) + except ValueError: + # try to convert comma to decimal point. if it's still not working error message and return + try: + cut_z = float(self.cutz_entry.get_value().replace(',', '.')) + except ValueError: + self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, " + "use a number.")) + return + + tool_dia = tip_dia + 2 * cut_z * math.tan(math.radians(tip_angle)) + tool_dia = float('%.4f' % tool_dia) + else: + try: + tool_dia = float(self.addtool_entry.get_value()) + except ValueError: + # try to convert comma to decimal point. if it's still not working error message and return + try: + tool_dia = float(self.addtool_entry.get_value().replace(',', '.')) + except ValueError: + self.app.inform.emit(_("[ERROR_NOTCL] Wrong value format entered, " + "use a number.")) + return + if tool_dia is None: self.build_ui() self.app.inform.emit(_("[WARNING_NOTCL] Please enter a tool diameter to add, in Float format.")) @@ -817,9 +933,9 @@ class NonCopperClear(FlatCAMTool, Gerber): 'offset': 'Path', 'offset_value': 0.0, 'type': 'Iso', - 'tool_type': 'V', + 'tool_type': self.tool_type_radio.get_value(), 'operation': 'clear_op', - 'data': dict(self.default_data), + 'data': deepcopy(self.default_data), 'solid_geometry': [] } })