- added a check (and added to Preferences too) for the verification of tools validity in the Isolation Tool

This commit is contained in:
Marius Stanciu
2020-10-19 16:56:21 +03:00
parent 13d4192124
commit 408327e48f
7 changed files with 57 additions and 27 deletions

View File

@@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta
================================================= =================================================
19.10.2020
- added a check (and added to Preferences too) for the verification of tools validity in the Isolation Tool
18.10.2020 18.10.2020
- fixed issue with calling the inform signal in the FlatCAMDefaults.load method - fixed issue with calling the inform signal in the FlatCAMDefaults.load method

View File

@@ -342,6 +342,7 @@ class PreferencesUIManager:
"tools_iso_rest": self.ui.tools_defaults_form.tools_iso_group.rest_cb, "tools_iso_rest": self.ui.tools_defaults_form.tools_iso_group.rest_cb,
"tools_iso_combine_passes": self.ui.tools_defaults_form.tools_iso_group.combine_passes_cb, "tools_iso_combine_passes": self.ui.tools_defaults_form.tools_iso_group.combine_passes_cb,
"tools_iso_check_valid": self.ui.tools_defaults_form.tools_iso_group.valid_cb,
"tools_iso_isoexcept": self.ui.tools_defaults_form.tools_iso_group.except_cb, "tools_iso_isoexcept": self.ui.tools_defaults_form.tools_iso_group.except_cb,
"tools_iso_selection": self.ui.tools_defaults_form.tools_iso_group.select_combo, "tools_iso_selection": self.ui.tools_defaults_form.tools_iso_group.select_combo,
"tools_iso_poly_ints": self.ui.tools_defaults_form.tools_iso_group.poly_int_cb, "tools_iso_poly_ints": self.ui.tools_defaults_form.tools_iso_group.poly_int_cb,

View File

