diff --git a/FlatCAMApp.py b/FlatCAMApp.py
index e073978d..258c0852 100644
--- a/FlatCAMApp.py
+++ b/FlatCAMApp.py
@@ -776,11 +776,11 @@ class App(QtCore.QObject):
"tools_nccref": 'itself',
"tools_ncc_plotting": 'normal',
"tools_nccmilling_type": 'cl',
- "tools_ncctool_type": 'V',
+ "tools_ncctool_type": 'C1',
"tools_ncccutz": -0.05,
"tools_ncctipdia": 0.1,
"tools_ncctipangle": 30,
- "tools_nccnewdia": 1.0,
+ "tools_nccnewdia": 0.1,
# Cutout Tool
"tools_cutouttooldia": 2.4,
@@ -804,11 +804,11 @@ class App(QtCore.QObject):
"tools_paintcontour": True,
"tools_paint_plotting": 'normal',
"tools_paintrest": False,
- "tools_painttool_type": 'V',
+ "tools_painttool_type": 'C1',
"tools_paintcutz": -0.05,
"tools_painttipdia": 0.1,
"tools_painttipangle": 30,
- "tools_paintnewdia": 1.0,
+ "tools_paintnewdia": 0.1,
# 2-Sided Tool
"tools_2sided_mirror_axis": "X",
@@ -1453,6 +1453,13 @@ class App(QtCore.QObject):
"tools_paintcontour": self.ui.tools_defaults_form.tools_paint_group.contour_cb,
"tools_paint_plotting": self.ui.tools_defaults_form.tools_paint_group.paint_plotting_radio,
+ "tools_paintrest": self.ui.tools_defaults_form.tools_paint_group.rest_cb,
+ "tools_painttool_type": self.ui.tools_defaults_form.tools_paint_group.tool_type_radio,
+ "tools_paintcutz": self.ui.tools_defaults_form.tools_paint_group.cutz_entry,
+ "tools_painttipdia": self.ui.tools_defaults_form.tools_paint_group.tipdia_entry,
+ "tools_painttipangle": self.ui.tools_defaults_form.tools_paint_group.tipangle_entry,
+ "tools_paintnewdia": self.ui.tools_defaults_form.tools_paint_group.newdia_entry,
+
# 2-sided Tool
"tools_2sided_mirror_axis": self.ui.tools_defaults_form.tools_2sided_group.mirror_axis_radio,
"tools_2sided_axis_loc": self.ui.tools_defaults_form.tools_2sided_group.axis_location_radio,
diff --git a/README.md b/README.md
index 4a872ab7..a2f7d29a 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,11 @@ CAD program, and create G-Code for Isolation routing.
=================================================
+16.01.2020
+
+- updated/optimized the GUI in Preferences for Paint Tool and for NCC Tool
+- work in Paint Tool to bring it up to date with NCC Tool
+
15.01.2020
- added key shortcuts and toolbar icons for the new tools: Align Object Tool (ALT+A) and Extract Drills (ALT+I)
diff --git a/flatcamEditors/FlatCAMGeoEditor.py b/flatcamEditors/FlatCAMGeoEditor.py
index 20ccb225..5b0b95b9 100644
--- a/flatcamEditors/FlatCAMGeoEditor.py
+++ b/flatcamEditors/FlatCAMGeoEditor.py
@@ -451,7 +451,7 @@ class PaintOptionsTool(FlatCAMTool):
grid.addWidget(self.painttooldia_entry, 0, 1)
# Overlap
- ovlabel = QtWidgets.QLabel('%s:' % _('Overlap Rate'))
+ ovlabel = QtWidgets.QLabel('%s:' % _('Overlap'))
ovlabel.setToolTip(
_("How much (percentage) of the tool width to overlap each tool pass.\n"
"Adjust the value starting with lower values\n"
diff --git a/flatcamGUI/PreferencesUI.py b/flatcamGUI/PreferencesUI.py
index 41ae3f32..ca736455 100644
--- a/flatcamGUI/PreferencesUI.py
+++ b/flatcamGUI/PreferencesUI.py
@@ -163,6 +163,7 @@ class ToolsPreferencesUI(QtWidgets.QWidget):
self.tools_ncc_group = ToolsNCCPrefGroupUI(decimals=self.decimals)
self.tools_ncc_group.setMinimumWidth(220)
+
self.tools_paint_group = ToolsPaintPrefGroupUI(decimals=self.decimals)
self.tools_paint_group.setMinimumWidth(220)
@@ -192,26 +193,29 @@ 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_cutout_group)
self.vlay1 = QtWidgets.QVBoxLayout()
- self.vlay1.addWidget(self.tools_cutout_group)
- self.vlay1.addWidget(self.tools_transform_group)
- self.vlay1.addWidget(self.tools_2sided_group)
+ self.vlay1.addWidget(self.tools_paint_group)
+ self.vlay1.addWidget(self.tools_panelize_group)
self.vlay2 = QtWidgets.QVBoxLayout()
- self.vlay2.addWidget(self.tools_panelize_group)
+ self.vlay2.addWidget(self.tools_transform_group)
+ self.vlay2.addWidget(self.tools_2sided_group)
self.vlay2.addWidget(self.tools_sub_group)
- self.vlay2.addWidget(self.tools_film_group)
self.vlay3 = QtWidgets.QVBoxLayout()
- self.vlay3.addWidget(self.tools_solderpaste_group)
+ self.vlay3.addWidget(self.tools_film_group)
self.vlay3.addWidget(self.tools_calculators_group)
+ self.vlay4 = QtWidgets.QVBoxLayout()
+ self.vlay4.addWidget(self.tools_solderpaste_group)
+
self.layout.addLayout(self.vlay)
self.layout.addLayout(self.vlay1)
self.layout.addLayout(self.vlay2)
self.layout.addLayout(self.vlay3)
+ self.layout.addLayout(self.vlay4)
self.layout.addStretch()
@@ -3562,8 +3566,8 @@ class ExcellonEditorPrefGroupUI(OptionsGroupUI):
grid0.addWidget(self.sel_limit_label, 0, 0)
grid0.addWidget(self.sel_limit_entry, 0, 1)
- # New tool diameter
- self.addtool_entry_lbl = QtWidgets.QLabel('%s:' % _('New Tool Dia'))
+ # New Diameter
+ self.addtool_entry_lbl = QtWidgets.QLabel('%s:' % _('New Dia'))
self.addtool_entry_lbl.setToolTip(
_("Diameter for the new tool")
)
@@ -5012,7 +5016,7 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
grid0 = QtWidgets.QGridLayout()
self.layout.addLayout(grid0)
- ncctdlabel = QtWidgets.QLabel('%s:' % _('Tools dia'))
+ ncctdlabel = QtWidgets.QLabel('%s:' % _('Tools Dia'))
ncctdlabel.setToolTip(
_("Diameters of the cutting tools, separated by comma.\n"
"The value of the diameter has to use the dot decimals separator.\n"
@@ -5088,9 +5092,12 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
grid0.addWidget(self.cutz_entry, 4, 1)
# New Diameter
- self.newdialabel = QtWidgets.QLabel('%s:' % _('New Tool Dia'))
+ self.newdialabel = QtWidgets.QLabel('%s:' % _('New Dia'))
self.newdialabel.setToolTip(
- _("The new tool diameter (cut width) to add in the tool table."))
+ _("Diameter for the new tool to add in the Tool Table.\n"
+ "If the tool is V-shape type then this value is automatically\n"
+ "calculated from the other parameters.")
+ )
self.newdia_entry = FCDoubleSpinner()
self.newdia_entry.set_precision(self.decimals)
self.newdia_entry.set_range(0.0001, 9999.9999)
@@ -5099,6 +5106,11 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
grid0.addWidget(self.newdialabel, 5, 0)
grid0.addWidget(self.newdia_entry, 5, 1)
+ separator_line = QtWidgets.QFrame()
+ separator_line.setFrameShape(QtWidgets.QFrame.HLine)
+ separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
+ grid0.addWidget(separator_line, 6, 0, 1, 2)
+
# Milling Type Radio Button
self.milling_type_label = QtWidgets.QLabel('%s:' % _('Milling Type'))
self.milling_type_label.setToolTip(
@@ -5115,8 +5127,8 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
"- conventional / useful when there is no backlash compensation")
)
- grid0.addWidget(self.milling_type_label, 6, 0)
- grid0.addWidget(self.milling_type_radio, 6, 1)
+ grid0.addWidget(self.milling_type_label, 7, 0)
+ grid0.addWidget(self.milling_type_radio, 7, 1)
# Tool order Radio Button
self.ncc_order_label = QtWidgets.QLabel('%s:' % _('Tool order'))
@@ -5136,11 +5148,16 @@ 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, 7, 0)
- grid0.addWidget(self.ncc_order_radio, 7, 1)
+ grid0.addWidget(self.ncc_order_label, 8, 0)
+ grid0.addWidget(self.ncc_order_radio, 8, 1)
+
+ separator_line = QtWidgets.QFrame()
+ separator_line.setFrameShape(QtWidgets.QFrame.HLine)
+ separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
+ grid0.addWidget(separator_line, 9, 0, 1, 2)
# Overlap Entry
- nccoverlabel = QtWidgets.QLabel('%s:' % _('Overlap Rate'))
+ nccoverlabel = QtWidgets.QLabel('%s:' % _('Overlap'))
nccoverlabel.setToolTip(
_("How much (percentage) of the tool width to overlap each tool pass.\n"
"Adjust the value starting with lower values\n"
@@ -5155,8 +5172,9 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
self.ncc_overlap_entry.setWrapping(True)
self.ncc_overlap_entry.setRange(0.0000, 99.9999)
self.ncc_overlap_entry.setSingleStep(0.1)
- grid0.addWidget(nccoverlabel, 8, 0)
- grid0.addWidget(self.ncc_overlap_entry, 8, 1)
+
+ grid0.addWidget(nccoverlabel, 10, 0)
+ grid0.addWidget(self.ncc_overlap_entry, 10, 1)
# Margin entry
nccmarginlabel = QtWidgets.QLabel('%s:' % _('Margin'))
@@ -5168,8 +5186,8 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
self.ncc_margin_entry.set_range(-10000, 10000)
self.ncc_margin_entry.setSingleStep(0.1)
- grid0.addWidget(nccmarginlabel, 9, 0)
- grid0.addWidget(self.ncc_margin_entry, 9, 1)
+ grid0.addWidget(nccmarginlabel, 11, 0)
+ grid0.addWidget(self.ncc_margin_entry, 11, 1)
# Method
methodlabel = QtWidgets.QLabel('%s:' % _('Method'))
@@ -5186,8 +5204,8 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
{"label": _("Straight lines"), "value": "lines"}
], orientation='vertical', stretch=False)
- grid0.addWidget(methodlabel, 10, 0)
- grid0.addWidget(self.ncc_method_radio, 10, 1)
+ grid0.addWidget(methodlabel, 12, 0)
+ grid0.addWidget(self.ncc_method_radio, 12, 1)
# Connect lines
self.ncc_connect_cb = FCCheckBox('%s' % _("Connect"))
@@ -5196,7 +5214,7 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
"segments to minimize tool lifts.")
)
- grid0.addWidget(self.ncc_connect_cb, 11, 0, 1, 2)
+ grid0.addWidget(self.ncc_connect_cb, 13, 0)
# Contour Checkbox
self.ncc_contour_cb = FCCheckBox('%s' % _("Contour"))
@@ -5205,21 +5223,7 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
"to trim rough edges.")
)
- grid0.addWidget(self.ncc_contour_cb, 12, 0, 1, 2)
-
- # Rest machining CheckBox
- self.ncc_rest_cb = FCCheckBox('%s' % _("Rest Machining"))
- self.ncc_rest_cb.setToolTip(
- _("If checked, use 'rest machining'.\n"
- "Basically it will clear copper outside PCB features,\n"
- "using the biggest tool and continue with the next tools,\n"
- "from bigger to smaller, to clear areas of copper that\n"
- "could not be cleared by previous tool, until there is\n"
- "no more copper to clear or there are no more tools.\n"
- "If not checked, use the standard algorithm.")
- )
-
- grid0.addWidget(self.ncc_rest_cb, 13, 0, 1, 2)
+ grid0.addWidget(self.ncc_contour_cb, 13, 1)
# ## NCC Offset choice
self.ncc_choice_offset_cb = FCCheckBox('%s' % _("Offset"))
@@ -5249,10 +5253,31 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
grid0.addWidget(self.ncc_offset_label, 15, 0)
grid0.addWidget(self.ncc_offset_spinner, 15, 1)
+ separator_line = QtWidgets.QFrame()
+ separator_line.setFrameShape(QtWidgets.QFrame.HLine)
+ separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
+ grid0.addWidget(separator_line, 16, 0, 1, 2)
+
+ # Rest machining CheckBox
+ self.ncc_rest_cb = FCCheckBox('%s' % _("Rest Machining"))
+ self.ncc_rest_cb.setToolTip(
+ _("If checked, use 'rest machining'.\n"
+ "Basically it will clear copper outside PCB features,\n"
+ "using the biggest tool and continue with the next tools,\n"
+ "from bigger to smaller, to clear areas of copper that\n"
+ "could not be cleared by previous tool, until there is\n"
+ "no more copper to clear or there are no more tools.\n"
+ "If not checked, use the standard algorithm.")
+ )
+
+ grid0.addWidget(self.ncc_rest_cb, 17, 0, 1, 2)
+
# ## Reference
self.reference_radio = RadioSet([{'label': _('Itself'), 'value': 'itself'},
- {"label": _("Area"), "value": "area"},
- {'label': _('Ref'), 'value': 'box'}])
+ {"label": _("Area Selection"), "value": "area"},
+ {'label': _('Reference Object'), 'value': 'box'}],
+ orientation='vertical',
+ stretch=None)
reference_label = QtWidgets.QLabel('%s:' % _("Reference"))
reference_label.setToolTip(
_("- 'Itself' - the non copper clearing extent\n"
@@ -5263,8 +5288,13 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
"specified by another object.")
)
- grid0.addWidget(reference_label, 16, 0)
- grid0.addWidget(self.reference_radio, 16, 1)
+ grid0.addWidget(reference_label, 18, 0)
+ grid0.addWidget(self.reference_radio, 18, 1)
+
+ separator_line = QtWidgets.QFrame()
+ separator_line.setFrameShape(QtWidgets.QFrame.HLine)
+ separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
+ grid0.addWidget(separator_line, 19, 0, 1, 2)
# ## Plotting type
self.ncc_plotting_radio = RadioSet([{'label': _('Normal'), 'value': 'normal'},
@@ -5274,8 +5304,8 @@ class ToolsNCCPrefGroupUI(OptionsGroupUI):
_("- 'Normal' - normal plotting, done at the end of the NCC job\n"
"- 'Progressive' - after each shape is generated it will be plotted.")
)
- grid0.addWidget(plotting_label, 17, 0)
- grid0.addWidget(self.ncc_plotting_radio, 17, 1)
+ grid0.addWidget(plotting_label, 20, 0)
+ grid0.addWidget(self.ncc_plotting_radio, 20, 1)
self.layout.addStretch()
@@ -5520,10 +5550,12 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
self.layout.addWidget(self.paint_label)
grid0 = QtWidgets.QGridLayout()
+ grid0.setColumnStretch(0, 0)
+ grid0.setColumnStretch(1, 1)
self.layout.addLayout(grid0)
# Tool dia
- ptdlabel = QtWidgets.QLabel('%s:' % _('Tool dia'))
+ ptdlabel = QtWidgets.QLabel('%s:' % _('Tools Dia'))
ptdlabel.setToolTip(
_("Diameters of the cutting tools, separated by comma.\n"
"The value of the diameter has to use the dot decimals separator.\n"
@@ -5536,7 +5568,88 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
grid0.addWidget(self.painttooldia_entry, 0, 1)
- self.paint_order_label = QtWidgets.QLabel('%s:' % _('Tool order'))
+ # 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.setObjectName(_("Tool Type"))
+
+ 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 = FCDoubleSpinner()
+ self.tipdia_entry.set_precision(self.decimals)
+ self.tipdia_entry.set_range(0.0000, 9999.9999)
+ self.tipdia_entry.setSingleStep(0.1)
+ self.tipdia_entry.setObjectName(_("V-Tip Dia"))
+
+ 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 = FCDoubleSpinner()
+ self.tipangle_entry.set_precision(self.decimals)
+ self.tipangle_entry.set_range(0.0000, 180.0000)
+ self.tipangle_entry.setSingleStep(5)
+ self.tipangle_entry.setObjectName(_("V-Tip Angle"))
+
+ grid0.addWidget(self.tipanglelabel, 3, 0)
+ grid0.addWidget(self.tipangle_entry, 3, 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 = FCDoubleSpinner()
+ self.cutz_entry.set_precision(self.decimals)
+ self.cutz_entry.set_range(-99999.9999, 0.0000)
+ self.cutz_entry.setObjectName(_("Cut Z"))
+
+ self.cutz_entry.setToolTip(
+ _("Depth of cut into material. Negative value.\n"
+ "In FlatCAM units.")
+ )
+ grid0.addWidget(cutzlabel, 4, 0)
+ grid0.addWidget(self.cutz_entry, 4, 1)
+
+ # ### Tool Diameter ####
+ self.newdialabel = QtWidgets.QLabel('%s:' % _('New Dia'))
+ self.newdialabel.setToolTip(
+ _("Diameter for the new tool to add in the Tool Table.\n"
+ "If the tool is V-shape type then this value is automatically\n"
+ "calculated from the other parameters.")
+ )
+ self.newdia_entry = FCDoubleSpinner()
+ self.newdia_entry.set_precision(self.decimals)
+ self.newdia_entry.set_range(0.000, 9999.9999)
+ self.newdia_entry.setObjectName(_("Tool Dia"))
+
+ grid0.addWidget(self.newdialabel, 5, 0)
+ grid0.addWidget(self.newdia_entry, 5, 1)
+
+ separator_line = QtWidgets.QFrame()
+ separator_line.setFrameShape(QtWidgets.QFrame.HLine)
+ separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
+ grid0.addWidget(separator_line, 6, 0, 1, 2)
+
+ self.paint_order_label = QtWidgets.QLabel('%s:' % _('Tool order'))
self.paint_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"
"'Forward' --> means that the tools will be ordered from small to big\n"
@@ -5547,17 +5660,17 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
self.paint_order_radio = RadioSet([{'label': _('No'), 'value': 'no'},
{'label': _('Forward'), 'value': 'fwd'},
{'label': _('Reverse'), 'value': 'rev'}])
- self.paint_order_radio.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"
- "'Forward' --> means that the tools will be ordered from small to big\n"
- "'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.paint_order_label, 1, 0)
- grid0.addWidget(self.paint_order_radio, 1, 1)
+
+ grid0.addWidget(self.paint_order_label, 7, 0)
+ grid0.addWidget(self.paint_order_radio, 7, 1)
+
+ separator_line = QtWidgets.QFrame()
+ separator_line.setFrameShape(QtWidgets.QFrame.HLine)
+ separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
+ grid0.addWidget(separator_line, 8, 0, 1, 2)
# Overlap
- ovlabel = QtWidgets.QLabel('%s:' % _('Overlap Rate'))
+ ovlabel = QtWidgets.QLabel('%s:' % _('Overlap'))
ovlabel.setToolTip(
_("How much (percentage) of the tool width to overlap each tool pass.\n"
"Adjust the value starting with lower values\n"
@@ -5573,8 +5686,8 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
self.paintoverlap_entry.setRange(0.0000, 99.9999)
self.paintoverlap_entry.setSingleStep(0.1)
- grid0.addWidget(ovlabel, 2, 0)
- grid0.addWidget(self.paintoverlap_entry, 2, 1)
+ grid0.addWidget(ovlabel, 9, 0)
+ grid0.addWidget(self.paintoverlap_entry, 9, 1)
# Margin
marginlabel = QtWidgets.QLabel('%s:' % _('Margin'))
@@ -5583,13 +5696,13 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
"the edges of the polygon to\n"
"be painted.")
)
- grid0.addWidget(marginlabel, 3, 0)
self.paintmargin_entry = FCDoubleSpinner()
self.paintmargin_entry.set_range(-9999.9999, 9999.9999)
self.paintmargin_entry.set_precision(self.decimals)
self.paintmargin_entry.setSingleStep(0.1)
- grid0.addWidget(self.paintmargin_entry, 3, 1)
+ grid0.addWidget(marginlabel, 10, 0)
+ grid0.addWidget(self.paintmargin_entry, 10, 1)
# Method
methodlabel = QtWidgets.QLabel('%s:' % _('Method'))
@@ -5599,13 +5712,15 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
"Seed-based: Outwards from seed.
"
"Line-based: Parallel lines.")
)
- grid0.addWidget(methodlabel, 4, 0)
+
self.paintmethod_combo = RadioSet([
{"label": _("Standard"), "value": "standard"},
{"label": _("Seed-based"), "value": "seed"},
{"label": _("Straight lines"), "value": "lines"}
], orientation='vertical', stretch=False)
- grid0.addWidget(self.paintmethod_combo, 4, 1)
+
+ grid0.addWidget(methodlabel, 11, 0)
+ grid0.addWidget(self.paintmethod_combo, 11, 1)
# Connect lines
self.pathconnect_cb = FCCheckBox('%s' % _("Connect"))
@@ -5613,7 +5728,7 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
_("Draw lines between resulting\n"
"segments to minimize tool lifts.")
)
- grid0.addWidget(self.pathconnect_cb, 5, 0, 1, 2)
+ grid0.addWidget(self.pathconnect_cb, 12, 0)
# Paint contour
self.contour_cb = FCCheckBox('%s' % _("Contour"))
@@ -5621,7 +5736,25 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
_("Cut around the perimeter of the polygon\n"
"to trim rough edges.")
)
- grid0.addWidget(self.contour_cb, 6, 0, 1, 2)
+ grid0.addWidget(self.contour_cb, 12, 1)
+
+ separator_line = QtWidgets.QFrame()
+ separator_line.setFrameShape(QtWidgets.QFrame.HLine)
+ separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
+ grid0.addWidget(separator_line, 13, 0, 1, 2)
+
+ self.rest_cb = FCCheckBox('%s' % _("Rest Machining"))
+ self.rest_cb.setObjectName(_("Rest Machining"))
+ self.rest_cb.setToolTip(
+ _("If checked, use 'rest machining'.\n"
+ "Basically it will clear copper outside PCB features,\n"
+ "using the biggest tool and continue with the next tools,\n"
+ "from bigger to smaller, to clear areas of copper that\n"
+ "could not be cleared by previous tool, until there is\n"
+ "no more copper to clear or there are no more tools.\n\n"
+ "If not checked, use the standard algorithm.")
+ )
+ grid0.addWidget(self.rest_cb, 14, 0, 1, 2)
# Polygon selection
selectlabel = QtWidgets.QLabel('%s:' % _('Selection'))
@@ -5634,14 +5767,23 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
"- 'Reference Object' - will do non copper clearing within the area\n"
"specified by another object.")
)
- self.selectmethod_combo = RadioSet([
- {"label": _("Sel"), "value": "single"},
- {"label": _("Area"), "value": "area"},
- {"label": _("All"), "value": "all"},
- {"label": _("Ref"), "value": "ref"}
- ])
- grid0.addWidget(selectlabel, 7, 0)
- grid0.addWidget(self.selectmethod_combo, 7, 1)
+ self.selectmethod_combo = RadioSet(
+ [
+ {"label": _("Polygon Selection"), "value": "single"},
+ {"label": _("Area Selection"), "value": "area"},
+ {"label": _("All Polygons"), "value": "all"},
+ {"label": _("Reference Object"), "value": "ref"}
+ ],
+ orientation='vertical',
+ stretch=None
+ )
+ grid0.addWidget(selectlabel, 15, 0)
+ grid0.addWidget(self.selectmethod_combo, 15, 1)
+
+ separator_line = QtWidgets.QFrame()
+ separator_line.setFrameShape(QtWidgets.QFrame.HLine)
+ separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
+ grid0.addWidget(separator_line, 16, 0, 1, 2)
# ## Plotting type
self.paint_plotting_radio = RadioSet([{'label': _('Normal'), 'value': 'normal'},
@@ -5651,8 +5793,8 @@ class ToolsPaintPrefGroupUI(OptionsGroupUI):
_("- 'Normal' - normal plotting, done at the end of the Paint job\n"
"- 'Progressive' - after each shape is generated it will be plotted.")
)
- grid0.addWidget(plotting_label, 8, 0)
- grid0.addWidget(self.paint_plotting_radio, 8, 1)
+ grid0.addWidget(plotting_label, 17, 0)
+ grid0.addWidget(self.paint_plotting_radio, 17, 1)
self.layout.addStretch()
diff --git a/flatcamTools/ToolNonCopperClear.py b/flatcamTools/ToolNonCopperClear.py
index 5b2e8b1d..1b0896dc 100644
--- a/flatcamTools/ToolNonCopperClear.py
+++ b/flatcamTools/ToolNonCopperClear.py
@@ -352,7 +352,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
self.grid3.addWidget(self.tool_data_label, 12, 0, 1, 2)
# Overlap Entry
- nccoverlabel = QtWidgets.QLabel('%s:' % _('Overlap Rate'))
+ nccoverlabel = QtWidgets.QLabel('%s:' % _('Overlap'))
nccoverlabel.setToolTip(
_("How much (percentage) of the tool width to overlap each tool pass.\n"
"Adjust the value starting with lower values\n"
@@ -367,7 +367,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
self.ncc_overlap_entry.setWrapping(True)
self.ncc_overlap_entry.setRange(0.000, 99.9999)
self.ncc_overlap_entry.setSingleStep(0.1)
- self.ncc_overlap_entry.setObjectName(_("Overlap Rate"))
+ self.ncc_overlap_entry.setObjectName(_("Overlap"))
self.grid3.addWidget(nccoverlabel, 13, 0)
self.grid3.addWidget(self.ncc_overlap_entry, 13, 1)
@@ -653,7 +653,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
}
self.name2option = {
- _('Overlap Rate'): "nccoverlap",
+ _('Overlap'): "nccoverlap",
_('Margin'): "nccmargin",
_('Method'): "nccmethod",
_("Connect"): "nccconnect",
@@ -663,6 +663,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
_('Milling Type'): "milling_type",
}
+ self.old_tool_dia = None
+
# #############################################################################
# ############################ SIGNALS ########################################
# #############################################################################
@@ -901,6 +903,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
self.tipangle_entry.set_value(self.app.defaults["tools_ncctipangle"])
self.addtool_entry.set_value(self.app.defaults["tools_nccnewdia"])
+ self.old_tool_dia = self.app.defaults["tools_nccnewdia"]
+
self.on_tool_type(val=self.tool_type_radio.get_value())
# init the working variables
@@ -1238,6 +1242,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
self.tipdia_entry.show()
self.tipanglelabel.show()
self.tipangle_entry.show()
+
+ self.on_calculate_tooldia()
else:
self.addtool_entry_lbl.setDisabled(False)
self.addtool_entry.setDisabled(False)
@@ -1246,6 +1252,8 @@ class NonCopperClear(FlatCAMTool, Gerber):
self.tipanglelabel.hide()
self.tipangle_entry.hide()
+ self.addtool_entry.set_value(self.old_tool_dia)
+
def on_calculate_tooldia(self):
if self.tool_type_radio.get_value() == 'V':
tip_dia = float(self.tipdia_entry.get_value())
@@ -1332,7 +1340,6 @@ class NonCopperClear(FlatCAMTool, Gerber):
})
self.blockSignals(False)
-
self.build_ui()
def on_tool_edit(self):
@@ -1393,7 +1400,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
deleted_tools_list = []
if all_tools:
- self.paint_tools.clear()
+ self.ncc_tools.clear()
self.blockSignals(False)
self.build_ui()
return
diff --git a/flatcamTools/ToolPaint.py b/flatcamTools/ToolPaint.py
index dd4e76a5..18f1f3a9 100644
--- a/flatcamTools/ToolPaint.py
+++ b/flatcamTools/ToolPaint.py
@@ -329,7 +329,7 @@ class ToolPaint(FlatCAMTool, Gerber):
self.tools_box.addLayout(grid4)
# Overlap
- ovlabel = QtWidgets.QLabel('%s:' % _('Overlap Rate'))
+ ovlabel = QtWidgets.QLabel('%s:' % _('Overlap'))
ovlabel.setToolTip(
_("How much (percentage) of the tool width to overlap each tool pass.\n"
"Adjust the value starting with lower values\n"
@@ -344,7 +344,7 @@ class ToolPaint(FlatCAMTool, Gerber):
self.paintoverlap_entry.setWrapping(True)
self.paintoverlap_entry.setRange(0.0000, 99.9999)
self.paintoverlap_entry.setSingleStep(0.1)
- self.paintoverlap_entry.setObjectName(_("Overlap Rate"))
+ self.paintoverlap_entry.setObjectName(_("Overlap"))
grid4.addWidget(ovlabel, 1, 0)
grid4.addWidget(self.paintoverlap_entry, 1, 1)
@@ -583,13 +583,15 @@ class ToolPaint(FlatCAMTool, Gerber):
}
self.name2option = {
- _('Overlap Rate'): "paintoverlap",
+ _('Overlap'): "paintoverlap",
_('Margin'): "paintmargin",
_('Method'): "paintmethod",
_("Connect"): "pathconnect",
_("Contour"): "paintcontour",
}
+ self.old_tool_dia = None
+
# #############################################################################
# ################################# Signals ###################################
# #############################################################################
@@ -833,6 +835,8 @@ class ToolPaint(FlatCAMTool, Gerber):
self.tipdia_entry.show()
self.tipanglelabel.show()
self.tipangle_entry.show()
+
+ self.on_calculate_tooldia()
else:
self.addtool_entry_lbl.setDisabled(False)
self.addtool_entry.setDisabled(False)
@@ -841,6 +845,8 @@ class ToolPaint(FlatCAMTool, Gerber):
self.tipanglelabel.hide()
self.tipangle_entry.hide()
+ self.addtool_entry.set_value(self.old_tool_dia)
+
def on_calculate_tooldia(self):
if self.tool_type_radio.get_value() == 'V':
tip_dia = float(self.tipdia_entry.get_value())
@@ -921,6 +927,9 @@ class ToolPaint(FlatCAMTool, Gerber):
self.tipdia_entry.set_value(self.app.defaults["tools_painttipdia"])
self.tipangle_entry.set_value(self.app.defaults["tools_painttipangle"])
self.addtool_entry.set_value(self.app.defaults["tools_paintnewdia"])
+ self.rest_cb.set_value(self.app.defaults["tools_paintrest"])
+
+ self.old_tool_dia = self.app.defaults["tools_paintnewdia"]
self.on_tool_type(val=self.tool_type_radio.get_value())
@@ -1080,21 +1089,16 @@ class ToolPaint(FlatCAMTool, Gerber):
self.box_combo.setCurrentIndex(0)
def on_tool_add(self, dia=None, muted=None):
-
- try:
- self.tools_table.itemChanged.disconnect()
- except TypeError:
- pass
+ self.blockSignals(True)
if dia:
tool_dia = dia
else:
- tool_dia = float(self.addtool_entry.get_value())
+ tool_dia = self.on_calculate_tooldia()
if tool_dia is None:
self.build_ui()
- self.app.inform.emit('[WARNING_NOTCL] %s' %
- _("Please enter a tool diameter to add, in Float format."))
+ self.app.inform.emit('[WARNING_NOTCL] %s' % _("Please enter a tool diameter to add, in Float format."))
return
# construct a list of all 'tooluid' in the self.tools
@@ -1136,15 +1140,13 @@ class ToolPaint(FlatCAMTool, Gerber):
}
})
+ self.blockSignals(False)
self.build_ui()
def on_tool_edit(self):
- old_tool_dia = ''
+ self.blockSignals(True)
- try:
- self.tools_table.itemChanged.disconnect()
- except TypeError:
- pass
+ old_tool_dia = ''
tool_dias = []
for k, v in self.paint_tools.items():
@@ -1182,6 +1184,7 @@ class ToolPaint(FlatCAMTool, Gerber):
restore_dia_item.setText(str(old_tool_dia))
self.app.inform.emit('[WARNING_NOTCL] %s' %
_("Edit cancelled. New diameter value is already in the Tool Table."))
+ self.blockSignals(False)
self.build_ui()
# def on_tool_copy(self, all=None):
@@ -1240,15 +1243,13 @@ class ToolPaint(FlatCAMTool, Gerber):
# self.app.inform.emit("[success] Tool was copied in the Tool Table.")
def on_tool_delete(self, rows_to_delete=None, all=None):
- try:
- self.tools_table.itemChanged.disconnect()
- except TypeError:
- pass
+ self.blockSignals(True)
deleted_tools_list = []
if all:
self.paint_tools.clear()
+ self.blockSignals(False)
self.build_ui()
return
@@ -1262,6 +1263,8 @@ class ToolPaint(FlatCAMTool, Gerber):
for t in deleted_tools_list:
self.paint_tools.pop(t, None)
+
+ self.blockSignals(False)
self.build_ui()
return
@@ -1278,14 +1281,14 @@ class ToolPaint(FlatCAMTool, Gerber):
self.paint_tools.pop(t, None)
except AttributeError:
- self.app.inform.emit('[WARNING_NOTCL] %s' %
- _("Delete failed. Select a tool to delete."))
+ self.app.inform.emit('[WARNING_NOTCL] %s' % _("Delete failed. Select a tool to delete."))
+ self.blockSignals(False)
return
except Exception as e:
log.debug(str(e))
- self.app.inform.emit('[success] %s' %
- _("Tool(s) deleted from Tool Table."))
+ self.app.inform.emit('[success] %s' % _("Tool(s) deleted from Tool Table."))
+ self.blockSignals(False)
self.build_ui()
def on_paint_button_click(self):