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': []
}
})