@@ -271,6 +271,16 @@ class ToolsISOPrefGroupUI(OptionsGroupUI):
self.except_cb.setObjectName("i_except") self.except_cb.setObjectName("i_except")
grid0.addWidget(self.except_cb, 17, 2) grid0.addWidget(self.except_cb, 17, 2)
# Check Tool validity
self.valid_cb = FCCheckBox(label=_('Check validity'))
self.valid_cb.setToolTip(
_("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, 18, 0, 1, 3)
# Isolation Scope # Isolation Scope
self.select_label = QtWidgets.QLabel('%s:' % _("Selection")) self.select_label = QtWidgets.QLabel('%s:' % _("Selection"))
self.select_label.setToolTip( self.select_label.setToolTip(

View File

@@ -318,6 +318,7 @@ class ToolIsolation(AppTool, Gerber):
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"])
self.ui.valid_cb.set_value(self.app.defaults["tools_iso_check_valid"])
self.ui.area_shape_radio.set_value(self.app.defaults["tools_iso_area_shape"]) self.ui.area_shape_radio.set_value(self.app.defaults["tools_iso_area_shape"])
self.ui.poly_int_cb.set_value(self.app.defaults["tools_iso_poly_ints"]) self.ui.poly_int_cb.set_value(self.app.defaults["tools_iso_poly_ints"])
self.ui.forced_rest_iso_cb.set_value(self.app.defaults["tools_iso_force"]) self.ui.forced_rest_iso_cb.set_value(self.app.defaults["tools_iso_force"])
@@ -937,9 +938,9 @@ class ToolIsolation(AppTool, Gerber):
geo_len = len(total_geo) geo_len = len(total_geo)
geo_len = (geo_len * (geo_len - 1)) / 2 geo_len = (geo_len * (geo_len - 1)) / 2
except TypeError: except TypeError:
app_obj.inform.emit('[ERROR_NOTCL] %s' % msg = _("The Gerber object has one Polygon as geometry.\n"
_("The Gerber object has one Polygon as geometry.\n" "There are no distances between geometry elements to be found.")
"There are no distances between geometry elements to be found.")) app_obj.inform.emit('[ERROR_NOTCL] %s' % msg)
return 'fail' return 'fail'
min_dict = {} min_dict = {}
@@ -950,7 +951,8 @@ class ToolIsolation(AppTool, Gerber):
# graceful abort requested by the user # graceful abort requested by the user
raise grace raise grace
# minimize the number of distances by not taking into considerations those that are too small # minimize the number of distances by not taking into considerations those
# that are too small
dist = geo.distance(s_geo) dist = geo.distance(s_geo)
dist = float('%.*f' % (self.decimals, dist)) dist = float('%.*f' % (self.decimals, dist))
loc_1, loc_2 = nearest_points(geo, s_geo) loc_1, loc_2 = nearest_points(geo, s_geo)
@@ -995,7 +997,8 @@ class ToolIsolation(AppTool, Gerber):
tid = int(self.ui.tools_table.item(row, 3).text()) tid = int(self.ui.tools_table.item(row, 3).text())
sorted_tools.append(tid) sorted_tools.append(tid)
if not sorted_tools: if not sorted_tools:
self.app.inform.emit('[ERROR_NOTCL] %s' % _("No selected tools in Tool Table.")) msg = _("There are no tools selected in the Tool Table.")
self.app.inform.emit('[ERROR_NOTCL] %s' % msg)
return 'fail' return 'fail'
# check if the tools diameters are less then the safe tool diameter # check if the tools diameters are less then the safe tool diameter
@@ -1365,7 +1368,7 @@ class ToolIsolation(AppTool, Gerber):
# Get source object. # Get source object.
try: try:
self.grb_obj = self.app.collection.get_by_name(self.obj_name) self.grb_obj = self.app.collection.get_by_name(self.obj_name)
except Exception as e: except Exception:
self.app.inform.emit('[ERROR_NOTCL] %s: %s' % (_("Could not retrieve object"), str(self.obj_name))) self.app.inform.emit('[ERROR_NOTCL] %s: %s' % (_("Could not retrieve object"), str(self.obj_name)))
return return
@@ -1373,7 +1376,8 @@ class ToolIsolation(AppTool, Gerber):
self.app.inform.emit('[ERROR_NOTCL] %s: %s' % (_("Object not found"), str(self.obj_name))) self.app.inform.emit('[ERROR_NOTCL] %s: %s' % (_("Object not found"), str(self.obj_name)))
return return
self.find_safe_tooldia_worker(is_displayed=False) if self.ui.valid_cb.get_value() is True:
self.find_safe_tooldia_worker(is_displayed=False)
def worker_task(iso_obj): def worker_task(iso_obj):
with self.app.proc_container.new(_("Isolating...")): with self.app.proc_container.new(_("Isolating...")):
@@ -1501,7 +1505,7 @@ class ToolIsolation(AppTool, Gerber):
tid = int(self.ui.tools_table.item(row, 3).text()) tid = int(self.ui.tools_table.item(row, 3).text())
sorted_tools.append(tid) sorted_tools.append(tid)
if not sorted_tools: if not sorted_tools:
self.app.inform.emit('[ERROR_NOTCL] %s' % _("No selected tools in Tool Table.")) self.app.inform.emit('[ERROR_NOTCL] %s' % _("There are no tools selected in the Tool Table."))
return 'fail' return 'fail'
# update the Common Parameters values in the self.iso_tools # update the Common Parameters values in the self.iso_tools
@@ -1703,7 +1707,7 @@ class ToolIsolation(AppTool, Gerber):
sorted_tools.append(float('%.*f' % (self.decimals, tdia))) sorted_tools.append(float('%.*f' % (self.decimals, tdia)))
if not sorted_tools: if not sorted_tools:
self.app.inform.emit('[ERROR_NOTCL] %s' % _("No selected tools in Tool Table.")) self.app.inform.emit('[ERROR_NOTCL] %s' % _("There are no tools selected in the Tool Table."))
return 'fail' return 'fail'
order = self.ui.order_radio.get_value() order = self.ui.order_radio.get_value()
@@ -1890,7 +1894,7 @@ class ToolIsolation(AppTool, Gerber):
tid = int(self.ui.tools_table.item(row, 3).text()) tid = int(self.ui.tools_table.item(row, 3).text())
sorted_tools.append(tid) sorted_tools.append(tid)
if not sorted_tools: if not sorted_tools:
self.app.inform.emit('[ERROR_NOTCL] %s' % _("No selected tools in Tool Table.")) self.app.inform.emit('[ERROR_NOTCL] %s' % _("There are no tools selected in the Tool Table."))
return 'fail' return 'fail'
for tool in sorted_tools: for tool in sorted_tools:
@@ -2279,7 +2283,7 @@ class ToolIsolation(AppTool, Gerber):
except TypeError: except TypeError:
if self.solid_geometry not in self.poly_dict.values(): if self.solid_geometry not in self.poly_dict.values():
if sel_type is True: if sel_type is True:
if self.solid_geometry.within(poly_selection): if poly_selection.contains(self.solid_geometry):
shape_id = self.app.tool_shapes.add(tolerance=self.drawing_tolerance, layer=0, shape_id = self.app.tool_shapes.add(tolerance=self.drawing_tolerance, layer=0,
shape=self.solid_geometry, shape=self.solid_geometry,
color=self.app.defaults['global_sel_draw_color'] + 'AF', color=self.app.defaults['global_sel_draw_color'] + 'AF',
@@ -3312,13 +3316,23 @@ class IsoUI:
self.grid3.addWidget(self.combine_passes_cb, 26, 0, 1, 2) self.grid3.addWidget(self.combine_passes_cb, 26, 0, 1, 2)
# Check Tool validity
self.valid_cb = FCCheckBox(label=_('Check validity'))
self.valid_cb.setToolTip(
_("If checked then the tools diameters are verified\n"
"if they will provide a complete isolation.")
)
self.valid_cb.setObjectName("i_check")
self.grid3.addWidget(self.valid_cb, 28, 0, 1, 2)
# Exception Areas # Exception Areas
self.except_cb = FCCheckBox(label=_('Except')) self.except_cb = FCCheckBox(label=_('Except'))
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") self.except_cb.setObjectName("i_except")
self.grid3.addWidget(self.except_cb, 27, 0) self.grid3.addWidget(self.except_cb, 30, 0)
# Type of object to be excepted # Type of object to be excepted
self.type_excobj_radio = RadioSet([{'label': _("Geometry"), 'value': 'geometry'}, self.type_excobj_radio = RadioSet([{'label': _("Geometry"), 'value': 'geometry'},
@@ -3330,7 +3344,7 @@ class IsoUI:
"of objects that will populate the 'Object' combobox.") "of objects that will populate the 'Object' combobox.")
) )
self.grid3.addWidget(self.type_excobj_radio, 27, 1) self.grid3.addWidget(self.type_excobj_radio, 30, 1)
# The object to be excepted # The object to be excepted
self.exc_obj_combo = FCComboBox() self.exc_obj_combo = FCComboBox()
@@ -3342,7 +3356,7 @@ class IsoUI:
self.exc_obj_combo.is_last = True self.exc_obj_combo.is_last = True
self.exc_obj_combo.obj_type = "gerber" self.exc_obj_combo.obj_type = "gerber"
self.grid3.addWidget(self.exc_obj_combo, 28, 0, 1, 2) self.grid3.addWidget(self.exc_obj_combo, 32, 0, 1, 2)
self.e_ois = OptionalInputSection(self.except_cb, self.e_ois = OptionalInputSection(self.except_cb,
[ [
@@ -3365,8 +3379,8 @@ class IsoUI:
) )
self.select_combo.setObjectName("i_selection") self.select_combo.setObjectName("i_selection")
self.grid3.addWidget(self.select_label, 33, 0) self.grid3.addWidget(self.select_label, 34, 0)
self.grid3.addWidget(self.select_combo, 33, 1) self.grid3.addWidget(self.select_combo, 34, 1)
self.reference_combo_type_label = FCLabel('%s:' % _("Ref. Type")) self.reference_combo_type_label = FCLabel('%s:' % _("Ref. Type"))
self.reference_combo_type_label.setToolTip( self.reference_combo_type_label.setToolTip(
@@ -3376,8 +3390,8 @@ class IsoUI:
self.reference_combo_type = FCComboBox() self.reference_combo_type = FCComboBox()
self.reference_combo_type.addItems([_("Gerber"), _("Excellon"), _("Geometry")]) self.reference_combo_type.addItems([_("Gerber"), _("Excellon"), _("Geometry")])
self.grid3.addWidget(self.reference_combo_type_label, 34, 0) self.grid3.addWidget(self.reference_combo_type_label, 36, 0)
self.grid3.addWidget(self.reference_combo_type, 34, 1) self.grid3.addWidget(self.reference_combo_type, 36, 1)
self.reference_combo_label = FCLabel('%s:' % _("Ref. Object")) self.reference_combo_label = FCLabel('%s:' % _("Ref. Object"))
self.reference_combo_label.setToolTip( self.reference_combo_label.setToolTip(
@@ -3388,8 +3402,8 @@ class IsoUI:
self.reference_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) self.reference_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
self.reference_combo.is_last = True self.reference_combo.is_last = True
self.grid3.addWidget(self.reference_combo_label, 35, 0) self.grid3.addWidget(self.reference_combo_label, 38, 0)
self.grid3.addWidget(self.reference_combo, 35, 1) self.grid3.addWidget(self.reference_combo, 38, 1)
self.reference_combo.hide() self.reference_combo.hide()
self.reference_combo_label.hide() self.reference_combo_label.hide()
@@ -3403,7 +3417,7 @@ class IsoUI:
"(holes in the polygon).") "(holes in the polygon).")
) )
self.grid3.addWidget(self.poly_int_cb, 36, 0) self.grid3.addWidget(self.poly_int_cb, 40, 0)
self.poly_int_cb.hide() self.poly_int_cb.hide()
@@ -3416,8 +3430,8 @@ class IsoUI:
self.area_shape_radio = RadioSet([{'label': _("Square"), 'value': 'square'}, self.area_shape_radio = RadioSet([{'label': _("Square"), 'value': 'square'},
{'label': _("Polygon"), 'value': 'polygon'}]) {'label': _("Polygon"), 'value': 'polygon'}])
self.grid3.addWidget(self.area_shape_label, 38, 0) self.grid3.addWidget(self.area_shape_label, 42, 0)
self.grid3.addWidget(self.area_shape_radio, 38, 1) self.grid3.addWidget(self.area_shape_radio, 42, 1)
self.area_shape_label.hide() self.area_shape_label.hide()
self.area_shape_radio.hide() self.area_shape_radio.hide()
@@ -3425,7 +3439,7 @@ class IsoUI:
separator_line = QtWidgets.QFrame() separator_line = QtWidgets.QFrame()
separator_line.setFrameShape(QtWidgets.QFrame.HLine) separator_line.setFrameShape(QtWidgets.QFrame.HLine)
separator_line.setFrameShadow(QtWidgets.QFrame.Sunken) separator_line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.grid3.addWidget(separator_line, 39, 0, 1, 2) self.grid3.addWidget(separator_line, 44, 0, 1, 2)
self.generate_iso_button = FCButton("%s" % _("Generate Geometry")) self.generate_iso_button = FCButton("%s" % _("Generate Geometry"))
self.generate_iso_button.setIcon(QtGui.QIcon(self.app.resource_location + '/geometry32.png')) self.generate_iso_button.setIcon(QtGui.QIcon(self.app.resource_location + '/geometry32.png'))

View File

@@ -1292,7 +1292,7 @@ class NonCopperClear(AppTool, Gerber):
else: else:
self.ncc_dia_list.append(self.tooldia) self.ncc_dia_list.append(self.tooldia)
else: else:
self.app.inform.emit('[ERROR_NOTCL] %s' % _("No selected tools in Tool Table.")) self.app.inform.emit('[ERROR_NOTCL] %s' % _("There are no tools selected in the Tool Table."))
return return
self.o_name = '%s_ncc' % self.obj_name self.o_name = '%s_ncc' % self.obj_name

View File

@@ -1027,7 +1027,7 @@ class ToolPaint(AppTool, Gerber):
continue continue
self.tooldia_list.append(self.tooldia) self.tooldia_list.append(self.tooldia)
else: else:
self.app.inform.emit('[ERROR_NOTCL] %s' % _("No selected tools in Tool Table.")) self.app.inform.emit('[ERROR_NOTCL] %s' % _("There are no tools selected in the Tool Table."))
return return
self.select_method = self.ui.selectmethod_combo.get_value() self.select_method = self.ui.selectmethod_combo.get_value()
@@ -1740,7 +1740,7 @@ class ToolPaint(AppTool, Gerber):
continue continue
sorted_tools.append(self.tooldia) sorted_tools.append(self.tooldia)
if not sorted_tools: if not sorted_tools:
self.app.inform.emit('[ERROR_NOTCL] %s' % _("No selected tools in Tool Table.")) self.app.inform.emit('[ERROR_NOTCL] %s' % _("There are no tools selected in the Tool Table."))
return 'fail' return 'fail'
# Initializes the new geometry object # Initializes the new geometry object

View File

@@ -410,6 +410,7 @@ class FlatCAMDefaults:
"tools_iso_rest": False, "tools_iso_rest": False,
"tools_iso_combine_passes": True, "tools_iso_combine_passes": True,
"tools_iso_check_valid": False,
"tools_iso_isoexcept": False, "tools_iso_isoexcept": False,
"tools_iso_selection": _("All"), "tools_iso_selection": _("All"),
"tools_iso_poly_ints": False, "tools_iso_poly_ints": False,