- Milling Tool - working in making the exclusion areas work in this Tool; added the Exclusion Table editing ability
This commit is contained in:
committed by
Marius Stanciu
parent
b023b79822
commit
d200e3fd1e
@@ -12,6 +12,7 @@ CHANGELOG for FlatCAM beta
|
|||||||
- in Cutout, 2Sided, Film, NCC, Paint, Panelize and Subtract Tool made sure that the object selection in Project Tab reflects in the selected object in the Tools
|
- in Cutout, 2Sided, Film, NCC, Paint, Panelize and Subtract Tool made sure that the object selection in Project Tab reflects in the selected object in the Tools
|
||||||
- set the shortcut key for Milling Tool to ALt+M and for Corner Markers Tool to Alt+B
|
- set the shortcut key for Milling Tool to ALt+M and for Corner Markers Tool to Alt+B
|
||||||
- fixed a bug introduced by first mod today, when the selected object is of 'cncjob' kind.
|
- fixed a bug introduced by first mod today, when the selected object is of 'cncjob' kind.
|
||||||
|
- Milling Tool - working in making the exclusion areas work in this Tool; added the Exclusion Table editing ability
|
||||||
|
|
||||||
3.12.2020
|
3.12.2020
|
||||||
|
|
||||||
|
|||||||
@@ -155,6 +155,14 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
_("Delete"), lambda: self.on_tool_delete(clicked_signal=None, all_tools=None),
|
_("Delete"), lambda: self.on_tool_delete(clicked_signal=None, all_tools=None),
|
||||||
icon=QtGui.QIcon(self.app.resource_location + "/trash16.png"))
|
icon=QtGui.QIcon(self.app.resource_location + "/trash16.png"))
|
||||||
|
|
||||||
|
# #############################################################################################################
|
||||||
|
# ############################## EXCLUSION TABLE context menu #################################################
|
||||||
|
# #############################################################################################################
|
||||||
|
self.ui.exclusion_table.setupContextMenu()
|
||||||
|
self.ui.exclusion_table.addContextMenu(
|
||||||
|
_("Delete"), self.on_delete_sel_areas, icon=QtGui.QIcon(self.app.resource_location + "/trash16.png")
|
||||||
|
)
|
||||||
|
|
||||||
def install(self, icon=None, separator=None, **kwargs):
|
def install(self, icon=None, separator=None, **kwargs):
|
||||||
AppTool.install(self, icon, separator, shortcut='Alt+M', **kwargs)
|
AppTool.install(self, icon, separator, shortcut='Alt+M', **kwargs)
|
||||||
|
|
||||||
@@ -588,6 +596,7 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
else:
|
else:
|
||||||
self.build_ui_exc()
|
self.build_ui_exc()
|
||||||
|
|
||||||
|
self.ui_disconnect()
|
||||||
# Build Exclusion Areas section
|
# Build Exclusion Areas section
|
||||||
e_len = len(self.app.exc_areas.exclusion_areas_storage)
|
e_len = len(self.app.exc_areas.exclusion_areas_storage)
|
||||||
self.ui.exclusion_table.setRowCount(e_len)
|
self.ui.exclusion_table.setRowCount(e_len)
|
||||||
@@ -599,22 +608,38 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
|
|
||||||
area_dict = self.app.exc_areas.exclusion_areas_storage[area]
|
area_dict = self.app.exc_areas.exclusion_areas_storage[area]
|
||||||
|
|
||||||
|
# -------------------- ID -------------------------------
|
||||||
area_id_item = QtWidgets.QTableWidgetItem('%d' % int(area_id))
|
area_id_item = QtWidgets.QTableWidgetItem('%d' % int(area_id))
|
||||||
area_id_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
area_id_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
self.ui.exclusion_table.setItem(area, 0, area_id_item) # Area id
|
self.ui.exclusion_table.setItem(area, 0, area_id_item) # Area id
|
||||||
|
|
||||||
|
# -------------------- Object Type ----------------------
|
||||||
object_item = QtWidgets.QTableWidgetItem('%s' % area_dict["obj_type"])
|
object_item = QtWidgets.QTableWidgetItem('%s' % area_dict["obj_type"])
|
||||||
object_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
object_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
self.ui.exclusion_table.setItem(area, 1, object_item) # Origin Object
|
self.ui.exclusion_table.setItem(area, 1, object_item) # Origin Object
|
||||||
|
|
||||||
strategy_item = QtWidgets.QTableWidgetItem('%s' % area_dict["strategy"])
|
# -------------------- Strategy -------------------------
|
||||||
strategy_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
strategy_item = FCComboBox2(policy=False)
|
||||||
self.ui.exclusion_table.setItem(area, 2, strategy_item) # Strategy
|
strategy_item.addItems([_("Around"), _("Over")])
|
||||||
|
idx = 0 if area_dict["strategy"] == 'around' else 1
|
||||||
|
# protection against having this translated or loading a project with translated values
|
||||||
|
if idx == -1:
|
||||||
|
strategy_item.setCurrentIndex(0)
|
||||||
|
else:
|
||||||
|
strategy_item.setCurrentIndex(idx)
|
||||||
|
self.ui.exclusion_table.setCellWidget(area, 2, strategy_item) # Strategy
|
||||||
|
|
||||||
|
# -------------------- Over Z ---------------------------
|
||||||
overz_item = QtWidgets.QTableWidgetItem('%s' % area_dict["overz"])
|
overz_item = QtWidgets.QTableWidgetItem('%s' % area_dict["overz"])
|
||||||
overz_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
overz_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
self.ui.exclusion_table.setItem(area, 3, overz_item) # Over Z
|
self.ui.exclusion_table.setItem(area, 3, overz_item) # Over Z
|
||||||
|
|
||||||
|
# make the Overz column editable
|
||||||
|
for row in range(e_len):
|
||||||
|
self.ui.exclusion_table.item(row, 3).setFlags(QtCore.Qt.ItemIsSelectable |
|
||||||
|
QtCore.Qt.ItemIsEditable |
|
||||||
|
QtCore.Qt.ItemIsEnabled)
|
||||||
|
|
||||||
self.ui.exclusion_table.resizeColumnsToContents()
|
self.ui.exclusion_table.resizeColumnsToContents()
|
||||||
self.ui.exclusion_table.resizeRowsToContents()
|
self.ui.exclusion_table.resizeRowsToContents()
|
||||||
|
|
||||||
@@ -653,17 +678,6 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def build_ui_mill(self):
|
def build_ui_mill(self):
|
||||||
self.ui_disconnect()
|
|
||||||
|
|
||||||
# Area Exception - exclusion shape added signal
|
|
||||||
# first disconnect it from any other object
|
|
||||||
try:
|
|
||||||
self.app.exc_areas.e_shape_modified.disconnect()
|
|
||||||
except (TypeError, AttributeError):
|
|
||||||
pass
|
|
||||||
# then connect it to the current build_ui() method
|
|
||||||
self.app.exc_areas.e_shape_modified.connect(self.update_exclusion_table)
|
|
||||||
|
|
||||||
self.units = self.app.defaults['units']
|
self.units = self.app.defaults['units']
|
||||||
|
|
||||||
if self.target_obj:
|
if self.target_obj:
|
||||||
@@ -686,10 +700,6 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
tool_id.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
tool_id.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
|
||||||
self.ui.geo_tools_table.setItem(row_idx, 0, tool_id) # Tool name/id
|
self.ui.geo_tools_table.setItem(row_idx, 0, tool_id) # Tool name/id
|
||||||
|
|
||||||
# Make sure that the tool diameter when in MM is with no more than 2 decimals.
|
|
||||||
# There are no tool bits in MM with more than 3 decimals diameter.
|
|
||||||
# For INCH the decimals should be no more than 3. There are no tools under 10mils.
|
|
||||||
|
|
||||||
# -------------------- DIAMETER ------------------------------------- #
|
# -------------------- DIAMETER ------------------------------------- #
|
||||||
dia_item = QtWidgets.QTableWidgetItem('%.*f' % (self.decimals, float(tooluid_value['tooldia'])))
|
dia_item = QtWidgets.QTableWidgetItem('%.*f' % (self.decimals, float(tooluid_value['tooldia'])))
|
||||||
dia_item.setFlags(QtCore.Qt.ItemIsEnabled)
|
dia_item.setFlags(QtCore.Qt.ItemIsEnabled)
|
||||||
@@ -765,22 +775,6 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
self.ui.geo_tools_table.setMinimumHeight(self.ui.geo_tools_table.getHeight())
|
self.ui.geo_tools_table.setMinimumHeight(self.ui.geo_tools_table.getHeight())
|
||||||
self.ui.geo_tools_table.setMaximumHeight(self.ui.geo_tools_table.getHeight())
|
self.ui.geo_tools_table.setMaximumHeight(self.ui.geo_tools_table.getHeight())
|
||||||
|
|
||||||
# update UI for all rows - useful after units conversion but only if there is at least one row
|
|
||||||
# row_cnt = self.ui.geo_tools_table.rowCount()
|
|
||||||
# if row_cnt > 0:
|
|
||||||
# for r in range(row_cnt):
|
|
||||||
# self.update_ui(r)
|
|
||||||
|
|
||||||
# select only the first tool / row
|
|
||||||
# selected_row = 0
|
|
||||||
# try:
|
|
||||||
# self.select_tools_table_row(selected_row, clearsel=True)
|
|
||||||
# # update the Geometry UI
|
|
||||||
# self.update_ui()
|
|
||||||
# except Exception as e:
|
|
||||||
# # when the tools table is empty there will be this error but once the table is populated it will go away
|
|
||||||
# log.debug(str(e))
|
|
||||||
|
|
||||||
# disable the Plot column in Tool Table if the geometry is SingleGeo as it is not needed
|
# disable the Plot column in Tool Table if the geometry is SingleGeo as it is not needed
|
||||||
# and can create some problems
|
# and can create some problems
|
||||||
if self.target_obj and self.target_obj.multigeo is True:
|
if self.target_obj and self.target_obj.multigeo is True:
|
||||||
@@ -788,8 +782,6 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
else:
|
else:
|
||||||
self.ui.geo_tools_table.setColumnHidden(4, True)
|
self.ui.geo_tools_table.setColumnHidden(4, True)
|
||||||
|
|
||||||
self.ui_connect()
|
|
||||||
|
|
||||||
self.ui.geo_tools_table.selectAll()
|
self.ui.geo_tools_table.selectAll()
|
||||||
|
|
||||||
# set the text on tool_data_label after loading the object
|
# set the text on tool_data_label after loading the object
|
||||||
@@ -803,8 +795,6 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def build_ui_exc(self):
|
def build_ui_exc(self):
|
||||||
self.ui_disconnect()
|
|
||||||
|
|
||||||
# updated units
|
# updated units
|
||||||
self.units = self.app.defaults['units'].upper()
|
self.units = self.app.defaults['units'].upper()
|
||||||
|
|
||||||
@@ -948,8 +938,6 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
# all the tools are selected by default
|
# all the tools are selected by default
|
||||||
self.ui.tools_table.selectAll()
|
self.ui.tools_table.selectAll()
|
||||||
|
|
||||||
self.ui_connect()
|
|
||||||
|
|
||||||
def on_target_changed(self, val):
|
def on_target_changed(self, val):
|
||||||
# handle the Plot checkbox
|
# handle the Plot checkbox
|
||||||
self.plot_cb_handler()
|
self.plot_cb_handler()
|
||||||
@@ -1114,6 +1102,12 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
|
|
||||||
self.ui.order_radio.activated_custom[str].connect(self.on_order_changed)
|
self.ui.order_radio.activated_custom[str].connect(self.on_order_changed)
|
||||||
|
|
||||||
|
# Exclusion Table widgets connect
|
||||||
|
for row in range(self.ui.exclusion_table.rowCount()):
|
||||||
|
self.ui.exclusion_table.cellWidget(row, 2).currentIndexChanged.connect(self.on_exclusion_table_strategy)
|
||||||
|
|
||||||
|
self.ui.exclusion_table.itemChanged.connect(self.on_exclusion_table_overz)
|
||||||
|
|
||||||
def ui_disconnect(self):
|
def ui_disconnect(self):
|
||||||
# Excellon Tool Table - rows selected
|
# Excellon Tool Table - rows selected
|
||||||
try:
|
try:
|
||||||
@@ -1180,6 +1174,18 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
except (TypeError, ValueError):
|
except (TypeError, ValueError):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
# Exclusion Table widgets disconnect
|
||||||
|
for row in range(self.ui.exclusion_table.rowCount()):
|
||||||
|
try:
|
||||||
|
self.ui.exclusion_table.cellWidget(row, 2).currentIndexChanged.disconnect()
|
||||||
|
except (TypeError, AttributeError):
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.ui.exclusion_table.itemChanged.disconnect()
|
||||||
|
except (TypeError, AttributeError):
|
||||||
|
pass
|
||||||
|
|
||||||
def on_toggle_all_rows(self):
|
def on_toggle_all_rows(self):
|
||||||
"""
|
"""
|
||||||
will toggle the selection of all rows in Tools table
|
will toggle the selection of all rows in Tools table
|
||||||
@@ -3152,8 +3158,8 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
overz_button = self.ui.over_z_entry
|
overz_button = self.ui.over_z_entry
|
||||||
strategy_radio = self.ui.strategy_radio
|
strategy_radio = self.ui.strategy_radio
|
||||||
cnc_button = self.ui.generate_cnc_button
|
cnc_button = self.ui.generate_cnc_button
|
||||||
solid_geo = self.solid_geometry
|
solid_geo = self.target_obj.solid_geometry
|
||||||
obj_type = self.kind
|
obj_type = self.target_obj.kind
|
||||||
|
|
||||||
self.app.exc_areas.on_add_area_click(
|
self.app.exc_areas.on_add_area_click(
|
||||||
shape_button=shape_button, overz_button=overz_button, cnc_button=cnc_button, strategy_radio=strategy_radio,
|
shape_button=shape_button, overz_button=overz_button, cnc_button=cnc_button, strategy_radio=strategy_radio,
|
||||||
@@ -3251,6 +3257,49 @@ class ToolMilling(AppTool, Excellon):
|
|||||||
self.ui.exclusion_table.selectAll()
|
self.ui.exclusion_table.selectAll()
|
||||||
self.draw_sel_shape()
|
self.draw_sel_shape()
|
||||||
|
|
||||||
|
def on_exclusion_table_overz(self, current_item):
|
||||||
|
self.ui_disconnect()
|
||||||
|
|
||||||
|
current_row = current_item.row()
|
||||||
|
try:
|
||||||
|
d = float(self.ui.exclusion_table.item(current_row, 3).text())
|
||||||
|
except ValueError:
|
||||||
|
# try to convert comma to decimal point. if it's still not working error message and return
|
||||||
|
try:
|
||||||
|
d = float(self.ui.exclusion_table.item(current_row, 3).text().replace(',', '.'))
|
||||||
|
except ValueError:
|
||||||
|
self.app.inform.emit('[ERROR_NOTCL] %s' % _("Wrong value format entered, use a number."))
|
||||||
|
return
|
||||||
|
except AttributeError:
|
||||||
|
self.ui_connect()
|
||||||
|
return
|
||||||
|
|
||||||
|
overz = self.app.dec_format(d, self.decimals)
|
||||||
|
idx = int(self.ui.exclusion_table.item(current_row, 0).text())
|
||||||
|
|
||||||
|
for area_dict in self.app.exc_areas.exclusion_areas_storage:
|
||||||
|
if area_dict['idx'] == idx:
|
||||||
|
area_dict['overz'] = overz
|
||||||
|
|
||||||
|
self.app.inform.emit('[success] %s' % _("Value edited in Exclusion Table."))
|
||||||
|
self.ui_connect()
|
||||||
|
self.builduiSig.emit()
|
||||||
|
|
||||||
|
def on_exclusion_table_strategy(self):
|
||||||
|
cw = self.sender()
|
||||||
|
cw_index = self.ui.exclusion_table.indexAt(cw.pos())
|
||||||
|
cw_row = cw_index.row()
|
||||||
|
idx = int(self.ui.exclusion_table.item(cw_row, 0).text())
|
||||||
|
|
||||||
|
for area_dict in self.app.exc_areas.exclusion_areas_storage:
|
||||||
|
if area_dict['idx'] == idx:
|
||||||
|
strategy = self.ui.exclusion_table.cellWidget(cw_row, 2).currentIndex()
|
||||||
|
area_dict['strategy'] = "around" if strategy == 0 else 'overz'
|
||||||
|
|
||||||
|
self.app.inform.emit('[success] %s' % _("Value edited in Exclusion Table."))
|
||||||
|
self.ui_connect()
|
||||||
|
self.builduiSig.emit()
|
||||||
|
|
||||||
def reset_fields(self):
|
def reset_fields(self):
|
||||||
self.object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
|
self.object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user