- started the work in adding to Isolation Plugin a new feature to extra isolate the pads

This commit is contained in:
Marius Stanciu
2021-08-19 15:53:02 +03:00
parent 1c06c05c22
commit 2136d6c42f
5 changed files with 43 additions and 31 deletions

View File

@@ -12,6 +12,7 @@ CHANGELOG for FlatCAM beta
- some cleaning up in the Preferences - some cleaning up in the Preferences
- cleaned up the Geometry and Gerber object classes - cleaned up the Geometry and Gerber object classes
- more cleanup in Isolation Plugin - more cleanup in Isolation Plugin
- started the work in adding to Isolation Plugin a new feature to extra isolate the pads
18.08.2021 18.08.2021

View File

@@ -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_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_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_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_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, "tools_iso_isotype": self.ui.plugin_eng_pref_form.tools_iso_group.iso_type_radio,

View File

@@ -76,8 +76,8 @@ class ToolsISOPrefGroupUI(OptionsGroupUI):
"In application units.") "In application units.")
) )
grid0.addWidget(cutzlabel, 10, 0) grid0.addWidget(cutzlabel, 6, 0)
grid0.addWidget(self.cutz_entry, 10, 1, 1, 2) grid0.addWidget(self.cutz_entry, 6, 1, 1, 2)
# New Diameter # New Diameter
self.newdialabel = FCLabel('%s:' % _('New Dia')) 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.set_range(0.0001, 10000.0000)
self.newdia_entry.setSingleStep(0.1) self.newdia_entry.setSingleStep(0.1)
grid0.addWidget(self.newdialabel, 12, 0) grid0.addWidget(self.newdialabel, 8, 0)
grid0.addWidget(self.newdia_entry, 12, 1, 1, 2) grid0.addWidget(self.newdia_entry, 8, 1, 1, 2)
separator_line = QtWidgets.QFrame() separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine) separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) 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 = FCLabel('%s:' % _('Shape'))
tool_shape_label.setToolTip( tool_shape_label.setToolTip(
_("Tool Shape. \n" _("Tool Shape. \n"
@@ -110,11 +110,10 @@ class ToolsISOPrefGroupUI(OptionsGroupUI):
) )
self.tool_shape_combo = FCComboBox2(policy=False) 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"]) self.tool_shape_combo.addItems(["C1", "C2", "C3", "C4", "B", "V"])
grid0.addWidget(tool_shape_label, 16, 0) grid0.addWidget(tool_shape_label, 12, 0)
grid0.addWidget(self.tool_shape_combo, 16, 1, 1, 2) grid0.addWidget(self.tool_shape_combo, 12, 1, 1, 2)
# Passes # Passes
passlabel = FCLabel('%s:' % _('Passes')) passlabel = FCLabel('%s:' % _('Passes'))
@@ -124,10 +123,21 @@ class ToolsISOPrefGroupUI(OptionsGroupUI):
) )
self.passes_entry = FCSpinner() self.passes_entry = FCSpinner()
self.passes_entry.set_range(1, 999) self.passes_entry.set_range(1, 999)
self.passes_entry.setObjectName("i_passes")
grid0.addWidget(passlabel, 18, 0) grid0.addWidget(passlabel, 14, 0)
grid0.addWidget(self.passes_entry, 18, 1, 1, 2) 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 # Overlap Entry
overlabel = FCLabel('%s:' % _('Overlap')) overlabel = FCLabel('%s:' % _('Overlap'))
@@ -139,7 +149,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI):
self.overlap_entry.setWrapping(True) self.overlap_entry.setWrapping(True)
self.overlap_entry.set_range(0.0000, 99.9999) self.overlap_entry.set_range(0.0000, 99.9999)
self.overlap_entry.setSingleStep(0.1) self.overlap_entry.setSingleStep(0.1)
self.overlap_entry.setObjectName("i_overlap")
grid0.addWidget(overlabel, 20, 0) grid0.addWidget(overlabel, 20, 0)
grid0.addWidget(self.overlap_entry, 20, 1, 1, 2) 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'}, self.iso_type_radio = RadioSet([{'label': _('Full'), 'value': 'full'},
{'label': _('Ext'), 'value': 'ext'}, {'label': _('Ext'), 'value': 'ext'},
{'label': _('Int'), 'value': 'int'}]) {'label': _('Int'), 'value': 'int'}])
self.iso_type_radio.setObjectName("i_type")
grid0.addWidget(self.iso_type_label, 24, 0) grid0.addWidget(self.iso_type_label, 24, 0)
grid0.addWidget(self.iso_type_radio, 24, 1, 1, 2) grid0.addWidget(self.iso_type_radio, 24, 1, 1, 2)
@@ -190,7 +198,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI):
# Rest machining CheckBox # Rest machining CheckBox
self.rest_cb = FCCheckBox('%s' % _("Rest")) self.rest_cb = FCCheckBox('%s' % _("Rest"))
self.rest_cb.setObjectName("i_rest_machining")
self.rest_cb.setToolTip( self.rest_cb.setToolTip(
_("If checked, use 'rest machining'.\n" _("If checked, use 'rest machining'.\n"
"Basically it will process copper outside PCB features,\n" "Basically it will process copper outside PCB features,\n"
@@ -208,7 +215,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI):
self.combine_passes_cb.setToolTip( self.combine_passes_cb.setToolTip(
_("Combine all passes into one object") _("Combine all passes into one object")
) )
self.combine_passes_cb.setObjectName("i_combine")
grid0.addWidget(self.combine_passes_cb, 28, 1) 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" self.except_cb.setToolTip(_("When the isolation geometry is generated,\n"
"by checking this, the area of the object below\n" "by checking this, the area of the object below\n"
"will be subtracted from the isolation geometry.")) "will be subtracted from the isolation geometry."))
self.except_cb.setObjectName("i_except")
grid0.addWidget(self.except_cb, 28, 2) grid0.addWidget(self.except_cb, 28, 2)
# Check Tool validity # Check Tool validity
@@ -226,7 +231,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI):
_("If checked then the tools diameters are verified\n" _("If checked then the tools diameters are verified\n"
"if they will provide a complete isolation.") "if they will provide a complete isolation.")
) )
self.valid_cb.setObjectName("i_check")
grid0.addWidget(self.valid_cb, 30, 0, 1, 3) grid0.addWidget(self.valid_cb, 30, 0, 1, 3)
@@ -243,7 +247,6 @@ class ToolsISOPrefGroupUI(OptionsGroupUI):
self.select_combo.addItems( self.select_combo.addItems(
[_("All"), _("Area Selection"), _("Polygon Selection"), _("Reference Object")] [_("All"), _("Area Selection"), _("Polygon Selection"), _("Reference Object")]
) )
self.select_combo.setObjectName("i_selection")
grid0.addWidget(self.select_label, 32, 0) grid0.addWidget(self.select_label, 32, 0)
grid0.addWidget(self.select_combo, 32, 1, 1, 2) grid0.addWidget(self.select_combo, 32, 1, 1, 2)

