- cleaned up the Geometry Properties UI

This commit is contained in:
Marius Stanciu
2020-11-19 15:10:12 +02:00
parent de3a23e82f
commit e8160ba6c5
3 changed files with 1153 additions and 1141 deletions

View File

@@ -7,6 +7,10 @@ CHANGELOG for FlatCAM beta
================================================= =================================================
19.11.2020
- cleaned up the Geometry Properties UI
17.11.2020 17.11.2020
- the Follow Geometry outputted by the Follow Tools is now of type multigeo which means that it can be fused with other multigeo object without much pain - the Follow Geometry outputted by the Follow Tools is now of type multigeo which means that it can be fused with other multigeo object without much pain

File diff suppressed because it is too large Load Diff

View File

@@ -254,18 +254,18 @@ class GeometryObject(FlatCAMObj, Geometry):
self.ui.geo_tools_table.setCellWidget(row_idx, 6, plot_item) self.ui.geo_tools_table.setCellWidget(row_idx, 6, plot_item)
# set an initial value for the OFFSET ENTRY # set an initial value for the OFFSET ENTRY
try: # try:
self.ui.tool_offset_entry.set_value(tooluid_value['offset_value']) # self.ui.tool_offset_entry.set_value(tooluid_value['offset_value'])
except Exception as e: # except Exception as e:
log.debug("build_ui() --> Could not set the 'offset_value' key in self.tools. Error: %s" % str(e)) # log.debug("build_ui() --> Could not set the 'offset_value' key in self.tools. Error: %s" % str(e))
row_idx += 1 row_idx += 1
# make the diameter column editable # make the diameter column editable
for row in range(row_idx): # for row in range(row_idx):
self.ui.geo_tools_table.item(row, 1).setFlags(QtCore.Qt.ItemIsSelectable | # self.ui.geo_tools_table.item(row, 1).setFlags(QtCore.Qt.ItemIsSelectable |
QtCore.Qt.ItemIsEditable | # QtCore.Qt.ItemIsEditable |
QtCore.Qt.ItemIsEnabled) # QtCore.Qt.ItemIsEnabled)
# sort the tool diameter column # sort the tool diameter column
# self.ui.geo_tools_table.sortItems(1) # self.ui.geo_tools_table.sortItems(1)
@@ -306,17 +306,17 @@ class GeometryObject(FlatCAMObj, Geometry):
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 # 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() # row_cnt = self.ui.geo_tools_table.rowCount()
if row_cnt > 0: # if row_cnt > 0:
for r in range(row_cnt): # for r in range(row_cnt):
self.update_ui(r) # self.update_ui(r)
# select only the first tool / row # select only the first tool / row
selected_row = 0 selected_row = 0
try: try:
self.select_tools_table_row(selected_row, clearsel=True) self.select_tools_table_row(selected_row, clearsel=True)
# update the Geometry UI # update the Geometry UI
self.update_ui() # self.update_ui()
except Exception as e: 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 # 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)) log.debug(str(e))
@@ -328,94 +328,94 @@ class GeometryObject(FlatCAMObj, Geometry):
else: else:
self.ui.geo_tools_table.setColumnHidden(6, False) self.ui.geo_tools_table.setColumnHidden(6, False)
self.set_tool_offset_visibility(selected_row) # self.set_tool_offset_visibility(selected_row)
# ############################################################################################################# # #############################################################################################################
# ################################### Build Exclusion Areas section ########################################### # ################################### Build Exclusion Areas section ###########################################
# ############################################################################################################# # #############################################################################################################
self.ui_disconnect() # self.ui_disconnect()
#
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)
#
for area in range(e_len): # for area in range(e_len):
area_dict = self.app.exc_areas.exclusion_areas_storage[area] # area_dict = self.app.exc_areas.exclusion_areas_storage[area]
#
area_id_item = QtWidgets.QTableWidgetItem('%d' % int(area_dict["idx"])) # area_id_item = QtWidgets.QTableWidgetItem('%d' % int(area_dict["idx"]))
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_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_item = QtWidgets.QTableWidgetItem('%s' % area_dict["strategy"])
# strategy_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) # # strategy_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled)
strategy_item = FCComboBox2(policy=False) # strategy_item = FCComboBox2(policy=False)
strategy_item.addItems([_("Around"), _("Over")]) # strategy_item.addItems([_("Around"), _("Over")])
idx = 0 if area_dict["strategy"] == 'around' else 1 # idx = 0 if area_dict["strategy"] == 'around' else 1
# protection against having this translated or loading a project with translated values # # protection against having this translated or loading a project with translated values
if idx == -1: # if idx == -1:
strategy_item.setCurrentIndex(0) # strategy_item.setCurrentIndex(0)
else: # else:
strategy_item.setCurrentIndex(idx) # strategy_item.setCurrentIndex(idx)
self.ui.exclusion_table.setCellWidget(area, 2, strategy_item) # Strategy # self.ui.exclusion_table.setCellWidget(area, 2, strategy_item) # Strategy
#
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 # # make the Overz column editable
for row in range(e_len): # for row in range(e_len):
self.ui.exclusion_table.item(row, 3).setFlags(QtCore.Qt.ItemIsSelectable | # self.ui.exclusion_table.item(row, 3).setFlags(QtCore.Qt.ItemIsSelectable |
QtCore.Qt.ItemIsEditable | # QtCore.Qt.ItemIsEditable |
QtCore.Qt.ItemIsEnabled) # QtCore.Qt.ItemIsEnabled)
#
self.ui.exclusion_table.resizeColumnsToContents() # self.ui.exclusion_table.resizeColumnsToContents()
self.ui.exclusion_table.resizeRowsToContents() # self.ui.exclusion_table.resizeRowsToContents()
#
area_vheader = self.ui.exclusion_table.verticalHeader() # area_vheader = self.ui.exclusion_table.verticalHeader()
area_vheader.hide() # area_vheader.hide()
self.ui.exclusion_table.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) # self.ui.exclusion_table.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
#
area_hheader = self.ui.exclusion_table.horizontalHeader() # area_hheader = self.ui.exclusion_table.horizontalHeader()
area_hheader.setMinimumSectionSize(10) # area_hheader.setMinimumSectionSize(10)
area_hheader.setDefaultSectionSize(70) # area_hheader.setDefaultSectionSize(70)
#
area_hheader.setSectionResizeMode(0, QtWidgets.QHeaderView.Fixed) # area_hheader.setSectionResizeMode(0, QtWidgets.QHeaderView.Fixed)
area_hheader.resizeSection(0, 20) # area_hheader.resizeSection(0, 20)
area_hheader.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch) # area_hheader.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch)
area_hheader.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents) # area_hheader.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)
area_hheader.setSectionResizeMode(3, QtWidgets.QHeaderView.ResizeToContents) # area_hheader.setSectionResizeMode(3, QtWidgets.QHeaderView.ResizeToContents)
#
# area_hheader.setStretchLastSection(True) # # area_hheader.setStretchLastSection(True)
self.ui.exclusion_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) # self.ui.exclusion_table.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
#
self.ui.exclusion_table.setColumnWidth(0, 20) # self.ui.exclusion_table.setColumnWidth(0, 20)
#
self.ui.exclusion_table.setMinimumHeight(self.ui.exclusion_table.getHeight()) # self.ui.exclusion_table.setMinimumHeight(self.ui.exclusion_table.getHeight())
self.ui.exclusion_table.setMaximumHeight(self.ui.exclusion_table.getHeight()) # self.ui.exclusion_table.setMaximumHeight(self.ui.exclusion_table.getHeight())
#
# End Build Exclusion Areas # # End Build Exclusion Areas
# ----------------------------- # # -----------------------------
#
# HACK: for whatever reasons the name in Selected tab is reverted to the original one after a successful rename # # HACK: for whatever reasons the name in Selected tab is reverted to the original one after a successful rename
# done in the collection view but only for Geometry objects. Perhaps some references remains. Should be fixed. # # done in the collection view but only for Geometry objects. Perhaps some references remains. Should be fixed.
self.ui.name_entry.set_value(self.options['name']) # self.ui.name_entry.set_value(self.options['name'])
self.ui_connect() # self.ui_connect()
#
self.ui.e_cut_entry.setDisabled(False) if self.ui.extracut_cb.get_value() else \ # self.ui.e_cut_entry.setDisabled(False) if self.ui.extracut_cb.get_value() else \
self.ui.e_cut_entry.setDisabled(True) # self.ui.e_cut_entry.setDisabled(True)
#
# set the text on tool_data_label after loading the object # # set the text on tool_data_label after loading the object
sel_rows = set() # sel_rows = set()
for it in self.ui.geo_tools_table.selectedItems(): # for it in self.ui.geo_tools_table.selectedItems():
sel_rows.add(it.row()) # sel_rows.add(it.row())
#
if len(sel_rows) > 1: # if len(sel_rows) > 1:
self.ui.tool_data_label.setText( # self.ui.tool_data_label.setText(
"<b>%s: <font color='#0000FF'>%s</font></b>" % (_('Parameters for'), _("Multiple Tools")) # "<b>%s: <font color='#0000FF'>%s</font></b>" % (_('Parameters for'), _("Multiple Tools"))
) # )
def set_ui(self, ui): def set_ui(self, ui):
# this one adds the 'name' key and the self.ui.name_entry widget in the self.form_fields dict # this one adds the 'name' key and the self.ui.name_entry widget in the self.form_fields dict
@@ -429,91 +429,91 @@ class GeometryObject(FlatCAMObj, Geometry):
self.units = self.app.defaults['units'].upper() self.units = self.app.defaults['units'].upper()
self.units_found = self.app.defaults['units'] self.units_found = self.app.defaults['units']
# make sure the preprocessor combobox is clear # # make sure the preprocessor combobox is clear
self.ui.pp_geometry_name_cb.clear() # self.ui.pp_geometry_name_cb.clear()
# populate preprocessor names in the combobox # # populate preprocessor names in the combobox
pp_list = [] # pp_list = []
for name in list(self.app.preprocessors.keys()): # for name in list(self.app.preprocessors.keys()):
pp_list.append(name) # pp_list.append(name)
pp_list.sort() # pp_list.sort()
if 'default' in pp_list: # if 'default' in pp_list:
pp_list.remove('default') # pp_list.remove('default')
pp_list.insert(0, 'default') # pp_list.insert(0, 'default')
self.ui.pp_geometry_name_cb.addItems(pp_list) # self.ui.pp_geometry_name_cb.addItems(pp_list)
# add tooltips # # add tooltips
for it in range(self.ui.pp_geometry_name_cb.count()): # for it in range(self.ui.pp_geometry_name_cb.count()):
self.ui.pp_geometry_name_cb.setItemData( # self.ui.pp_geometry_name_cb.setItemData(
it, self.ui.pp_geometry_name_cb.itemText(it), QtCore.Qt.ToolTipRole) # it, self.ui.pp_geometry_name_cb.itemText(it), QtCore.Qt.ToolTipRole)
self.form_fields.update({ self.form_fields.update({
"plot": self.ui.plot_cb, "plot": self.ui.plot_cb,
"multicolored": self.ui.multicolored_cb, "multicolored": self.ui.multicolored_cb,
"cutz": self.ui.cutz_entry, # "cutz": self.ui.cutz_entry,
"vtipdia": self.ui.tipdia_entry, # "vtipdia": self.ui.tipdia_entry,
"vtipangle": self.ui.tipangle_entry, # "vtipangle": self.ui.tipangle_entry,
"travelz": self.ui.travelz_entry, # "travelz": self.ui.travelz_entry,
"feedrate": self.ui.cncfeedrate_entry, # "feedrate": self.ui.cncfeedrate_entry,
"feedrate_z": self.ui.feedrate_z_entry, # "feedrate_z": self.ui.feedrate_z_entry,
"feedrate_rapid": self.ui.feedrate_rapid_entry, # "feedrate_rapid": self.ui.feedrate_rapid_entry,
"spindlespeed": self.ui.cncspindlespeed_entry, # "spindlespeed": self.ui.cncspindlespeed_entry,
"dwell": self.ui.dwell_cb, # "dwell": self.ui.dwell_cb,
"dwelltime": self.ui.dwelltime_entry, # "dwelltime": self.ui.dwelltime_entry,
"multidepth": self.ui.mpass_cb, # "multidepth": self.ui.mpass_cb,
"ppname_g": self.ui.pp_geometry_name_cb, # "ppname_g": self.ui.pp_geometry_name_cb,
"z_pdepth": self.ui.pdepth_entry, # "z_pdepth": self.ui.pdepth_entry,
"feedrate_probe": self.ui.feedrate_probe_entry, # "feedrate_probe": self.ui.feedrate_probe_entry,
"depthperpass": self.ui.maxdepth_entry, # "depthperpass": self.ui.maxdepth_entry,
"extracut": self.ui.extracut_cb, # "extracut": self.ui.extracut_cb,
"extracut_length": self.ui.e_cut_entry, # "extracut_length": self.ui.e_cut_entry,
"toolchange": self.ui.toolchangeg_cb, # "toolchange": self.ui.toolchangeg_cb,
"toolchangez": self.ui.toolchangez_entry, # "toolchangez": self.ui.toolchangez_entry,
"endz": self.ui.endz_entry, # "endz": self.ui.endz_entry,
"endxy": self.ui.endxy_entry, # "endxy": self.ui.endxy_entry,
"cnctooldia": self.ui.addtool_entry, # "cnctooldia": self.ui.addtool_entry,
"area_exclusion": self.ui.exclusion_cb, # "area_exclusion": self.ui.exclusion_cb,
"area_shape": self.ui.area_shape_radio, # "area_shape": self.ui.area_shape_radio,
"area_strategy": self.ui.strategy_radio, # "area_strategy": self.ui.strategy_radio,
"area_overz": self.ui.over_z_entry, # "area_overz": self.ui.over_z_entry,
"polish": self.ui.polish_cb, # "polish": self.ui.polish_cb,
"polish_dia": self.ui.polish_dia_entry, # "polish_dia": self.ui.polish_dia_entry,
"polish_pressure": self.ui.polish_pressure_entry, # "polish_pressure": self.ui.polish_pressure_entry,
"polish_travelz": self.ui.polish_travelz_entry, # "polish_travelz": self.ui.polish_travelz_entry,
"polish_margin": self.ui.polish_margin_entry, # "polish_margin": self.ui.polish_margin_entry,
"polish_overlap": self.ui.polish_over_entry, # "polish_overlap": self.ui.polish_over_entry,
"polish_method": self.ui.polish_method_combo, # "polish_method": self.ui.polish_method_combo,
}) })
self.param_fields.update({ # self.param_fields.update({
"vtipdia": self.ui.tipdia_entry, # "vtipdia": self.ui.tipdia_entry,
"vtipangle": self.ui.tipangle_entry, # "vtipangle": self.ui.tipangle_entry,
"cutz": self.ui.cutz_entry, # "cutz": self.ui.cutz_entry,
"depthperpass": self.ui.maxdepth_entry, # "depthperpass": self.ui.maxdepth_entry,
"multidepth": self.ui.mpass_cb, # "multidepth": self.ui.mpass_cb,
"travelz": self.ui.travelz_entry, # "travelz": self.ui.travelz_entry,
"feedrate": self.ui.cncfeedrate_entry, # "feedrate": self.ui.cncfeedrate_entry,
"feedrate_z": self.ui.feedrate_z_entry, # "feedrate_z": self.ui.feedrate_z_entry,
"feedrate_rapid": self.ui.feedrate_rapid_entry, # "feedrate_rapid": self.ui.feedrate_rapid_entry,
"extracut": self.ui.extracut_cb, # "extracut": self.ui.extracut_cb,
"extracut_length": self.ui.e_cut_entry, # "extracut_length": self.ui.e_cut_entry,
"spindlespeed": self.ui.cncspindlespeed_entry, # "spindlespeed": self.ui.cncspindlespeed_entry,
"dwelltime": self.ui.dwelltime_entry, # "dwelltime": self.ui.dwelltime_entry,
"dwell": self.ui.dwell_cb, # "dwell": self.ui.dwell_cb,
"pdepth": self.ui.pdepth_entry, # "pdepth": self.ui.pdepth_entry,
"pfeedrate": self.ui.feedrate_probe_entry, # "pfeedrate": self.ui.feedrate_probe_entry,
}) # })
# Fill form fields only on object create # Fill form fields only on object create
self.to_form() self.to_form()
# update the changes in UI depending on the selected preprocessor in Preferences # update the changes in UI depending on the selected preprocessor in Preferences
# after this moment all the changes in the Posprocessor combo will be handled by the activated signal of the # after this moment all the changes in the Posprocessor combo will be handled by the activated signal of the
# self.ui.pp_geometry_name_cb combobox # self.ui.pp_geometry_name_cb combobox
self.on_pp_changed() # self.on_pp_changed()
self.ui.tipdialabel.hide() # self.ui.tipdialabel.hide()
self.ui.tipdia_entry.hide() # self.ui.tipdia_entry.hide()
self.ui.tipanglelabel.hide() # self.ui.tipanglelabel.hide()
self.ui.tipangle_entry.hide() # self.ui.tipangle_entry.hide()
self.ui.cutz_entry.setDisabled(False) # self.ui.cutz_entry.setDisabled(False)
# store here the default data for Geometry Data # store here the default data for Geometry Data
self.default_data = {} self.default_data = {}
@@ -531,53 +531,53 @@ class GeometryObject(FlatCAMObj, Geometry):
# if def_key == opt_key: # if def_key == opt_key:
# self.default_data[def_key] = deepcopy(opt_val) # self.default_data[def_key] = deepcopy(opt_val)
if type(self.options["cnctooldia"]) == float: # if type(self.options["cnctooldia"]) == float:
tools_list = [self.options["cnctooldia"]] # tools_list = [self.options["cnctooldia"]]
else: # else:
try: # try:
temp_tools = self.options["cnctooldia"].split(",") # temp_tools = self.options["cnctooldia"].split(",")
tools_list = [ # tools_list = [
float(eval(dia)) for dia in temp_tools if dia != '' # float(eval(dia)) for dia in temp_tools if dia != ''
] # ]
except Exception as e: # except Exception as e:
log.error("GeometryObject.set_ui() -> At least one tool diameter needed. " # log.error("GeometryObject.set_ui() -> At least one tool diameter needed. "
"Verify in Edit -> Preferences -> Geometry General -> Tool dia. %s" % str(e)) # "Verify in Edit -> Preferences -> Geometry General -> Tool dia. %s" % str(e))
return # return
self.tooluid += 1 # self.tooluid += 1
#
if not self.tools: # if not self.tools:
for toold in tools_list: # for toold in tools_list:
new_data = deepcopy(self.default_data) # new_data = deepcopy(self.default_data)
self.tools.update({ # self.tools.update({
self.tooluid: { # self.tooluid: {
'tooldia': self.app.dec_format(float(toold), self.decimals), # 'tooldia': self.app.dec_format(float(toold), self.decimals),
'offset': 'Path', # 'offset': 'Path',
'offset_value': 0.0, # 'offset_value': 0.0,
'type': 'Rough', # 'type': 'Rough',
'tool_type': self.tool_type, # 'tool_type': self.tool_type,
'data': new_data, # 'data': new_data,
'solid_geometry': self.solid_geometry # 'solid_geometry': self.solid_geometry
} # }
}) # })
self.tooluid += 1 # self.tooluid += 1
else: # else:
# if self.tools is not empty then it can safely be assumed that it comes from an opened project. # # if self.tools is not empty then it can safely be assumed that it comes from an opened project.
# Because of the serialization the self.tools list on project save, the dict keys (members of self.tools # # Because of the serialization the self.tools list on project save, the dict keys (members of self.tools
# are each a dict) are turned into strings so we rebuild the self.tools elements so the keys are # # are each a dict) are turned into strings so we rebuild the self.tools elements so the keys are
# again float type; dict's don't like having keys changed when iterated through therefore the need for the # # again float type; dict's don't like having keys changed when iterated through therefore the need for the
# following convoluted way of changing the keys from string to float type # # following convoluted way of changing the keys from string to float type
temp_tools = {} # temp_tools = {}
for tooluid_key in self.tools: # for tooluid_key in self.tools:
val = deepcopy(self.tools[tooluid_key]) # val = deepcopy(self.tools[tooluid_key])
new_key = deepcopy(int(tooluid_key)) # new_key = deepcopy(int(tooluid_key))
temp_tools[new_key] = val # temp_tools[new_key] = val
#
self.tools.clear() # self.tools.clear()
self.tools = deepcopy(temp_tools) # self.tools = deepcopy(temp_tools)
#
self.ui.tool_offset_entry.hide() # self.ui.tool_offset_entry.hide()
self.ui.tool_offset_lbl.hide() # self.ui.tool_offset_lbl.hide()
# used to store the state of the mpass_cb if the selected preprocessor for geometry is hpgl # used to store the state of the mpass_cb if the selected preprocessor for geometry is hpgl
self.old_pp_state = self.default_data['multidepth'] self.old_pp_state = self.default_data['multidepth']
@@ -590,58 +590,61 @@ class GeometryObject(FlatCAMObj, Geometry):
# ############################################################################################################# # #############################################################################################################
# ############################### TOOLS TABLE context menu #################################################### # ############################### TOOLS TABLE context menu ####################################################
# ############################################################################################################# # #############################################################################################################
self.ui.geo_tools_table.setupContextMenu() # self.ui.geo_tools_table.setupContextMenu()
self.ui.geo_tools_table.addContextMenu( # self.ui.geo_tools_table.addContextMenu(
_("Pick from DB"), self.on_tool_add_from_db_clicked, # _("Pick from DB"), self.on_tool_add_from_db_clicked,
icon=QtGui.QIcon(self.app.resource_location + "/plus16.png")) # icon=QtGui.QIcon(self.app.resource_location + "/plus16.png"))
self.ui.geo_tools_table.addContextMenu( # self.ui.geo_tools_table.addContextMenu(
_("Copy"), self.on_tool_copy, # _("Copy"), self.on_tool_copy,
icon=QtGui.QIcon(self.app.resource_location + "/copy16.png")) # icon=QtGui.QIcon(self.app.resource_location + "/copy16.png"))
self.ui.geo_tools_table.addContextMenu( # self.ui.geo_tools_table.addContextMenu(
_("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 ################################################# # ############################## EXCLUSION TABLE context menu #################################################
# ############################################################################################################# # #############################################################################################################
self.ui.exclusion_table.setupContextMenu() # self.ui.exclusion_table.setupContextMenu()
self.ui.exclusion_table.addContextMenu( # self.ui.exclusion_table.addContextMenu(
_("Delete"), self.on_delete_sel_areas, icon=QtGui.QIcon(self.app.resource_location + "/trash16.png") # _("Delete"), self.on_delete_sel_areas, icon=QtGui.QIcon(self.app.resource_location + "/trash16.png")
) # )
# Show/Hide Advanced Options # Show/Hide Advanced Options
if self.app.defaults["global_app_level"] == 'b': # if self.app.defaults["global_app_level"] == 'b':
self.ui.level.setText('<span style="color:green;"><b>%s</b></span>' % _('Basic')) # self.ui.level.setText('<span style="color:green;"><b>%s</b></span>' % _('Basic'))
#
# self.ui.geo_tools_table.setColumnHidden(2, True)
# self.ui.geo_tools_table.setColumnHidden(3, True)
# # self.ui.geo_tools_table.setColumnHidden(4, True)
# self.ui.addtool_entry_lbl.hide()
# self.ui.addtool_entry.hide()
# self.ui.search_and_add_btn.hide()
# self.ui.deltool_btn.hide()
# # self.ui.endz_label.hide()
# # self.ui.endz_entry.hide()
# self.ui.fr_rapidlabel.hide()
# self.ui.feedrate_rapid_entry.hide()
# self.ui.extracut_cb.hide()
# self.ui.e_cut_entry.hide()
# self.ui.pdepth_label.hide()
# self.ui.pdepth_entry.hide()
# self.ui.feedrate_probe_label.hide()
# self.ui.feedrate_probe_entry.hide()
# else:
# self.ui.level.setText('<span style="color:red;"><b>%s</b></span>' % _('Advanced'))
self.ui.geo_tools_table.setColumnHidden(2, True) self.ui.geo_tools_table.setColumnHidden(2, True)
self.ui.geo_tools_table.setColumnHidden(3, True) self.ui.geo_tools_table.setColumnHidden(3, True)
# self.ui.geo_tools_table.setColumnHidden(4, True)
self.ui.addtool_entry_lbl.hide()
self.ui.addtool_entry.hide()
self.ui.search_and_add_btn.hide()
self.ui.deltool_btn.hide()
# self.ui.endz_label.hide()
# self.ui.endz_entry.hide()
self.ui.fr_rapidlabel.hide()
self.ui.feedrate_rapid_entry.hide()
self.ui.extracut_cb.hide()
self.ui.e_cut_entry.hide()
self.ui.pdepth_label.hide()
self.ui.pdepth_entry.hide()
self.ui.feedrate_probe_label.hide()
self.ui.feedrate_probe_entry.hide()
else:
self.ui.level.setText('<span style="color:red;"><b>%s</b></span>' % _('Advanced'))
# ############################################################################################################# # #############################################################################################################
# ################################ Signals Connection ######################################################### # ################################ Signals Connection #########################################################
# ############################################################################################################# # #############################################################################################################
self.builduiSig.connect(self.build_ui) # self.builduiSig.connect(self.build_ui)
#
self.ui.e_cut_entry.setDisabled(False) if self.app.defaults['geometry_extracut'] else \ # self.ui.e_cut_entry.setDisabled(False) if self.app.defaults['geometry_extracut'] else \
self.ui.e_cut_entry.setDisabled(True) # self.ui.e_cut_entry.setDisabled(True)
self.ui.extracut_cb.toggled.connect(lambda state: self.ui.e_cut_entry.setDisabled(not state)) # self.ui.extracut_cb.toggled.connect(lambda state: self.ui.e_cut_entry.setDisabled(not state))
#
# Plot state signals # Plot state signals
# self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click) # self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click)
self.ui.multicolored_cb.stateChanged.connect(self.on_multicolored_cb_click) self.ui.multicolored_cb.stateChanged.connect(self.on_multicolored_cb_click)
@@ -653,37 +656,37 @@ class GeometryObject(FlatCAMObj, Geometry):
self.ui.properties_button.toggled.connect(self.on_properties) self.ui.properties_button.toggled.connect(self.on_properties)
self.calculations_finished.connect(self.update_area_chull) self.calculations_finished.connect(self.update_area_chull)
# Buttons Signals # # Buttons Signals
self.ui.generate_cnc_button.clicked.connect(self.on_generatecnc_button_click) # self.ui.generate_cnc_button.clicked.connect(self.on_generatecnc_button_click)
self.ui.paint_tool_button.clicked.connect(lambda: self.app.paint_tool.run(toggle=True)) self.ui.paint_tool_button.clicked.connect(lambda: self.app.paint_tool.run(toggle=True))
self.ui.generate_ncc_button.clicked.connect(lambda: self.app.ncclear_tool.run(toggle=True)) self.ui.generate_ncc_button.clicked.connect(lambda: self.app.ncclear_tool.run(toggle=True))
self.ui.milling_button.clicked.connect(self.on_milling_button_clicked) self.ui.milling_button.clicked.connect(self.on_milling_button_clicked)
# Postprocessor change # # Postprocessor change
self.ui.pp_geometry_name_cb.activated.connect(self.on_pp_changed) # self.ui.pp_geometry_name_cb.activated.connect(self.on_pp_changed)
#
# V tool shape params changed # # V tool shape params changed
self.ui.tipdia_entry.valueChanged.connect(self.on_update_cutz) # self.ui.tipdia_entry.valueChanged.connect(self.on_update_cutz)
self.ui.tipangle_entry.valueChanged.connect(self.on_update_cutz) # self.ui.tipangle_entry.valueChanged.connect(self.on_update_cutz)
#
self.ui.addtool_from_db_btn.clicked.connect(self.on_tool_add_from_db_clicked) # self.ui.addtool_from_db_btn.clicked.connect(self.on_tool_add_from_db_clicked)
self.ui.apply_param_to_all.clicked.connect(self.on_apply_param_to_all_clicked) # self.ui.apply_param_to_all.clicked.connect(self.on_apply_param_to_all_clicked)
self.ui.cutz_entry.returnPressed.connect(self.on_cut_z_changed) # self.ui.cutz_entry.returnPressed.connect(self.on_cut_z_changed)
#
# Exclusion areas signals # # Exclusion areas signals
self.ui.exclusion_table.horizontalHeader().sectionClicked.connect(self.on_exclusion_table_toggle_all) # self.ui.exclusion_table.horizontalHeader().sectionClicked.connect(self.on_exclusion_table_toggle_all)
self.ui.exclusion_table.lost_focus.connect(self.on_clear_selection) # self.ui.exclusion_table.lost_focus.connect(self.on_clear_selection)
self.ui.exclusion_table.itemClicked.connect(self.on_draw_sel_shape) # self.ui.exclusion_table.itemClicked.connect(self.on_draw_sel_shape)
self.ui.add_area_button.clicked.connect(self.on_add_area_click) # self.ui.add_area_button.clicked.connect(self.on_add_area_click)
self.ui.delete_area_button.clicked.connect(self.on_clear_area_click) # self.ui.delete_area_button.clicked.connect(self.on_clear_area_click)
self.ui.delete_sel_area_button.clicked.connect(self.on_delete_sel_areas) # self.ui.delete_sel_area_button.clicked.connect(self.on_delete_sel_areas)
self.ui.strategy_radio.activated_custom.connect(self.on_strategy) # self.ui.strategy_radio.activated_custom.connect(self.on_strategy)
#
# Tools Table signals # # Tools Table signals
self.ui.geo_tools_table.drag_drop_sig.connect(self.on_rebuild_ui) # self.ui.geo_tools_table.drag_drop_sig.connect(self.on_rebuild_ui)
self.ui.geo_tools_table.horizontalHeader().sectionClicked.connect(self.on_toggle_all_rows) # self.ui.geo_tools_table.horizontalHeader().sectionClicked.connect(self.on_toggle_all_rows)
#
self.launch_job.connect(self.mtool_gen_cncjob) # self.launch_job.connect(self.mtool_gen_cncjob)
def on_properties(self, state): def on_properties(self, state):
if state: if state:
@@ -776,33 +779,33 @@ class GeometryObject(FlatCAMObj, Geometry):
def ui_connect(self): def ui_connect(self):
# on any change to the widgets that matter it will be called self.gui_form_to_storage which will save the # on any change to the widgets that matter it will be called self.gui_form_to_storage which will save the
# changes in geometry UI # changes in geometry UI
for i in self.param_fields: # for i in self.param_fields:
current_widget = self.param_fields[i] # current_widget = self.param_fields[i]
#
if isinstance(current_widget, FCCheckBox): # if isinstance(current_widget, FCCheckBox):
current_widget.stateChanged.connect(self.gui_form_to_storage) # current_widget.stateChanged.connect(self.gui_form_to_storage)
elif isinstance(current_widget, FCComboBox): # elif isinstance(current_widget, FCComboBox):
current_widget.currentIndexChanged.connect(self.gui_form_to_storage) # current_widget.currentIndexChanged.connect(self.gui_form_to_storage)
elif isinstance(current_widget, FloatEntry) or isinstance(current_widget, LengthEntry) or \ # elif isinstance(current_widget, FloatEntry) or isinstance(current_widget, LengthEntry) or \
isinstance(current_widget, FCEntry) or isinstance(current_widget, IntEntry) or \ # isinstance(current_widget, FCEntry) or isinstance(current_widget, IntEntry) or \
isinstance(current_widget, NumericalEvalTupleEntry): # isinstance(current_widget, NumericalEvalTupleEntry):
current_widget.editingFinished.connect(self.gui_form_to_storage) # current_widget.editingFinished.connect(self.gui_form_to_storage)
elif isinstance(current_widget, FCSpinner) or isinstance(current_widget, FCDoubleSpinner): # elif isinstance(current_widget, FCSpinner) or isinstance(current_widget, FCDoubleSpinner):
current_widget.returnPressed.connect(self.gui_form_to_storage) # current_widget.returnPressed.connect(self.gui_form_to_storage)
#
for row in range(self.ui.geo_tools_table.rowCount()): # for row in range(self.ui.geo_tools_table.rowCount()):
for col in [2, 3, 4]: # for col in [2, 3, 4]:
self.ui.geo_tools_table.cellWidget(row, col).currentIndexChanged.connect( # self.ui.geo_tools_table.cellWidget(row, col).currentIndexChanged.connect(
self.on_tooltable_cellwidget_change) # self.on_tooltable_cellwidget_change)
#
self.ui.search_and_add_btn.clicked.connect(self.on_tool_add) # self.ui.search_and_add_btn.clicked.connect(self.on_tool_add)
self.ui.deltool_btn.clicked.connect(self.on_tool_delete) # self.ui.deltool_btn.clicked.connect(self.on_tool_delete)
# Tools Table # Tools Table
self.ui.geo_tools_table.clicked.connect(self.on_row_selection_change) # self.ui.geo_tools_table.clicked.connect(self.on_row_selection_change)
self.ui.geo_tools_table.itemChanged.connect(self.on_tool_edit) # self.ui.geo_tools_table.itemChanged.connect(self.on_tool_edit)
#
self.ui.tool_offset_entry.returnPressed.connect(self.on_offset_value_edited) # self.ui.tool_offset_entry.returnPressed.connect(self.on_offset_value_edited)
for row in range(self.ui.geo_tools_table.rowCount()): for row in range(self.ui.geo_tools_table.rowCount()):
self.ui.geo_tools_table.cellWidget(row, 6).clicked.connect(self.on_plot_cb_click_table) self.ui.geo_tools_table.cellWidget(row, 6).clicked.connect(self.on_plot_cb_click_table)
@@ -810,82 +813,82 @@ class GeometryObject(FlatCAMObj, Geometry):
self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click) self.ui.plot_cb.stateChanged.connect(self.on_plot_cb_click)
# Exclusion Table widgets connect # Exclusion Table widgets connect
for row in range(self.ui.exclusion_table.rowCount()): # 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.cellWidget(row, 2).currentIndexChanged.connect(self.on_exclusion_table_strategy)
#
self.ui.exclusion_table.itemChanged.connect(self.on_exclusion_table_overz) # self.ui.exclusion_table.itemChanged.connect(self.on_exclusion_table_overz)
# common parameters update # common parameters update
self.ui.toolchangeg_cb.stateChanged.connect(self.update_common_param_in_storage) # self.ui.toolchangeg_cb.stateChanged.connect(self.update_common_param_in_storage)
self.ui.toolchangez_entry.editingFinished.connect(self.update_common_param_in_storage) # self.ui.toolchangez_entry.editingFinished.connect(self.update_common_param_in_storage)
self.ui.endz_entry.editingFinished.connect(self.update_common_param_in_storage) # self.ui.endz_entry.editingFinished.connect(self.update_common_param_in_storage)
self.ui.endxy_entry.editingFinished.connect(self.update_common_param_in_storage) # self.ui.endxy_entry.editingFinished.connect(self.update_common_param_in_storage)
self.ui.pp_geometry_name_cb.currentIndexChanged.connect(self.update_common_param_in_storage) # self.ui.pp_geometry_name_cb.currentIndexChanged.connect(self.update_common_param_in_storage)
self.ui.exclusion_cb.stateChanged.connect(self.update_common_param_in_storage) # self.ui.exclusion_cb.stateChanged.connect(self.update_common_param_in_storage)
self.ui.polish_cb.stateChanged.connect(self.update_common_param_in_storage) # self.ui.polish_cb.stateChanged.connect(self.update_common_param_in_storage)
def ui_disconnect(self): def ui_disconnect(self):
# on any change to the widgets that matter it will be called self.gui_form_to_storage which will save the # on any change to the widgets that matter it will be called self.gui_form_to_storage which will save the
# changes in geometry UI # changes in geometry UI
for i in self.param_fields: # for i in self.param_fields:
# current_widget = self.ui.grid3.itemAt(i).widget() # # current_widget = self.ui.grid3.itemAt(i).widget()
current_widget = self.param_fields[i] # current_widget = self.param_fields[i]
if isinstance(current_widget, FCCheckBox): # if isinstance(current_widget, FCCheckBox):
try: # try:
current_widget.stateChanged.disconnect(self.gui_form_to_storage) # current_widget.stateChanged.disconnect(self.gui_form_to_storage)
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
elif isinstance(current_widget, FCComboBox): # elif isinstance(current_widget, FCComboBox):
try: # try:
current_widget.currentIndexChanged.disconnect(self.gui_form_to_storage) # current_widget.currentIndexChanged.disconnect(self.gui_form_to_storage)
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
elif isinstance(current_widget, LengthEntry) or isinstance(current_widget, IntEntry) or \ # elif isinstance(current_widget, LengthEntry) or isinstance(current_widget, IntEntry) or \
isinstance(current_widget, FCEntry) or isinstance(current_widget, FloatEntry) or \ # isinstance(current_widget, FCEntry) or isinstance(current_widget, FloatEntry) or \
isinstance(current_widget, NumericalEvalTupleEntry): # isinstance(current_widget, NumericalEvalTupleEntry):
try: # try:
current_widget.editingFinished.disconnect(self.gui_form_to_storage) # current_widget.editingFinished.disconnect(self.gui_form_to_storage)
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
elif isinstance(current_widget, FCSpinner) or isinstance(current_widget, FCDoubleSpinner): # elif isinstance(current_widget, FCSpinner) or isinstance(current_widget, FCDoubleSpinner):
try: # try:
current_widget.returnPressed.disconnect(self.gui_form_to_storage) # current_widget.returnPressed.disconnect(self.gui_form_to_storage)
except TypeError: # except TypeError:
pass # pass
# disconnect FCCombobox widgets in the Tool Table # disconnect FCCombobox widgets in the Tool Table
for row in range(self.ui.geo_tools_table.rowCount()): # for row in range(self.ui.geo_tools_table.rowCount()):
for col in [2, 3, 4]: # for col in [2, 3, 4]:
try: # try:
self.ui.geo_tools_table.cellWidget(row, col).currentIndexChanged.disconnect() # self.ui.geo_tools_table.cellWidget(row, col).currentIndexChanged.disconnect()
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
try: # try:
self.ui.search_and_add_btn.clicked.disconnect() # self.ui.search_and_add_btn.clicked.disconnect()
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
#
# try:
# self.ui.deltool_btn.clicked.disconnect()
# except (TypeError, AttributeError):
# pass
try: # try:
self.ui.deltool_btn.clicked.disconnect() # self.ui.geo_tools_table.clicked.disconnect()
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
#
try: # try:
self.ui.geo_tools_table.clicked.disconnect() # self.ui.geo_tools_table.itemChanged.disconnect()
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
#
try: # try:
self.ui.geo_tools_table.itemChanged.disconnect() # self.ui.tool_offset_entry.returnPressed.disconnect()
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
try:
self.ui.tool_offset_entry.returnPressed.disconnect()
except (TypeError, AttributeError):
pass
for row in range(self.ui.geo_tools_table.rowCount()): for row in range(self.ui.geo_tools_table.rowCount()):
try: try:
@@ -899,48 +902,48 @@ class GeometryObject(FlatCAMObj, Geometry):
pass pass
# common parameters update # common parameters update
try: # try:
self.ui.toolchangeg_cb.stateChanged.disconnect(self.update_common_param_in_storage) # self.ui.toolchangeg_cb.stateChanged.disconnect(self.update_common_param_in_storage)
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
try: # try:
self.ui.toolchangez_entry.editingFinished.disconnect(self.update_common_param_in_storage) # self.ui.toolchangez_entry.editingFinished.disconnect(self.update_common_param_in_storage)
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
try: # try:
self.ui.endz_entry.editingFinished.disconnect(self.update_common_param_in_storage) # self.ui.endz_entry.editingFinished.disconnect(self.update_common_param_in_storage)
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
try: # try:
self.ui.endxy_entry.editingFinished.disconnect(self.update_common_param_in_storage) # self.ui.endxy_entry.editingFinished.disconnect(self.update_common_param_in_storage)
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
try: # try:
self.ui.pp_geometry_name_cb.currentIndexChanged.disconnect(self.update_common_param_in_storage) # self.ui.pp_geometry_name_cb.currentIndexChanged.disconnect(self.update_common_param_in_storage)
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
#
try: # try:
self.ui.polish_cb.stateChanged.disconnect(self.update_common_param_in_storage) # self.ui.polish_cb.stateChanged.disconnect(self.update_common_param_in_storage)
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
#
try: # try:
self.ui.exclusion_cb.stateChanged.disconnect(self.update_common_param_in_storage) # self.ui.exclusion_cb.stateChanged.disconnect(self.update_common_param_in_storage)
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
#
# Exclusion Table widgets disconnect # # Exclusion Table widgets disconnect
for row in range(self.ui.exclusion_table.rowCount()): # for row in range(self.ui.exclusion_table.rowCount()):
try: # try:
self.ui.exclusion_table.cellWidget(row, 2).currentIndexChanged.disconnect() # self.ui.exclusion_table.cellWidget(row, 2).currentIndexChanged.disconnect()
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
#
try: # try:
self.ui.exclusion_table.itemChanged.disconnect() # self.ui.exclusion_table.itemChanged.disconnect()
except (TypeError, AttributeError): # except (TypeError, AttributeError):
pass # pass
def on_toggle_all_rows(self): def on_toggle_all_rows(self):
""" """