diff --git a/CHANGELOG.md b/CHANGELOG.md index 372de187..c84d01ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ CHANGELOG for FlatCAM beta - some cleaning up in the Preferences - cleaned up the Geometry and Gerber object classes - more cleanup in Isolation Plugin +- started the work in adding to Isolation Plugin a new feature to extra isolate the pads 18.08.2021 diff --git a/appGUI/preferences/PreferencesUIManager.py b/appGUI/preferences/PreferencesUIManager.py index dc17b4f6..a4413107 100644 --- a/appGUI/preferences/PreferencesUIManager.py +++ b/appGUI/preferences/PreferencesUIManager.py @@ -286,6 +286,7 @@ class PreferencesUIManager: "tools_iso_tool_shape": self.ui.plugin_eng_pref_form.tools_iso_group.tool_shape_combo, # "C1" "tools_iso_passes": self.ui.plugin_eng_pref_form.tools_iso_group.passes_entry, + "tools_iso_pad_passes": self.ui.plugin_eng_pref_form.tools_iso_group.pad_passes_entry, "tools_iso_overlap": self.ui.plugin_eng_pref_form.tools_iso_group.overlap_entry, "tools_iso_milling_type": self.ui.plugin_eng_pref_form.tools_iso_group.milling_type_radio, "tools_iso_isotype": self.ui.plugin_eng_pref_form.tools_iso_group.iso_type_radio, diff --git a/appGUI/preferences/tools/ToolsISOPrefGroupUI.py b/appGUI/preferences/tools/ToolsISOPrefGroupUI.py index 503856a9..11d3cf19 100644 --- a/appGUI/preferences/tools/ToolsISOPrefGroupUI.py +++ b/appGUI/preferences/tools/ToolsISOPrefGroupUI.py @@ -76,8 +76,8 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): "In application units.") ) - grid0.addWidget(cutzlabel, 10, 0) - grid0.addWidget(self.cutz_entry, 10, 1, 1, 2) + grid0.addWidget(cutzlabel, 6, 0) + grid0.addWidget(self.cutz_entry, 6, 1, 1, 2) # New Diameter self.newdialabel = FCLabel('%s:' % _('New Dia')) @@ -91,15 +91,15 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): self.newdia_entry.set_range(0.0001, 10000.0000) self.newdia_entry.setSingleStep(0.1) - grid0.addWidget(self.newdialabel, 12, 0) - grid0.addWidget(self.newdia_entry, 12, 1, 1, 2) + grid0.addWidget(self.newdialabel, 8, 0) + grid0.addWidget(self.newdia_entry, 8, 1, 1, 2) separator_line = QtWidgets.QFrame() separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine) separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - grid0.addWidget(separator_line, 14, 0, 1, 3) + grid0.addWidget(separator_line, 10, 0, 1, 3) - # Tool Type + # Shape tool_shape_label = FCLabel('%s:' % _('Shape')) tool_shape_label.setToolTip( _("Tool Shape. \n" @@ -110,11 +110,10 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): ) self.tool_shape_combo = FCComboBox2(policy=False) - self.tool_shape_combo.setObjectName('i_tool_shape') self.tool_shape_combo.addItems(["C1", "C2", "C3", "C4", "B", "V"]) - grid0.addWidget(tool_shape_label, 16, 0) - grid0.addWidget(self.tool_shape_combo, 16, 1, 1, 2) + grid0.addWidget(tool_shape_label, 12, 0) + grid0.addWidget(self.tool_shape_combo, 12, 1, 1, 2) # Passes passlabel = FCLabel('%s:' % _('Passes')) @@ -124,10 +123,21 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): ) self.passes_entry = FCSpinner() self.passes_entry.set_range(1, 999) - self.passes_entry.setObjectName("i_passes") - grid0.addWidget(passlabel, 18, 0) - grid0.addWidget(self.passes_entry, 18, 1, 1, 2) + grid0.addWidget(passlabel, 14, 0) + grid0.addWidget(self.passes_entry, 14, 1, 1, 2) + + # Pad Passes + padpasslabel = FCLabel('%s:' % _('Pad Passes')) + padpasslabel.setToolTip( + _("Width of the extra isolation gap for pads only,\n" + "in number (integer) of tool widths.") + ) + self.pad_passes_entry = FCSpinner() + self.pad_passes_entry.set_range(0, 999) + + grid0.addWidget(padpasslabel, 16, 0) + grid0.addWidget(self.pad_passes_entry, 16, 1, 1, 2) # Overlap Entry overlabel = FCLabel('%s:' % _('Overlap')) @@ -139,7 +149,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): self.overlap_entry.setWrapping(True) self.overlap_entry.set_range(0.0000, 99.9999) self.overlap_entry.setSingleStep(0.1) - self.overlap_entry.setObjectName("i_overlap") grid0.addWidget(overlabel, 20, 0) grid0.addWidget(self.overlap_entry, 20, 1, 1, 2) @@ -178,7 +187,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): self.iso_type_radio = RadioSet([{'label': _('Full'), 'value': 'full'}, {'label': _('Ext'), 'value': 'ext'}, {'label': _('Int'), 'value': 'int'}]) - self.iso_type_radio.setObjectName("i_type") grid0.addWidget(self.iso_type_label, 24, 0) grid0.addWidget(self.iso_type_radio, 24, 1, 1, 2) @@ -190,7 +198,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): # Rest machining CheckBox self.rest_cb = FCCheckBox('%s' % _("Rest")) - self.rest_cb.setObjectName("i_rest_machining") self.rest_cb.setToolTip( _("If checked, use 'rest machining'.\n" "Basically it will process copper outside PCB features,\n" @@ -208,7 +215,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): self.combine_passes_cb.setToolTip( _("Combine all passes into one object") ) - self.combine_passes_cb.setObjectName("i_combine") grid0.addWidget(self.combine_passes_cb, 28, 1) @@ -217,7 +223,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): self.except_cb.setToolTip(_("When the isolation geometry is generated,\n" "by checking this, the area of the object below\n" "will be subtracted from the isolation geometry.")) - self.except_cb.setObjectName("i_except") grid0.addWidget(self.except_cb, 28, 2) # Check Tool validity @@ -226,7 +231,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): _("If checked then the tools diameters are verified\n" "if they will provide a complete isolation.") ) - self.valid_cb.setObjectName("i_check") grid0.addWidget(self.valid_cb, 30, 0, 1, 3) @@ -243,7 +247,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI): self.select_combo.addItems( [_("All"), _("Area Selection"), _("Polygon Selection"), _("Reference Object")] ) - self.select_combo.setObjectName("i_selection") grid0.addWidget(self.select_label, 32, 0) grid0.addWidget(self.select_combo, 32, 1, 1, 2) diff --git a/appPlugins/ToolIsolation.py b/appPlugins/ToolIsolation.py index c3ac62a9..19efceec 100644 --- a/appPlugins/ToolIsolation.py +++ b/appPlugins/ToolIsolation.py @@ -118,6 +118,7 @@ class ToolIsolation(AppTool, Gerber): self.form_fields = { "tools_mill_tool_shape": self.ui.tool_shape_combo, "tools_iso_passes": self.ui.passes_entry, + "tools_iso_pad_passes": self.ui.pad_passes_entry, "tools_iso_overlap": self.ui.iso_overlap_entry, "tools_iso_milling_type": self.ui.milling_type_radio, "tools_iso_combine": self.ui.combine_passes_cb, @@ -127,6 +128,7 @@ class ToolIsolation(AppTool, Gerber): self.name2option = { "i_tool_shape": "tools_mill_tool_shape", "i_passes": "tools_iso_passes", + "i_pad_passes": "tools_iso_pad_passes", "i_overlap": "tools_iso_overlap", "i_milling_type": "tools_iso_milling_type", "i_combine": "tools_iso_combine", @@ -278,6 +280,7 @@ class ToolIsolation(AppTool, Gerber): self.form_fields = { "tools_mill_tool_shape": self.ui.tool_shape_combo, "tools_iso_passes": self.ui.passes_entry, + "tools_iso_pad_passes": self.ui.pad_passes_entry, "tools_iso_overlap": self.ui.iso_overlap_entry, "tools_iso_milling_type": self.ui.milling_type_radio, "tools_iso_combine": self.ui.combine_passes_cb, @@ -324,6 +327,7 @@ class ToolIsolation(AppTool, Gerber): self.ui.order_radio.set_value(self.app.defaults["tools_iso_order"]) self.ui.tool_shape_combo.set_value(self.app.defaults["tools_iso_tool_shape"]) self.ui.passes_entry.set_value(self.app.defaults["tools_iso_passes"]) + self.ui.pad_passes_entry.set_value(self.app.defaults["tools_iso_pad_passes"]) self.ui.iso_overlap_entry.set_value(self.app.defaults["tools_iso_overlap"]) self.ui.milling_type_radio.set_value(self.app.defaults["tools_iso_milling_type"]) self.ui.combine_passes_cb.set_value(self.app.defaults["tools_iso_combine_passes"]) @@ -1668,7 +1672,7 @@ class ToolIsolation(AppTool, Gerber): self.iso_tools[tool_iso][key]["tools_iso_selection"] = self.ui.select_combo.get_value() self.iso_tools[tool_iso][key]["tools_iso_area_shape"] = self.ui.area_shape_radio.get_value() self.iso_tools[tool_iso][key]["tools_mill_job_type"] = 2 # _("Isolation") - self.iso_tools[tool_iso][key]["tools_mill_tool_shape"] = 5 # "V" + self.iso_tools[tool_iso][key]["tools_mill_tool_shape"] = self.ui.tool_shape_combo.get_value() if combine: if self.ui.rest_cb.get_value(): @@ -1704,8 +1708,6 @@ class ToolIsolation(AppTool, Gerber): tool_dia = tools_storage[tool]['tooldia'] for i in range(passes): - tool_type = tools_storage[tool]['data']['tools_mill_tool_shape'] - iso_offset = tool_dia * ((2 * i + 1) / 2.0000001) - (i * overlap * tool_dia) if negative_dia: iso_offset = -iso_offset @@ -1770,10 +1772,6 @@ class ToolIsolation(AppTool, Gerber): geo_obj.tools.update({ '1': { 'tooldia': float(tool_dia), - 'offset': 'Path', - 'offset_value': 0.0, - 'type': 'Rough', - 'tool_type': tool_type, 'data': tool_data, 'solid_geometry': geo_obj.solid_geometry } @@ -1878,7 +1876,6 @@ class ToolIsolation(AppTool, Gerber): if float('%.*f' % (self.decimals, tools_storage[tool]['tooldia'])) == sorted_tool: tool_dia = tools_storage[tool]['tooldia'] - tool_type = tools_storage[tool]['data']['tools_mill_tool_shape'] tool_data = tools_storage[tool]['data'] passes = tool_data['tools_iso_passes'] @@ -1932,10 +1929,6 @@ class ToolIsolation(AppTool, Gerber): tools_storage.update({ tool: { 'tooldia': float(tool_dia), - 'offset': 'Path', - 'offset_value': 0.0, - 'type': 'Rough', - 'tool_type': tool_type, 'data': tool_data, 'solid_geometry': deepcopy(new_solid_geo) } @@ -3379,6 +3372,19 @@ class IsoUI: self.grid3.addWidget(passlabel, 15, 0) self.grid3.addWidget(self.passes_entry, 15, 1) + # Pad Passes + padpasslabel = FCLabel('%s:' % _('Pad Passes')) + padpasslabel.setToolTip( + _("Width of the extra isolation gap for pads only,\n" + "in number (integer) of tool widths.") + ) + self.pad_passes_entry = FCSpinner() + self.pad_passes_entry.set_range(0, 999) + self.pad_passes_entry.setObjectName("i_pad_passes") + + self.grid3.addWidget(padpasslabel, 16, 0) + self.grid3.addWidget(self.pad_passes_entry, 16, 1, 1, 2) + # Overlap Entry overlabel = FCLabel('%s:' % _('Overlap')) overlabel.setToolTip( diff --git a/defaults.py b/defaults.py index 5c9a5c6a..0e70e2ab 100644 --- a/defaults.py +++ b/defaults.py @@ -355,6 +355,7 @@ class FlatCAMDefaults: "tools_iso_tool_shape": 0, # "C1" "tools_iso_passes": 1, + "tools_iso_pad_passes": 0, "tools_iso_overlap": 10, "tools_iso_milling_type": "cl", "tools_iso_isotype": "full",