View File

@@ -118,6 +118,7 @@ class ToolIsolation(AppTool, Gerber):
self.form_fields = { self.form_fields = {
"tools_mill_tool_shape": self.ui.tool_shape_combo, "tools_mill_tool_shape": self.ui.tool_shape_combo,
"tools_iso_passes": self.ui.passes_entry, "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_overlap": self.ui.iso_overlap_entry,
"tools_iso_milling_type": self.ui.milling_type_radio, "tools_iso_milling_type": self.ui.milling_type_radio,
"tools_iso_combine": self.ui.combine_passes_cb, "tools_iso_combine": self.ui.combine_passes_cb,
@@ -127,6 +128,7 @@ class ToolIsolation(AppTool, Gerber):
self.name2option = { self.name2option = {
"i_tool_shape": "tools_mill_tool_shape", "i_tool_shape": "tools_mill_tool_shape",
"i_passes": "tools_iso_passes", "i_passes": "tools_iso_passes",
"i_pad_passes": "tools_iso_pad_passes",
"i_overlap": "tools_iso_overlap", "i_overlap": "tools_iso_overlap",
"i_milling_type": "tools_iso_milling_type", "i_milling_type": "tools_iso_milling_type",
"i_combine": "tools_iso_combine", "i_combine": "tools_iso_combine",
@@ -278,6 +280,7 @@ class ToolIsolation(AppTool, Gerber):
self.form_fields = { self.form_fields = {
"tools_mill_tool_shape": self.ui.tool_shape_combo, "tools_mill_tool_shape": self.ui.tool_shape_combo,
"tools_iso_passes": self.ui.passes_entry, "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_overlap": self.ui.iso_overlap_entry,
"tools_iso_milling_type": self.ui.milling_type_radio, "tools_iso_milling_type": self.ui.milling_type_radio,
"tools_iso_combine": self.ui.combine_passes_cb, "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.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.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.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.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.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"]) 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_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_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_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 combine:
if self.ui.rest_cb.get_value(): if self.ui.rest_cb.get_value():
@@ -1704,8 +1708,6 @@ class ToolIsolation(AppTool, Gerber):
tool_dia = tools_storage[tool]['tooldia'] tool_dia = tools_storage[tool]['tooldia']
for i in range(passes): 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) iso_offset = tool_dia * ((2 * i + 1) / 2.0000001) - (i * overlap * tool_dia)
if negative_dia: if negative_dia:
iso_offset = -iso_offset iso_offset = -iso_offset
@@ -1770,10 +1772,6 @@ class ToolIsolation(AppTool, Gerber):
geo_obj.tools.update({ geo_obj.tools.update({
'1': { '1': {
'tooldia': float(tool_dia), 'tooldia': float(tool_dia),
'offset': 'Path',
'offset_value': 0.0,
'type': 'Rough',
'tool_type': tool_type,
'data': tool_data, 'data': tool_data,
'solid_geometry': geo_obj.solid_geometry '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: if float('%.*f' % (self.decimals, tools_storage[tool]['tooldia'])) == sorted_tool:
tool_dia = tools_storage[tool]['tooldia'] tool_dia = tools_storage[tool]['tooldia']
tool_type = tools_storage[tool]['data']['tools_mill_tool_shape']
tool_data = tools_storage[tool]['data'] tool_data = tools_storage[tool]['data']
passes = tool_data['tools_iso_passes'] passes = tool_data['tools_iso_passes']
@@ -1932,10 +1929,6 @@ class ToolIsolation(AppTool, Gerber):
tools_storage.update({ tools_storage.update({
tool: { tool: {
'tooldia': float(tool_dia), 'tooldia': float(tool_dia),
'offset': 'Path',
'offset_value': 0.0,
'type': 'Rough',
'tool_type': tool_type,
'data': tool_data, 'data': tool_data,
'solid_geometry': deepcopy(new_solid_geo) 'solid_geometry': deepcopy(new_solid_geo)
} }
@@ -3379,6 +3372,19 @@ class IsoUI:
self.grid3.addWidget(passlabel, 15, 0) self.grid3.addWidget(passlabel, 15, 0)
self.grid3.addWidget(self.passes_entry, 15, 1) 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 # Overlap Entry
overlabel = FCLabel('%s:' % _('Overlap')) overlabel = FCLabel('%s:' % _('Overlap'))
overlabel.setToolTip( overlabel.setToolTip(

View File

@@ -355,6 +355,7 @@ class FlatCAMDefaults:
"tools_iso_tool_shape": 0, # "C1" "tools_iso_tool_shape": 0, # "C1"
"tools_iso_passes": 1, "tools_iso_passes": 1,
"tools_iso_pad_passes": 0,
"tools_iso_overlap": 10, "tools_iso_overlap": 10,
"tools_iso_milling_type": "cl", "tools_iso_milling_type": "cl",
"tools_iso_isotype": "full", "tools_iso_isotype": "full",