From 5554cf0afac606d57f3524f43f2f13b4eae47a40 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 28 Mar 2020 22:22:53 +0200 Subject: [PATCH] - finished the new database based on a QTreeWidget --- FlatCAMCommon.py | 624 +++++++++++++++++------------------------------ README.md | 4 + requirements.txt | 2 +- 3 files changed, 229 insertions(+), 401 deletions(-) diff --git a/FlatCAMCommon.py b/FlatCAMCommon.py index c8a3860b..644f7ca4 100644 --- a/FlatCAMCommon.py +++ b/FlatCAMCommon.py @@ -1425,6 +1425,8 @@ class ToolsDB2(QtWidgets.QWidget): self.tree_widget = FCTree(columns=2, header_hidden=False, protected_column=[0]) self.tree_widget.setHeaderLabels(["ID", "Tool Name"]) self.tree_widget.setIndentation(0) + self.tree_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + self.tree_widget.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) # set alternating colors # self.tree_widget.setAlternatingRowColors(True) @@ -1436,7 +1438,14 @@ class ToolsDB2(QtWidgets.QWidget): tree_layout.addWidget(self.tree_widget) param_hlay = QtWidgets.QHBoxLayout() - grid_layout.addLayout(param_hlay, 0, 1) + param_area = QtWidgets.QScrollArea() + param_widget = QtWidgets.QWidget() + param_widget.setLayout(param_hlay) + + param_area.setWidget(param_widget) + param_area.setWidgetResizable(True) + + grid_layout.addWidget(param_area, 0, 1) # ########################################################################### # ############## The UI form ################################################ @@ -1450,7 +1459,6 @@ class ToolsDB2(QtWidgets.QWidget): } """) self.basic_vlay = QtWidgets.QVBoxLayout() - self.basic_box.setLayout(self.basic_vlay) self.basic_box.setTitle(_("Basic Parameters")) self.basic_box.setMinimumWidth(250) @@ -1463,21 +1471,25 @@ class ToolsDB2(QtWidgets.QWidget): } """) self.advanced_vlay = QtWidgets.QVBoxLayout() - self.advanced_box.setLayout(self.advanced_vlay) self.advanced_box.setTitle(_("Advanced Parameters")) self.advanced_box.setMinimumWidth(250) - param_hlay.addLayout(self.basic_vlay) - param_hlay.addLayout(self.advanced_vlay) + self.basic_box.setLayout(self.basic_vlay) + self.advanced_box.setLayout(self.advanced_vlay) + + param_hlay.addWidget(self.basic_box) + param_hlay.addWidget(self.advanced_box) + param_hlay.addStretch() # ########################################################################### # ############### BASIC UI form ############################################# # ########################################################################### - grid0 = QtWidgets.QGridLayout() - self.advanced_vlay.addLayout(grid0) - grid0.setColumnStretch(0, 0) - grid0.setColumnStretch(1, 1) + self.grid0 = QtWidgets.QGridLayout() + self.basic_vlay.addLayout(self.grid0) + self.grid0.setColumnStretch(0, 0) + self.grid0.setColumnStretch(1, 1) + self.basic_vlay.addStretch() # Tool Name self.name_label = QtWidgets.QLabel('%s:' % _('Tool Name')) @@ -1489,8 +1501,8 @@ class ToolsDB2(QtWidgets.QWidget): self.name_entry = FCEntry() self.name_entry.setObjectName('gdb_name') - grid0.addWidget(self.name_label, 0, 0) - grid0.addWidget(self.name_entry, 0, 1) + self.grid0.addWidget(self.name_label, 0, 0) + self.grid0.addWidget(self.name_entry, 0, 1) # Tool Dia self.dia_label = QtWidgets.QLabel('%s:' % _('Tool Dia')) @@ -1502,8 +1514,8 @@ class ToolsDB2(QtWidgets.QWidget): self.dia_entry.set_precision(self.decimals) self.dia_entry.setObjectName('gdb_dia') - grid0.addWidget(self.dia_label, 1, 0) - grid0.addWidget(self.dia_entry, 1, 1) + self.grid0.addWidget(self.dia_label, 1, 0) + self.grid0.addWidget(self.dia_entry, 1, 1) # Tool Shape self.shape_label = QtWidgets.QLabel('%s:' % _('Tool Shape')) @@ -1518,8 +1530,8 @@ class ToolsDB2(QtWidgets.QWidget): self.shape_combo.addItems(["C1", "C2", "C3", "C4", "B", "V"]) self.shape_combo.setObjectName('gdb_shape') - grid0.addWidget(self.shape_label, 2, 0) - grid0.addWidget(self.shape_combo, 2, 1) + self.grid0.addWidget(self.shape_label, 2, 0) + self.grid0.addWidget(self.shape_combo, 2, 1) # Cut Z self.cutz_label = QtWidgets.QLabel('%s:' % _("Cut Z")) @@ -1532,8 +1544,8 @@ class ToolsDB2(QtWidgets.QWidget): self.cutz_entry.set_precision(self.decimals) self.cutz_entry.setObjectName('gdb_cutz') - grid0.addWidget(self.cutz_label, 4, 0) - grid0.addWidget(self.cutz_entry, 4, 1) + self.grid0.addWidget(self.cutz_label, 4, 0) + self.grid0.addWidget(self.cutz_entry, 4, 1) # Multi Depth self.multidepth_label = QtWidgets.QLabel('%s:' % _("MultiDepth")) @@ -1545,8 +1557,8 @@ class ToolsDB2(QtWidgets.QWidget): self.multidepth_cb = FCCheckBox() self.multidepth_cb.setObjectName('gdb_multidepth') - grid0.addWidget(self.multidepth_label, 5, 0) - grid0.addWidget(self.multidepth_cb, 5, 1) + self.grid0.addWidget(self.multidepth_label, 5, 0) + self.grid0.addWidget(self.multidepth_cb, 5, 1) # Depth Per Pass self.dpp_label = QtWidgets.QLabel('%s:' % _("DPP")) @@ -1559,8 +1571,8 @@ class ToolsDB2(QtWidgets.QWidget): self.multidepth_entry.set_precision(self.decimals) self.multidepth_entry.setObjectName('gdb_multidepth_entry') - grid0.addWidget(self.dpp_label, 7, 0) - grid0.addWidget(self.multidepth_entry, 7, 1) + self.grid0.addWidget(self.dpp_label, 7, 0) + self.grid0.addWidget(self.multidepth_entry, 7, 1) # Travel Z self.travelz_label = QtWidgets.QLabel('%s:' % _("Travel Z")) @@ -1574,8 +1586,8 @@ class ToolsDB2(QtWidgets.QWidget): self.travelz_entry.set_precision(self.decimals) self.travelz_entry.setObjectName('gdb_travel') - grid0.addWidget(self.travelz_label, 9, 0) - grid0.addWidget(self.travelz_entry, 9, 1) + self.grid0.addWidget(self.travelz_label, 9, 0) + self.grid0.addWidget(self.travelz_entry, 9, 1) # Feedrate X-Y self.frxy_label = QtWidgets.QLabel('%s:' % _("Feedrate X-Y")) @@ -1583,11 +1595,13 @@ class ToolsDB2(QtWidgets.QWidget): _("Feedrate X-Y. Feedrate\n" "The speed on XY plane used while cutting into material.")) - self.frxy_entry = FCEntry() + self.frxy_entry = FCDoubleSpinner() + self.frxy_entry.set_range(-9999.9999, 9999.9999) + self.frxy_entry.set_precision(self.decimals) self.frxy_entry.setObjectName('gdb_frxy') - grid0.addWidget(self.frxy_label, 12, 0) - grid0.addWidget(self.frxy_entry, 12, 1) + self.grid0.addWidget(self.frxy_label, 12, 0) + self.grid0.addWidget(self.frxy_entry, 12, 1) # Feedrate Z self.frz_label = QtWidgets.QLabel('%s:' % _("Feedrate Z")) @@ -1600,8 +1614,8 @@ class ToolsDB2(QtWidgets.QWidget): self.frz_entry.set_precision(self.decimals) self.frz_entry.setObjectName('gdb_frz') - grid0.addWidget(self.frz_label, 14, 0) - grid0.addWidget(self.frz_entry, 14, 1) + self.grid0.addWidget(self.frz_label, 14, 0) + self.grid0.addWidget(self.frz_entry, 14, 1) # Spindle Spped self.spindle_label = QtWidgets.QLabel('%s:' % _("Spindle Speed")) @@ -1615,8 +1629,8 @@ class ToolsDB2(QtWidgets.QWidget): self.spindle_entry.set_precision(self.decimals) self.frz_entry.setObjectName('gdb_spindle') - grid0.addWidget(self.spindle_label, 15, 0) - grid0.addWidget(self.spindle_entry, 15, 1) + self.grid0.addWidget(self.spindle_label, 15, 0) + self.grid0.addWidget(self.spindle_entry, 15, 1) # Dwell self.dwell_label = QtWidgets.QLabel('%s:' % _("Dwell")) @@ -1628,8 +1642,8 @@ class ToolsDB2(QtWidgets.QWidget): self.dwell_cb = FCCheckBox() self.dwell_cb.setObjectName('gdb_dwell') - grid0.addWidget(self.dwell_label, 16, 0) - grid0.addWidget(self.dwell_cb, 16, 1) + self.grid0.addWidget(self.dwell_label, 16, 0) + self.grid0.addWidget(self.dwell_cb, 16, 1) # Dwell Time self.dwelltime_label = QtWidgets.QLabel('%s:' % _("Dwelltime")) @@ -1642,17 +1656,18 @@ class ToolsDB2(QtWidgets.QWidget): self.dwelltime_entry.set_precision(self.decimals) self.dwelltime_entry.setObjectName('gdb_dwelltime') - grid0.addWidget(self.dwelltime_label, 17, 0) - grid0.addWidget(self.dwelltime_entry, 17, 1) + self.grid0.addWidget(self.dwelltime_label, 17, 0) + self.grid0.addWidget(self.dwelltime_entry, 17, 1) # ########################################################################### # ############### ADVANCED UI form ########################################## # ########################################################################### - grid1 = QtWidgets.QGridLayout() - self.advanced_vlay.addLayout(grid1) - grid1.setColumnStretch(0, 0) - grid1.setColumnStretch(1, 1) + self.grid1 = QtWidgets.QGridLayout() + self.advanced_vlay.addLayout(self.grid1) + self.grid1.setColumnStretch(0, 0) + self.grid1.setColumnStretch(1, 1) + self.advanced_vlay.addStretch() # Tool Type self.type_label = QtWidgets.QLabel('%s:' % _("Tool Type")) @@ -1667,8 +1682,8 @@ class ToolsDB2(QtWidgets.QWidget): self.type_combo.addItems(["Iso", "Rough", "Finish"]) self.type_combo.setObjectName('gdb_type') - grid1.addWidget(self.type_label, 0, 0) - grid1.addWidget(self.type_combo, 0, 1) + self.grid1.addWidget(self.type_label, 0, 0) + self.grid1.addWidget(self.type_combo, 0, 1) # Tool Offset self.tooloffset_label = QtWidgets.QLabel('%s:' % _('Tool Offset')) @@ -1684,8 +1699,8 @@ class ToolsDB2(QtWidgets.QWidget): self.tooloffset_combo.addItems(["Path", "In", "Out", "Custom"]) self.tooloffset_combo.setObjectName('gdb_tool_offset') - grid1.addWidget(self.tooloffset_label, 2, 0) - grid1.addWidget(self.tooloffset_combo, 2, 1) + self.grid1.addWidget(self.tooloffset_label, 2, 0) + self.grid1.addWidget(self.tooloffset_combo, 2, 1) # Custom Offset self.custom_offset_label = QtWidgets.QLabel('%s:' % _("Custom Offset")) @@ -1698,8 +1713,8 @@ class ToolsDB2(QtWidgets.QWidget): self.custom_offset_entry.set_precision(self.decimals) self.custom_offset_entry.setObjectName('gdb_custom_offset') - grid1.addWidget(self.custom_offset_label, 5, 0) - grid1.addWidget(self.custom_offset_entry, 5, 1) + self.grid1.addWidget(self.custom_offset_label, 5, 0) + self.grid1.addWidget(self.custom_offset_entry, 5, 1) # V-Dia self.vdia_label = QtWidgets.QLabel('%s:' % _("V-Dia")) @@ -1712,8 +1727,8 @@ class ToolsDB2(QtWidgets.QWidget): self.vdia_entry.set_precision(self.decimals) self.vdia_entry.setObjectName('gdb_vdia') - grid1.addWidget(self.vdia_label, 7, 0) - grid1.addWidget(self.vdia_entry, 7, 1) + self.grid1.addWidget(self.vdia_label, 7, 0) + self.grid1.addWidget(self.vdia_entry, 7, 1) # V-Angle self.vangle_label = QtWidgets.QLabel('%s:' % _("V-Angle")) @@ -1726,8 +1741,8 @@ class ToolsDB2(QtWidgets.QWidget): self.vangle_entry.set_precision(self.decimals) self.vangle_entry.setObjectName('gdb_vangle') - grid1.addWidget(self.vangle_label, 8, 0) - grid1.addWidget(self.vangle_entry, 8, 1) + self.grid1.addWidget(self.vangle_label, 8, 0) + self.grid1.addWidget(self.vangle_entry, 8, 1) # Feedrate Rapids self.frapids_label = QtWidgets.QLabel('%s:' % _("FR Rapids")) @@ -1742,8 +1757,8 @@ class ToolsDB2(QtWidgets.QWidget): self.frapids_entry.set_precision(self.decimals) self.frapids_entry.setObjectName('gdb_frapids') - grid1.addWidget(self.frapids_label, 10, 0) - grid1.addWidget(self.frapids_entry, 10, 1) + self.grid1.addWidget(self.frapids_label, 10, 0) + self.grid1.addWidget(self.frapids_entry, 10, 1) # Extra Cut self.ecut_label = QtWidgets.QLabel('%s:' % _("ExtraCut")) @@ -1757,8 +1772,8 @@ class ToolsDB2(QtWidgets.QWidget): self.ecut_cb = FCCheckBox() self.ecut_cb.setObjectName('gdb_ecut') - grid1.addWidget(self.ecut_label, 12, 0) - grid1.addWidget(self.ecut_cb, 12, 1) + self.grid1.addWidget(self.ecut_label, 12, 0) + self.grid1.addWidget(self.ecut_cb, 12, 1) # Extra Cut Length self.ecut_length_label = QtWidgets.QLabel('%s:' % _("E-Cut Length")) @@ -1775,8 +1790,8 @@ class ToolsDB2(QtWidgets.QWidget): self.ecut_length_entry.set_precision(self.decimals) self.ecut_length_entry.setObjectName('gdb_ecut_length') - grid1.addWidget(self.ecut_length_label, 13, 0) - grid1.addWidget(self.ecut_length_entry, 13, 1) + self.grid1.addWidget(self.ecut_length_label, 13, 0) + self.grid1.addWidget(self.ecut_length_entry, 13, 1) # #################################################################### # #################################################################### @@ -1862,7 +1877,7 @@ class ToolsDB2(QtWidgets.QWidget): "depthperpass": self.multidepth_entry, "travelz": self.travelz_entry, "feedrate": self.frxy_entry, - "feedrate_z": self.frxy_entry, + "feedrate_z": self.frz_entry, "spindlespeed": self.spindle_entry, "dwell": self.dwell_cb, "dwelltime": self.dwelltime_entry, @@ -1904,6 +1919,8 @@ class ToolsDB2(QtWidgets.QWidget): "gdb_ecut_length": "extracut_length" } + self.current_toolid = None + # ############################################################################## # ######################## SIGNALS ############################################# # ############################################################################## @@ -1920,20 +1937,38 @@ class ToolsDB2(QtWidgets.QWidget): # self.tree_widget.selectionModel().selectionChanged.connect(self.on_list_selection_change) self.tree_widget.currentItemChanged.connect(self.on_list_selection_change) self.tree_widget.itemChanged.connect(self.on_list_item_edited) + self.tree_widget.customContextMenuRequested.connect(self.on_menu_request) self.setup_db_ui() + def on_menu_request(self, pos): + + menu = QtWidgets.QMenu() + add_tool = menu.addAction(QtGui.QIcon(self.app.resource_location + '/plus16.png'), _("Add to DB")) + add_tool.triggered.connect(self.on_tool_add) + + copy_tool = menu.addAction(QtGui.QIcon(self.app.resource_location + '/copy16.png'), _("Copy from DB")) + copy_tool.triggered.connect(self.on_tool_copy) + + delete_tool = menu.addAction(QtGui.QIcon(self.app.resource_location + '/delete32.png'), _("Delete from DB")) + delete_tool.triggered.connect(self.on_tool_delete) + + # tree_item = self.tree_widget.itemAt(pos) + menu.exec(self.tree_widget.viewport().mapToGlobal(pos)) + def on_list_selection_change(self, current, previous): # for idx in current.indexes(): # print(idx.data()) - print(current.text(0)) - self.table_widget.selectRow(int(current.text(0))-1) + # print(current.text(0)) + self.current_toolid = int(current.text(0)) + + self.storage_to_form(self.db_tool_dict[current.text(0)]) def on_list_item_edited(self, item, column): if column == 0: return - row = int(item.text(0)) - 1 - self.table_widget.item(row, 1).setText(item.text(1)) + + self.name_entry.set_value(item.text(1)) def storage_to_form(self, dict_storage): for form_key in self.form_fields: @@ -1941,8 +1976,15 @@ class ToolsDB2(QtWidgets.QWidget): if form_key == storage_key: try: self.form_fields[form_key].set_value(dict_storage[form_key]) - except Exception: - pass + except Exception as e: + print(str(e)) + if storage_key == 'data': + for data_key in dict_storage[storage_key]: + if form_key == data_key: + try: + self.form_fields[form_key].set_value(dict_storage['data'][data_key]) + except Exception as e: + print(str(e)) def form_to_storage(self, tool): self.blockSignals(True) @@ -1988,18 +2030,8 @@ class ToolsDB2(QtWidgets.QWidget): self.build_db_ui() - self.tree_widget.setupContextMenu() - self.tree_widget.addContextMenu( - _("Add to DB"), self.on_tool_add, icon=QtGui.QIcon(self.app.resource_location + "/plus16.png")) - self.tree_widget.addContextMenu( - _("Copy from DB"), self.on_tool_copy, icon=QtGui.QIcon(self.app.resource_location + "/copy16.png")) - self.tree_widget.addContextMenu( - _("Delete from DB"), self.on_tool_delete, icon=QtGui.QIcon(self.app.resource_location + "/delete32.png")) - def build_db_ui(self): self.ui_disconnect() - self.table_widget.setRowCount(len(self.db_tool_dict)) - nr_crt = 0 parent = self.tree_widget @@ -2013,7 +2045,7 @@ class ToolsDB2(QtWidgets.QWidget): t_name = dict_val['name'] try: - self.add_tool_table_line(row, name=t_name, widget=self.table_widget, tooldict=dict_val) + # self.add_tool_table_line(row, name=t_name, tooldict=dict_val) self.tree_widget.blockSignals(True) try: self.tree_widget.addParentEditable(parent=parent, title=[str(row+1), t_name], editable=True) @@ -2022,211 +2054,18 @@ class ToolsDB2(QtWidgets.QWidget): self.tree_widget.blockSignals(False) except Exception as e: self.app.log.debug("ToolDB.build_db_ui.add_tool_table_line() --> %s" % str(e)) - vertical_header = self.table_widget.verticalHeader() - vertical_header.hide() - horizontal_header = self.table_widget.horizontalHeader() - horizontal_header.setMinimumSectionSize(10) - horizontal_header.setDefaultSectionSize(70) - - self.table_widget.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents) - for x in range(27): - self.table_widget.resizeColumnToContents(x) - - horizontal_header.setSectionResizeMode(0, QtWidgets.QHeaderView.Fixed) - # horizontal_header.setSectionResizeMode(1, QtWidgets.QHeaderView.Stretch) - # horizontal_header.setSectionResizeMode(13, QtWidgets.QHeaderView.Fixed) - - horizontal_header.resizeSection(0, 20) - # horizontal_header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents) - # horizontal_header.setSectionResizeMode(2, QtWidgets.QHeaderView.Stretch) + if self.current_toolid is None or self.current_toolid < 1: + if self.db_tool_dict: + self.storage_to_form(self.db_tool_dict['1']) + else: + self.storage_to_form(self.db_tool_dict[str(self.current_toolid)]) self.ui_connect() - def add_tool_table_line(self, row, name, widget, tooldict): + def add_tool_table_line(self, row, name, tooldict): data = tooldict['data'] - nr_crt = row + 1 - id_item = QtWidgets.QTableWidgetItem('%d' % int(nr_crt)) - # id_item.setFlags(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled) - flags = id_item.flags() & ~QtCore.Qt.ItemIsEditable - id_item.setFlags(flags) - widget.setItem(row, 0, id_item) # Tool name/id - - tool_name_item = QtWidgets.QTableWidgetItem(name) - widget.setItem(row, 1, tool_name_item) - - dia_item = FCDoubleSpinner() - dia_item.set_precision(self.decimals) - dia_item.setSingleStep(0.1) - dia_item.set_range(0.0, 9999.9999) - dia_item.set_value(float(tooldict['tooldia'])) - widget.setCellWidget(row, 2, dia_item) - - tool_offset_item = FCComboBox() - for item in self.offset_item_options: - tool_offset_item.addItem(item) - tool_offset_item.set_value(tooldict['offset']) - widget.setCellWidget(row, 3, tool_offset_item) - - c_offset_item = FCDoubleSpinner() - c_offset_item.set_precision(self.decimals) - c_offset_item.setSingleStep(0.1) - c_offset_item.set_range(-9999.9999, 9999.9999) - c_offset_item.set_value(float(tooldict['offset_value'])) - widget.setCellWidget(row, 4, c_offset_item) - - tt_item = FCComboBox() - for item in self.type_item_options: - tt_item.addItem(item) - tt_item.set_value(tooldict['type']) - widget.setCellWidget(row, 5, tt_item) - - tshape_item = FCComboBox() - for item in self.tool_type_item_options: - tshape_item.addItem(item) - tshape_item.set_value(tooldict['tool_type']) - widget.setCellWidget(row, 6, tshape_item) - - cutz_item = FCDoubleSpinner() - cutz_item.set_precision(self.decimals) - cutz_item.setSingleStep(0.1) - if self.app.defaults['global_machinist_setting']: - cutz_item.set_range(-9999.9999, 9999.9999) - else: - cutz_item.set_range(-9999.9999, -0.0000) - - cutz_item.set_value(float(data['cutz'])) - widget.setCellWidget(row, 7, cutz_item) - - multidepth_item = FCCheckBox() - multidepth_item.set_value(data['multidepth']) - widget.setCellWidget(row, 8, multidepth_item) - - # to make the checkbox centered but it can no longer have it's value accessed - needs a fix using findchild() - # multidepth_item = QtWidgets.QWidget() - # cb = FCCheckBox() - # cb.set_value(data['multidepth']) - # qhboxlayout = QtWidgets.QHBoxLayout(multidepth_item) - # qhboxlayout.addWidget(cb) - # qhboxlayout.setAlignment(QtCore.Qt.AlignCenter) - # qhboxlayout.setContentsMargins(0, 0, 0, 0) - # widget.setCellWidget(row, 8, multidepth_item) - - depth_per_pass_item = FCDoubleSpinner() - depth_per_pass_item.set_precision(self.decimals) - depth_per_pass_item.setSingleStep(0.1) - depth_per_pass_item.set_range(0.0, 9999.9999) - depth_per_pass_item.set_value(float(data['depthperpass'])) - widget.setCellWidget(row, 9, depth_per_pass_item) - - vtip_dia_item = FCDoubleSpinner() - vtip_dia_item.set_precision(self.decimals) - vtip_dia_item.setSingleStep(0.1) - vtip_dia_item.set_range(0.0, 9999.9999) - vtip_dia_item.set_value(float(data['vtipdia'])) - widget.setCellWidget(row, 10, vtip_dia_item) - - vtip_angle_item = FCDoubleSpinner() - vtip_angle_item.set_precision(self.decimals) - vtip_angle_item.setSingleStep(0.1) - vtip_angle_item.set_range(-360.0, 360.0) - vtip_angle_item.set_value(float(data['vtipangle'])) - widget.setCellWidget(row, 11, vtip_angle_item) - - travelz_item = FCDoubleSpinner() - travelz_item.set_precision(self.decimals) - travelz_item.setSingleStep(0.1) - if self.app.defaults['global_machinist_setting']: - travelz_item.set_range(-9999.9999, 9999.9999) - else: - travelz_item.set_range(0.0000, 9999.9999) - - travelz_item.set_value(float(data['travelz'])) - widget.setCellWidget(row, 12, travelz_item) - - fr_item = FCDoubleSpinner() - fr_item.set_precision(self.decimals) - fr_item.set_range(0.0, 9999.9999) - fr_item.set_value(float(data['feedrate'])) - widget.setCellWidget(row, 13, fr_item) - - frz_item = FCDoubleSpinner() - frz_item.set_precision(self.decimals) - frz_item.set_range(0.0, 9999.9999) - frz_item.set_value(float(data['feedrate_z'])) - widget.setCellWidget(row, 14, frz_item) - - frrapids_item = FCDoubleSpinner() - frrapids_item.set_precision(self.decimals) - frrapids_item.set_range(0.0, 9999.9999) - frrapids_item.set_value(float(data['feedrate_rapid'])) - widget.setCellWidget(row, 15, frrapids_item) - - spindlespeed_item = FCSpinner() - spindlespeed_item.set_range(0, 1000000) - spindlespeed_item.set_value(int(data['spindlespeed'])) - spindlespeed_item.set_step(100) - widget.setCellWidget(row, 16, spindlespeed_item) - - dwell_item = FCCheckBox() - dwell_item.set_value(data['dwell']) - widget.setCellWidget(row, 17, dwell_item) - - dwelltime_item = FCDoubleSpinner() - dwelltime_item.set_precision(self.decimals) - dwelltime_item.set_range(0.0000, 9999.9999) - dwelltime_item.set_value(float(data['dwelltime'])) - widget.setCellWidget(row, 18, dwelltime_item) - - pp_item = FCComboBox() - for item in self.app.preprocessors: - pp_item.addItem(item) - pp_item.set_value(data['ppname_g']) - widget.setCellWidget(row, 19, pp_item) - - ecut_item = FCCheckBox() - ecut_item.set_value(data['extracut']) - widget.setCellWidget(row, 20, ecut_item) - - ecut_length_item = FCDoubleSpinner() - ecut_length_item.set_precision(self.decimals) - ecut_length_item.set_range(0.0000, 9999.9999) - ecut_length_item.set_value(data['extracut_length']) - widget.setCellWidget(row, 21, ecut_length_item) - - toolchange_item = FCCheckBox() - toolchange_item.set_value(data['toolchange']) - widget.setCellWidget(row, 22, toolchange_item) - - toolchangexy_item = QtWidgets.QTableWidgetItem(str(data['toolchangexy']) if data['toolchangexy'] else '') - widget.setItem(row, 23, toolchangexy_item) - - toolchangez_item = FCDoubleSpinner() - toolchangez_item.set_precision(self.decimals) - toolchangez_item.setSingleStep(0.1) - if self.app.defaults['global_machinist_setting']: - toolchangez_item.set_range(-9999.9999, 9999.9999) - else: - toolchangez_item.set_range(0.0000, 9999.9999) - - toolchangez_item.set_value(float(data['toolchangez'])) - widget.setCellWidget(row, 24, toolchangez_item) - - startz_item = QtWidgets.QTableWidgetItem(str(data['startz']) if data['startz'] else '') - widget.setItem(row, 25, startz_item) - - endz_item = FCDoubleSpinner() - endz_item.set_precision(self.decimals) - endz_item.setSingleStep(0.1) - if self.app.defaults['global_machinist_setting']: - endz_item.set_range(-9999.9999, 9999.9999) - else: - endz_item.set_range(0.0000, 9999.9999) - - endz_item.set_value(float(data['endz'])) - widget.setCellWidget(row, 26, endz_item) - def on_tool_add(self): """ Add a tool in the DB Tool Table @@ -2277,11 +2116,11 @@ class ToolsDB2(QtWidgets.QWidget): dict_elem['data'] = default_data new_toolid = len(self.db_tool_dict) + 1 - self.db_tool_dict[new_toolid] = deepcopy(dict_elem) + self.db_tool_dict[str(new_toolid)] = deepcopy(dict_elem) # add the new entry to the Tools DB table + self.update_storage() self.build_db_ui() - self.callback_on_edited() self.app.inform.emit('[success] %s' % _("Tool added to DB.")) def on_tool_copy(self): @@ -2289,20 +2128,23 @@ class ToolsDB2(QtWidgets.QWidget): Copy a selection of Tools in the Tools DB table :return: """ - new_tool_id = self.table_widget.rowCount() + 1 - for model_index in self.table_widget.selectionModel().selectedRows(): - # index = QtCore.QPersistentModelIndex(model_index) - old_tool_id = self.table_widget.item(model_index.row(), 0).text() - new_tool_id += 1 + new_tool_id = len(self.db_tool_dict) + for item in self.tree_widget.selectedItems(): + old_tool_id = item.data(0, QtCore.Qt.DisplayRole) for toolid, dict_val in list(self.db_tool_dict.items()): if int(old_tool_id) == int(toolid): + new_tool_id += 1 + new_key = str(new_tool_id) + self.db_tool_dict.update({ - new_tool_id: deepcopy(dict_val) + new_key: deepcopy(dict_val) }) + self.current_toolid = new_tool_id + + self.update_storage() self.build_db_ui() - self.callback_on_edited() self.app.inform.emit('[success] %s' % _("Tool copied from Tools DB.")) def on_tool_delete(self): @@ -2310,17 +2152,18 @@ class ToolsDB2(QtWidgets.QWidget): Delete a selection of Tools in the Tools DB table :return: """ - for model_index in self.table_widget.selectionModel().selectedRows(): - # index = QtCore.QPersistentModelIndex(model_index) - toolname_to_remove = self.table_widget.item(model_index.row(), 0).text() + for item in self.tree_widget.selectedItems(): + toolname_to_remove = item.data(0, QtCore.Qt.DisplayRole) for toolid, dict_val in list(self.db_tool_dict.items()): if int(toolname_to_remove) == int(toolid): # remove from the storage self.db_tool_dict.pop(toolid, None) + self.current_toolid -= 1 + + self.update_storage() self.build_db_ui() - self.callback_on_edited() self.app.inform.emit('[success] %s' % _("Tool removed from Tools DB.")) def on_export_tools_db_file(self): @@ -2408,7 +2251,7 @@ class ToolsDB2(QtWidgets.QWidget): self.app.inform.emit('[success] %s: %s' % (_("Loaded FlatCAM Tools DB from"), filename)) self.build_db_ui() - self.callback_on_edited() + self.update_storage() def on_save_tools_db(self, silent=False): self.app.log.debug("ToolsDB.on_save_button() --> Saving Tools Database to file.") @@ -2434,145 +2277,126 @@ class ToolsDB2(QtWidgets.QWidget): self.app.inform.emit('[success] %s' % _("Saved Tools DB.")) def ui_connect(self): - try: - try: - self.table_widget.itemChanged.disconnect(self.callback_on_edited) - except (TypeError, AttributeError): - pass - self.table_widget.itemChanged.connect(self.callback_on_edited) - except AttributeError: - pass + # make sure that we don't make multiple connections to the widgets + self.ui_disconnect() - for row in range(self.table_widget.rowCount()): - for col in range(self.table_widget.columnCount()): - # ComboBox - try: - try: - self.table_widget.cellWidget(row, col).currentIndexChanged.disconnect(self.callback_on_edited) - except (TypeError, AttributeError): - pass - self.table_widget.cellWidget(row, col).currentIndexChanged.connect(self.callback_on_edited) - except AttributeError: - pass + self.name_entry.editingFinished.connect(self.update_tree_name) - # CheckBox - try: - try: - self.table_widget.cellWidget(row, col).toggled.disconnect(self.callback_on_edited) - except (TypeError, AttributeError): - pass - self.table_widget.cellWidget(row, col).toggled.connect(self.callback_on_edited) - except AttributeError: - pass + for key in self.form_fields: + wdg = self.form_fields[key] - # SpinBox, DoubleSpinBox - try: - try: - self.table_widget.cellWidget(row, col).valueChanged.disconnect(self.callback_on_edited) - except (TypeError, AttributeError): - pass - self.table_widget.cellWidget(row, col).valueChanged.connect(self.callback_on_edited) - except AttributeError: - pass + # FCEntry + if isinstance(wdg, FCEntry): + wdg.textChanged.connect(self.update_storage) + + # ComboBox + if isinstance(wdg, FCComboBox): + wdg.currentIndexChanged.connect(self.update_storage) + + # CheckBox + if isinstance(wdg, FCCheckBox): + wdg.toggled.connect(self.update_storage) + + # SpinBox, DoubleSpinBox + if isinstance(wdg, FCSpinner) or isinstance(wdg, FCDoubleSpinner): + wdg.valueChanged.connect(self.update_storage) def ui_disconnect(self): try: - self.table_widget.itemChanged.disconnect(self.callback_on_edited) + self.name_entry.editingFinished.disconnect(self.update_tree_name) except (TypeError, AttributeError): pass - for row in range(self.table_widget.rowCount()): - for col in range(self.table_widget.columnCount()): - # ComboBox + for key in self.form_fields: + wdg = self.form_fields[key] + + # FCEntry + if isinstance(wdg, FCEntry): try: - self.table_widget.cellWidget(row, col).currentIndexChanged.disconnect(self.callback_on_edited) + wdg.textChanged.disconnect(self.update_storage) except (TypeError, AttributeError): pass - # CheckBox + # ComboBox + if isinstance(wdg, FCComboBox): try: - self.table_widget.cellWidget(row, col).toggled.disconnect(self.callback_on_edited) + wdg.currentIndexChanged.disconnect(self.update_storage) except (TypeError, AttributeError): pass - # SpinBox, DoubleSpinBox + # CheckBox + if isinstance(wdg, FCCheckBox): try: - self.table_widget.cellWidget(row, col).valueChanged.disconnect(self.callback_on_edited) + wdg.toggled.disconnect(self.update_storage) except (TypeError, AttributeError): pass - def callback_on_edited(self): + # SpinBox, DoubleSpinBox + if isinstance(wdg, FCSpinner) or isinstance(wdg, FCDoubleSpinner): + try: + wdg.valueChanged.disconnect(self.update_storage) + except (TypeError, AttributeError): + pass - # update the dictionary storage self.db_tool_dict - self.db_tool_dict.clear() - dict_elem = {} - default_data = {} + def update_tree_name(self): + val = self.name_entry.get_value() - for row in range(self.table_widget.rowCount()): - new_toolid = row + 1 - for col in range(self.table_widget.columnCount()): - column_header_text = self.table_widget.horizontalHeaderItem(col).text() - if column_header_text == _('Tool Name'): - dict_elem['name'] = self.table_widget.item(row, col).text() - elif column_header_text == _('Tool Dia'): - dict_elem['tooldia'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Tool Offset'): - dict_elem['offset'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Custom Offset'): - dict_elem['offset_value'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Tool Type'): - dict_elem['type'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Tool Shape'): - dict_elem['tool_type'] = self.table_widget.cellWidget(row, col).get_value() - else: - if column_header_text == _('Cut Z'): - default_data['cutz'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('MultiDepth'): - default_data['multidepth'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('DPP'): - default_data['depthperpass'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('V-Dia'): - default_data['vtipdia'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('V-Angle'): - default_data['vtipangle'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Travel Z'): - default_data['travelz'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('FR'): - default_data['feedrate'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('FR Z'): - default_data['feedrate_z'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('FR Rapids'): - default_data['feedrate_rapid'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Spindle Speed'): - default_data['spindlespeed'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Dwell'): - default_data['dwell'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Dwelltime'): - default_data['dwelltime'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Preprocessor'): - default_data['ppname_g'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('ExtraCut'): - default_data['extracut'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _("E-Cut Length"): - default_data['extracut_length'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Toolchange'): - default_data['toolchange'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Toolchange XY'): - default_data['toolchangexy'] = self.table_widget.item(row, col).text() - elif column_header_text == _('Toolchange Z'): - default_data['toolchangez'] = self.table_widget.cellWidget(row, col).get_value() - elif column_header_text == _('Start Z'): - default_data['startz'] = float(self.table_widget.item(row, col).text()) \ - if self.table_widget.item(row, col).text() is not '' else None - elif column_header_text == _('End Z'): - default_data['endz'] = self.table_widget.cellWidget(row, col).get_value() + item = self.tree_widget.currentItem() + # I'm setting the value for the second column (designated by 1) because first column holds the ID + # and second column holds the Name (this behavior is set in the build_ui method) + item.setData(1, QtCore.Qt.DisplayRole, val) - dict_elem['data'] = default_data - self.db_tool_dict.update( - { - new_toolid: deepcopy(dict_elem) - } - ) + def update_storage(self): + + tool_id = str(self.current_toolid) + wdg = self.sender() + if wdg is None: + return + wdg_name = wdg.objectName() + + if wdg_name == "gdb_name": + self.db_tool_dict[tool_id]['name'] = wdg.get_value() + elif wdg_name == "gdb_dia": + self.db_tool_dict[tool_id]['tooldia'] = wdg.get_value() + elif wdg_name == "gdb_tool_offset": + self.db_tool_dict[tool_id]['offset'] = wdg.get_value() + elif wdg_name == "gdb_custom_offset": + self.db_tool_dict[tool_id]['offset_value'] = wdg.get_value() + elif wdg_name == "gdb_type": + self.db_tool_dict[tool_id]['type'] = wdg.get_value() + elif wdg_name == "gdb_shape": + self.db_tool_dict[tool_id]['tool_type'] = wdg.get_value() + else: + if wdg_name == "gdb_cutz": + self.db_tool_dict[tool_id]['data']['cutz'] = wdg.get_value() + elif wdg_name == "gdb_multidepth": + self.db_tool_dict[tool_id]['data']['multidepth'] = wdg.get_value() + elif wdg_name == "gdb_multidepth_entry": + self.db_tool_dict[tool_id]['data']['depthperpass'] = wdg.get_value() + + elif wdg_name == "gdb_travel": + self.db_tool_dict[tool_id]['data']['travelz'] = wdg.get_value() + elif wdg_name == "gdb_frxy": + self.db_tool_dict[tool_id]['data']['feedrate'] = wdg.get_value() + elif wdg_name == "gdb_frz": + self.db_tool_dict[tool_id]['data']['feedrate_z'] = wdg.get_value() + elif wdg_name == "gdb_spindle": + self.db_tool_dict[tool_id]['data']['spindlespeed'] = wdg.get_value() + elif wdg_name == "gdb_dwell": + self.db_tool_dict[tool_id]['data']['dwell'] = wdg.get_value() + elif wdg_name == "gdb_dwelltime": + self.db_tool_dict[tool_id]['data']['dwelltime'] = wdg.get_value() + + elif wdg_name == "gdb_vdia": + self.db_tool_dict[tool_id]['data']['vtipdia'] = wdg.get_value() + elif wdg_name == "gdb_vangle": + self.db_tool_dict[tool_id]['data']['vtipangle'] = wdg.get_value() + elif wdg_name == "gdb_frapids": + self.db_tool_dict[tool_id]['data']['feedrate_rapid'] = wdg.get_value() + elif wdg_name == "gdb_ecut": + self.db_tool_dict[tool_id]['data']['extracut'] = wdg.get_value() + elif wdg_name == "gdb_ecut_length": + self.db_tool_dict[tool_id]['data']['extracut_length'] = wdg.get_value() self.callback_app() diff --git a/README.md b/README.md index 7ace08cb..0137a92f 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,10 @@ CAD program, and create G-Code for Isolation routing. ================================================= +28.03.2020 + +- finished the new database based on a QTreeWidget + 21.03.2020 - fixed Cutout Tool to work with negative values for Margin parameter diff --git a/requirements.txt b/requirements.txt index 6e58e3f7..ee962276 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ # This file contains python only requirements to be installed with pip # Python packages that cannot be installed with pip (e.g. PyQt5, GDAL) are not included. # Usage: pip3 install -r requirements.txt -pyqt5==5.12 +pyqt5==5.12.1 numpy>=1.16 matplotlib>=3.1 cycler>=0.10