From 0d886955f8b651e2b093f3ae5aed053c4c3ab8e8 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sun, 12 Jul 2020 18:30:24 +0300 Subject: [PATCH] - when creating a new FlatCAM object, the options will be updated with FlatCAM tools properties that relate to them - updated the Tools DB class by separating the Tools DB UI into it's own class - Tools DB - added the parameters for Drilling Tool --- CHANGELOG.md | 6 + appDatabase.py | 761 ++++++++++++++++++++++++---------- appObjects/AppObject.py | 59 ++- appObjects/FlatCAMGeometry.py | 6 +- appTools/ToolIsolation.py | 6 +- appTools/ToolNCC.py | 6 +- appTools/ToolPaint.py | 6 +- app_Main.py | 2 +- 8 files changed, 601 insertions(+), 251 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b3630fb..13b6bd77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ CHANGELOG for FlatCAM beta ================================================= +12.07.2020 + +- when creating a new FlatCAM object, the options will be updated with FlatCAM tools properties that relate to them +- updated the Tools DB class by separating the Tools DB UI into it's own class +- Tools DB - added the parameters for Drilling Tool + 11.07.2020 - moved all Excellon Advanced Prefeences to Drilling Tool Preferences diff --git a/appDatabase.py b/appDatabase.py index 88a64422..35981440 100644 --- a/appDatabase.py +++ b/appDatabase.py @@ -736,9 +736,9 @@ class ToolsDB(QtWidgets.QWidget): filename = self.app.data_path + "/geo_tools_db.FlatDB" # Preferences save, update the color of the Tools DB Tab text - for idx in range(self.app.ui.plot_tab_area.count()): - if self.app.ui.plot_tab_area.tabText(idx) == _("Tools Database"): - self.app.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black')) + for idx in range(self.app_ui.plot_tab_area.count()): + if self.app_ui.plot_tab_area.tabText(idx) == _("Tools Database"): + self.app_ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black')) # Save Tools DB in a file try: @@ -911,11 +911,11 @@ class ToolsDB(QtWidgets.QWidget): self.on_tool_request(tool=selected_tool) def on_cancel_tool(self): - for idx in range(self.app.ui.plot_tab_area.count()): - if self.app.ui.plot_tab_area.tabText(idx) == _("Tools Database"): - wdg = self.app.ui.plot_tab_area.widget(idx) + for idx in range(self.app_ui.plot_tab_area.count()): + if self.app_ui.plot_tab_area.tabText(idx) == _("Tools Database"): + wdg = self.app_ui.plot_tab_area.widget(idx) wdg.deleteLater() - self.app.ui.plot_tab_area.removeTab(idx) + self.app_ui.plot_tab_area.removeTab(idx) self.app.inform.emit('%s' % _("Cancelled adding tool from DB.")) # def resize_new_tool_table_widget(self, min_size, max_size): @@ -936,49 +936,22 @@ class ToolsDB(QtWidgets.QWidget): super().closeEvent(QCloseEvent) -class ToolsDB2(QtWidgets.QWidget): - - mark_tools_rows = QtCore.pyqtSignal() - - def __init__(self, app, callback_on_edited, callback_on_tool_request, parent=None): - super(ToolsDB2, self).__init__(parent) - +class ToolsDB2UI: + + def __init__(self, app, grid_layout): self.app = app self.decimals = self.app.decimals - self.callback_app = callback_on_edited - - self.on_tool_request = callback_on_tool_request - - self.offset_item_options = ["Path", "In", "Out", "Custom"] - self.type_item_options = ["Iso", "Rough", "Finish"] - self.tool_type_item_options = ["C1", "C2", "C3", "C4", "B", "V"] - - ''' - dict to hold all the tools in the Tools DB - format: - { - tool_id: { - 'name': 'new_tool' - 'tooldia': self.app.defaults["geometry_cnctooldia"] - 'offset': 'Path' - 'offset_value': 0.0 - 'type': _('Rough'), - 'tool_type': 'C1' - 'data': dict() - } - } - ''' - self.db_tool_dict = {} - - # layouts - grid_layout = QtWidgets.QGridLayout() - grid_layout.setColumnStretch(0, 0) - grid_layout.setColumnStretch(1, 1) - - self.setLayout(grid_layout) - + + settings = QtCore.QSettings("Open Source", "FlatCAM") + if settings.contains("machinist"): + self.machinist_setting = settings.value('machinist', type=int) + else: + self.machinist_setting = 0 + + g_lay = grid_layout + tree_layout = QtWidgets.QVBoxLayout() - grid_layout.addLayout(tree_layout, 0, 0) + g_lay.addLayout(tree_layout, 0, 0) self.tree_widget = FCTree(columns=2, header_hidden=False, protected_column=[0]) self.tree_widget.setHeaderLabels(["ID", "Tool Name"]) @@ -1003,7 +976,7 @@ class ToolsDB2(QtWidgets.QWidget): param_area.setWidget(param_widget) param_area.setWidgetResizable(True) - grid_layout.addWidget(param_area, 0, 1) + g_lay.addWidget(param_area, 0, 1) # ########################################################################### # ############## The UI form ################################################ @@ -1087,12 +1060,27 @@ class ToolsDB2(QtWidgets.QWidget): self.iso_box.setTitle(_("Isolation Parameters")) self.iso_box.setFixedWidth(250) + # DRILLING TOOL BOX + self.drill_box = QtWidgets.QGroupBox() + self.drill_box.setStyleSheet(""" + QGroupBox + { + font-size: 16px; + font-weight: bold; + } + """) + self.drill_vlay = QtWidgets.QVBoxLayout() + self.drill_box.setTitle(_("Drilling Parameters")) + self.drill_box.setFixedWidth(250) + + # Layout Constructor self.tool_description_box.setLayout(self.description_vlay) self.basic_box.setLayout(self.basic_vlay) self.advanced_box.setLayout(self.advanced_vlay) self.ncc_box.setLayout(self.ncc_vlay) self.paint_box.setLayout(self.paint_vlay) self.iso_box.setLayout(self.iso_vlay) + self.drill_box.setLayout(self.drill_vlay) geo_vlay = QtWidgets.QVBoxLayout() geo_vlay.addWidget(self.tool_description_box) @@ -1104,6 +1092,7 @@ class ToolsDB2(QtWidgets.QWidget): tools_vlay.addWidget(self.ncc_box) tools_vlay.addWidget(self.paint_box) tools_vlay.addWidget(self.iso_box) + tools_vlay.addWidget(self.drill_box) tools_vlay.addStretch() param_hlay.addLayout(geo_vlay) @@ -1132,27 +1121,6 @@ class ToolsDB2(QtWidgets.QWidget): self.grid_tool.addWidget(self.name_label, 0, 0) self.grid_tool.addWidget(self.name_entry, 0, 1) - # Tool Object Type - self.tool_object_label = QtWidgets.QLabel('%s:' % _('Object Type')) - self.tool_object_label.setToolTip( - _("The kind of application object where the tool is to be used.")) - - self.object_type_combo = FCComboBox() - self.object_type_combo.addItems([_("Application Tool"), _("Geometry"), _("Excellon")]) - self.object_type_combo.setObjectName('gdb_object_type') - - self.grid_tool.addWidget(self.tool_object_label, 1, 0) - self.grid_tool.addWidget(self.object_type_combo, 1, 1) - - # ########################################################################### - # ############### BASIC UI form ############################################# - # ########################################################################### - 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 Dia self.dia_label = QtWidgets.QLabel('%s:' % _('Tool Dia')) self.dia_label.setToolTip( @@ -1163,8 +1131,29 @@ class ToolsDB2(QtWidgets.QWidget): self.dia_entry.set_precision(self.decimals) self.dia_entry.setObjectName('gdb_dia') - self.grid0.addWidget(self.dia_label, 1, 0) - self.grid0.addWidget(self.dia_entry, 1, 1) + self.grid_tool.addWidget(self.dia_label, 1, 0) + self.grid_tool.addWidget(self.dia_entry, 1, 1) + + # Tool Object Type + self.tool_object_label = QtWidgets.QLabel('%s:' % _('Object Type')) + self.tool_object_label.setToolTip( + _("The kind of application object where the tool is to be used.")) + + self.object_type_combo = FCComboBox() + self.object_type_combo.addItems([_("General"), _("Milling"), _("Drilling")]) + self.object_type_combo.setObjectName('gdb_object_type') + + self.grid_tool.addWidget(self.tool_object_label, 2, 0) + self.grid_tool.addWidget(self.object_type_combo, 2, 1) + + # ########################################################################### + # ############### BASIC GEOMETRY UI form #################################### + # ########################################################################### + 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 Shape self.shape_label = QtWidgets.QLabel('%s:' % _('Tool Shape')) @@ -1309,7 +1298,7 @@ class ToolsDB2(QtWidgets.QWidget): self.grid0.addWidget(self.dwelltime_entry, 17, 1) # ########################################################################### - # ############### ADVANCED UI form ########################################## + # ############### ADVANCED GEOMETRY UI form ################################# # ########################################################################### self.grid1 = QtWidgets.QGridLayout() @@ -1773,6 +1762,206 @@ class ToolsDB2(QtWidgets.QWidget): self.grid4.addWidget(self.iso_type_label, 8, 0) self.grid4.addWidget(self.iso_type_radio, 8, 1) + + # ########################################################################### + # ################ DRILLING UI form ######################################### + # ########################################################################### + self.grid5 = QtWidgets.QGridLayout() + self.drill_vlay.addLayout(self.grid5) + self.grid5.setColumnStretch(0, 0) + self.grid5.setColumnStretch(1, 1) + self.drill_vlay.addStretch() + + # Cut Z + self.cutzlabel = QtWidgets.QLabel('%s:' % _('Cut Z')) + self.cutzlabel.setToolTip( + _("Drill depth (negative)\n" + "below the copper surface.") + ) + + self.cutz_entry = FCDoubleSpinner(callback=self.confirmation_message) + self.cutz_entry.set_precision(self.decimals) + + if self.machinist_setting == 0: + self.cutz_entry.set_range(-9999.9999, 0.0000) + else: + self.cutz_entry.set_range(-9999.9999, 9999.9999) + + self.cutz_entry.setSingleStep(0.1) + self.cutz_entry.setObjectName("gdb_e_cutz") + + self.grid5.addWidget(self.cutzlabel, 4, 0) + self.grid5.addWidget(self.cutz_entry, 4, 1) + + # Multi-Depth + self.mpass_cb = FCCheckBox('%s:' % _("Multi-Depth")) + self.mpass_cb.setToolTip( + _( + "Use multiple passes to limit\n" + "the cut depth in each pass. Will\n" + "cut multiple times until Cut Z is\n" + "reached." + ) + ) + self.mpass_cb.setObjectName("gdb_e_multidepth") + + self.maxdepth_entry = FCDoubleSpinner(callback=self.confirmation_message) + self.maxdepth_entry.set_precision(self.decimals) + self.maxdepth_entry.set_range(0, 9999.9999) + self.maxdepth_entry.setSingleStep(0.1) + + self.maxdepth_entry.setToolTip(_("Depth of each pass (positive).")) + self.maxdepth_entry.setObjectName("gdb_e_depthperpass") + + self.grid5.addWidget(self.mpass_cb, 5, 0) + self.grid5.addWidget(self.maxdepth_entry, 5, 1) + + # Travel Z (z_move) + self.travelzlabel = QtWidgets.QLabel('%s:' % _('Travel Z')) + self.travelzlabel.setToolTip( + _("Tool height when travelling\n" + "across the XY plane.") + ) + + self.travelz_entry = FCDoubleSpinner(callback=self.confirmation_message) + self.travelz_entry.set_precision(self.decimals) + + if self.machinist_setting == 0: + self.travelz_entry.set_range(0.00001, 9999.9999) + else: + self.travelz_entry.set_range(-9999.9999, 9999.9999) + + self.travelz_entry.setSingleStep(0.1) + self.travelz_entry.setObjectName("gdb_e_travelz") + + self.grid5.addWidget(self.travelzlabel, 6, 0) + self.grid5.addWidget(self.travelz_entry, 6, 1) + + # Excellon Feedrate Z + self.frzlabel = QtWidgets.QLabel('%s:' % _('Feedrate Z')) + self.frzlabel.setToolTip( + _("Tool speed while drilling\n" + "(in units per minute).\n" + "So called 'Plunge' feedrate.\n" + "This is for linear move G01.") + ) + self.feedrate_z_entry = FCDoubleSpinner(callback=self.confirmation_message) + self.feedrate_z_entry.set_precision(self.decimals) + self.feedrate_z_entry.set_range(0.0, 99999.9999) + self.feedrate_z_entry.setSingleStep(0.1) + self.feedrate_z_entry.setObjectName("gdb_e_feedratez") + + self.grid5.addWidget(self.frzlabel, 14, 0) + self.grid5.addWidget(self.feedrate_z_entry, 14, 1) + + # Excellon Rapid Feedrate + self.feedrate_rapid_label = QtWidgets.QLabel('%s:' % _('Feedrate Rapids')) + self.feedrate_rapid_label.setToolTip( + _("Tool speed while drilling\n" + "(in units per minute).\n" + "This is for the rapid move G00.\n" + "It is useful only for Marlin,\n" + "ignore for any other cases.") + ) + self.feedrate_rapid_entry = FCDoubleSpinner(callback=self.confirmation_message) + self.feedrate_rapid_entry.set_precision(self.decimals) + self.feedrate_rapid_entry.set_range(0.0, 99999.9999) + self.feedrate_rapid_entry.setSingleStep(0.1) + self.feedrate_rapid_entry.setObjectName("gdb_e_fr_rapid") + + self.grid5.addWidget(self.feedrate_rapid_label, 16, 0) + self.grid5.addWidget(self.feedrate_rapid_entry, 16, 1) + + # default values is to hide + self.feedrate_rapid_label.hide() + self.feedrate_rapid_entry.hide() + + # Spindlespeed + self.spindle_label = QtWidgets.QLabel('%s:' % _('Spindle speed')) + self.spindle_label.setToolTip( + _("Speed of the spindle\n" + "in RPM (optional)") + ) + + self.spindlespeed_entry = FCSpinner(callback=self.confirmation_message_int) + self.spindlespeed_entry.set_range(0, 1000000) + self.spindlespeed_entry.set_step(100) + self.spindlespeed_entry.setObjectName("gdb_e_spindlespeed") + + self.grid5.addWidget(self.spindle_label, 19, 0) + self.grid5.addWidget(self.spindlespeed_entry, 19, 1) + + # Dwell + self.dwell_cb = FCCheckBox('%s:' % _('Dwell')) + self.dwell_cb.setToolTip( + _("Pause to allow the spindle to reach its\n" + "speed before cutting.") + ) + self.dwell_cb.setObjectName("gdb_e_dwell") + + # Dwelltime + self.dwelltime_entry = FCDoubleSpinner(callback=self.confirmation_message) + self.dwelltime_entry.set_precision(self.decimals) + self.dwelltime_entry.set_range(0.0, 9999.9999) + self.dwelltime_entry.setSingleStep(0.1) + + self.dwelltime_entry.setToolTip( + _("Number of time units for spindle to dwell.") + ) + self.dwelltime_entry.setObjectName("gdb_e_dwelltime") + + self.grid5.addWidget(self.dwell_cb, 20, 0) + self.grid5.addWidget(self.dwelltime_entry, 20, 1) + + # Tool Offset + self.tool_offset_label = QtWidgets.QLabel('%s:' % _('Offset Z')) + self.tool_offset_label.setToolTip( + _("Some drill bits (the larger ones) need to drill deeper\n" + "to create the desired exit hole diameter due of the tip shape.\n" + "The value here can compensate the Cut Z parameter.") + ) + + self.offset_entry = FCDoubleSpinner(callback=self.confirmation_message) + self.offset_entry.set_precision(self.decimals) + self.offset_entry.set_range(-9999.9999, 9999.9999) + self.offset_entry.setObjectName("gdb_e_offset") + + self.grid5.addWidget(self.tool_offset_label, 25, 0) + self.grid5.addWidget(self.offset_entry, 25, 1) + + # Drill slots + self.drill_slots_cb = FCCheckBox('%s' % _('Drill slots')) + self.drill_slots_cb.setToolTip( + _("If the selected tool has slots then they will be drilled.") + ) + self.drill_slots_cb.setObjectName("gdb_e_drill_slots") + self.grid5.addWidget(self.drill_slots_cb, 27, 0, 1, 2) + + # Drill Overlap + self.drill_overlap_label = QtWidgets.QLabel('%s:' % _('Overlap')) + self.drill_overlap_label.setToolTip( + _("How much (percentage) of the tool diameter to overlap previous drill hole.") + ) + + self.drill_overlap_entry = FCDoubleSpinner(suffix='%', callback=self.confirmation_message) + self.drill_overlap_entry.set_precision(self.decimals) + self.drill_overlap_entry.set_range(0.0, 100.0000) + self.drill_overlap_entry.setSingleStep(0.1) + + self.drill_overlap_entry.setObjectName("gdb_e_drill_slots_over") + + self.grid5.addWidget(self.drill_overlap_label, 28, 0) + self.grid5.addWidget(self.drill_overlap_entry, 28, 1) + + # Last drill in slot + self.last_drill_cb = FCCheckBox('%s' % _('Last drill')) + self.last_drill_cb.setToolTip( + _("If the slot length is not completely covered by drill holes,\n" + "add a drill hole on the slot end point.") + ) + self.last_drill_cb.setObjectName("gdb_e_drill_last_drill") + self.grid5.addWidget(self.last_drill_cb, 30, 0, 1, 2) + # #################################################################### # #################################################################### # GUI for the lower part of the window @@ -1780,7 +1969,7 @@ class ToolsDB2(QtWidgets.QWidget): # #################################################################### new_vlay = QtWidgets.QVBoxLayout() - grid_layout.addLayout(new_vlay, 1, 0, 1, 2) + g_lay.addLayout(new_vlay, 1, 0, 1, 2) self.buttons_frame = QtWidgets.QFrame() self.buttons_frame.setContentsMargins(0, 0, 0, 0) @@ -1790,13 +1979,13 @@ class ToolsDB2(QtWidgets.QWidget): self.buttons_frame.setLayout(self.buttons_box) self.buttons_frame.show() - add_entry_btn = FCButton(_("Add Tool in DB")) - add_entry_btn.setToolTip( + self.add_entry_btn = FCButton(_("Add Tool in DB")) + self.add_entry_btn.setToolTip( _("Add a new tool in the Tools Database.\n" "It will be used in the Geometry UI.\n" "You can edit it after it is added.") ) - self.buttons_box.addWidget(add_entry_btn) + self.buttons_box.addWidget(self.add_entry_btn) # add_fct_entry_btn = FCButton(_("Add Paint/NCC Tool in DB")) # add_fct_entry_btn.setToolTip( @@ -1806,23 +1995,23 @@ class ToolsDB2(QtWidgets.QWidget): # ) # self.buttons_box.addWidget(add_fct_entry_btn) - remove_entry_btn = FCButton(_("Delete Tool from DB")) - remove_entry_btn.setToolTip( + self.remove_entry_btn = FCButton(_("Delete Tool from DB")) + self.remove_entry_btn.setToolTip( _("Remove a selection of tools in the Tools Database.") ) - self.buttons_box.addWidget(remove_entry_btn) + self.buttons_box.addWidget(self.remove_entry_btn) - export_db_btn = FCButton(_("Export DB")) - export_db_btn.setToolTip( + self.export_db_btn = FCButton(_("Export DB")) + self.export_db_btn.setToolTip( _("Save the Tools Database to a custom text file.") ) - self.buttons_box.addWidget(export_db_btn) + self.buttons_box.addWidget(self.export_db_btn) - import_db_btn = FCButton(_("Import DB")) - import_db_btn.setToolTip( + self.import_db_btn = FCButton(_("Import DB")) + self.import_db_btn.setToolTip( _("Load the Tools Database information's from a custom text file.") ) - self.buttons_box.addWidget(import_db_btn) + self.buttons_box.addWidget(self.import_db_btn) self.save_db_btn = FCButton(_("Save DB")) self.save_db_btn.setToolTip( @@ -1853,6 +2042,72 @@ class ToolsDB2(QtWidgets.QWidget): hlay.addWidget(self.add_tool_from_db) hlay.addWidget(self.cancel_tool_from_db) # hlay.addStretch() + # ############################ FINSIHED GUI ################################### + # ############################################################################# + + def confirmation_message(self, accepted, minval, maxval): + if accepted is False: + self.app.inform[str, bool].emit('[WARNING_NOTCL] %s: [%.*f, %.*f]' % (_("Edited value is out of range"), + self.decimals, + minval, + self.decimals, + maxval), False) + else: + self.app.inform[str, bool].emit('[success] %s' % _("Edited value is within limits."), False) + + def confirmation_message_int(self, accepted, minval, maxval): + if accepted is False: + self.app.inform[str, bool].emit('[WARNING_NOTCL] %s: [%d, %d]' % + (_("Edited value is out of range"), minval, maxval), False) + else: + self.app.inform[str, bool].emit('[success] %s' % _("Edited value is within limits."), False) + + +class ToolsDB2(QtWidgets.QWidget): + + mark_tools_rows = QtCore.pyqtSignal() + + def __init__(self, app, callback_on_edited, callback_on_tool_request, parent=None): + super(ToolsDB2, self).__init__(parent) + + self.app = app + self.app_ui = self.app.ui + self.decimals = self.app.decimals + self.callback_app = callback_on_edited + + self.on_tool_request = callback_on_tool_request + + self.offset_item_options = ["Path", "In", "Out", "Custom"] + self.type_item_options = ["Iso", "Rough", "Finish"] + self.tool_type_item_options = ["C1", "C2", "C3", "C4", "B", "V"] + + ''' + dict to hold all the tools in the Tools DB + format: + { + tool_id: { + 'name': 'new_tool' + 'tooldia': self.app.defaults["geometry_cnctooldia"] + 'offset': 'Path' + 'offset_value': 0.0 + 'type': _('Rough'), + 'tool_type': 'C1' + 'data': dict() + } + } + ''' + self.db_tool_dict = {} + + # ############################################################################## + # ############################################################################## + # TOOLS DATABASE UI + # ############################################################################## + # ############################################################################## + layout = QtWidgets.QGridLayout() + layout.setColumnStretch(0, 0) + layout.setColumnStretch(1, 1) + self.setLayout(layout) + self.ui = ToolsDB2UI(app=self.app, grid_layout=layout) # ############################################################################## # ############################################################################## @@ -1861,55 +2116,73 @@ class ToolsDB2(QtWidgets.QWidget): # ############################################################################## self.form_fields = { - "object_type": self.object_type_combo, + "object_type": self.ui.object_type_combo, # Basic - "name": self.name_entry, - "tooldia": self.dia_entry, - "tool_type": self.shape_combo, - "cutz": self.cutz_entry, - "multidepth": self.multidepth_cb, - "depthperpass": self.multidepth_entry, - "travelz": self.travelz_entry, - "feedrate": self.frxy_entry, - "feedrate_z": self.frz_entry, - "spindlespeed": self.spindle_entry, - "dwell": self.dwell_cb, - "dwelltime": self.dwelltime_entry, + "name": self.ui.name_entry, + "tooldia": self.ui.dia_entry, + "tool_type": self.ui.shape_combo, + "cutz": self.ui.cutz_entry, + "multidepth": self.ui.multidepth_cb, + "depthperpass": self.ui.multidepth_entry, + "travelz": self.ui.travelz_entry, + "feedrate": self.ui.frxy_entry, + "feedrate_z": self.ui.frz_entry, + "spindlespeed": self.ui.spindle_entry, + "dwell": self.ui.dwell_cb, + "dwelltime": self.ui.dwelltime_entry, # Advanced - "type": self.type_combo, - "offset": self.tooloffset_combo, - "offset_value": self.custom_offset_entry, - "vtipdia": self.vdia_entry, - "vtipangle": self.vangle_entry, - "feedrate_rapid": self.frapids_entry, - "extracut": self.ecut_cb, - "extracut_length": self.ecut_length_entry, + "type": self.ui.type_combo, + "offset": self.ui.tooloffset_combo, + "offset_value": self.ui.custom_offset_entry, + "vtipdia": self.ui.vdia_entry, + "vtipangle": self.ui.vangle_entry, + "feedrate_rapid": self.ui.frapids_entry, + "extracut": self.ui.ecut_cb, + "extracut_length": self.ui.ecut_length_entry, # NCC - "tools_nccoperation": self.op_radio, - "tools_nccmilling_type": self.milling_type_radio, - "tools_nccoverlap": self.ncc_overlap_entry, - "tools_nccmargin": self.ncc_margin_entry, - "tools_nccmethod": self.ncc_method_combo, - "tools_nccconnect": self.ncc_connect_cb, - "tools_ncccontour": self.ncc_contour_cb, - "tools_ncc_offset_choice": self.ncc_choice_offset_cb, - "tools_ncc_offset_value": self.ncc_offset_spinner, + "tools_nccoperation": self.ui.op_radio, + "tools_nccmilling_type": self.ui.milling_type_radio, + "tools_nccoverlap": self.ui.ncc_overlap_entry, + "tools_nccmargin": self.ui.ncc_margin_entry, + "tools_nccmethod": self.ui.ncc_method_combo, + "tools_nccconnect": self.ui.ncc_connect_cb, + "tools_ncccontour": self.ui.ncc_contour_cb, + "tools_ncc_offset_choice": self.ui.ncc_choice_offset_cb, + "tools_ncc_offset_value": self.ui.ncc_offset_spinner, # Paint - "tools_paintoverlap": self.paintoverlap_entry, - "tools_paintoffset": self.paint_offset_entry, - "tools_paintmethod": self.paintmethod_combo, - "tools_pathconnect": self.pathconnect_cb, - "tools_paintcontour": self.paintcontour_cb, + "tools_paintoverlap": self.ui.paintoverlap_entry, + "tools_paintoffset": self.ui.paint_offset_entry, + "tools_paintmethod": self.ui.paintmethod_combo, + "tools_pathconnect": self.ui.pathconnect_cb, + "tools_paintcontour": self.ui.paintcontour_cb, # Isolation - "tools_iso_passes": self.passes_entry, - "tools_iso_overlap": self.iso_overlap_entry, - "tools_iso_milling_type": self.milling_type_radio, - "tools_iso_follow": self.follow_cb, - "tools_iso_isotype": self.iso_type_radio + "tools_iso_passes": self.ui.passes_entry, + "tools_iso_overlap": self.ui.iso_overlap_entry, + "tools_iso_milling_type": self.ui.milling_type_radio, + "tools_iso_follow": self.ui.follow_cb, + "tools_iso_isotype": self.ui.iso_type_radio, + + # Drilling + "tools_drill_cutz": self.ui.cutz_entry, + "tools_drill_multidepth": self.ui.mpass_cb, + "tools_drill_depthperpass": self.ui.maxdepth_entry, + "tools_drill_travelz": self.ui.travelz_entry, + "tools_drill_feedrate_z": self.ui.feedrate_z_entry, + + "tools_drill_feedrate_rapid": self.ui.feedrate_rapid_entry, + "tools_drill_spindlespeed": self.ui.spindlespeed_entry, + "tools_drill_dwell": self.ui.dwell_cb, + "tools_drill_dwelltime": self.ui.dwelltime_entry, + + "tools_drill_offset": self.ui.offset_entry, + "tools_drill_drill_slots": self.ui.drill_slots_cb, + "tools_drill_drill_overlap": self.ui.drill_overlap_entry, + "tools_drill_last_drill": self.ui.last_drill_cb, + } self.name2option = { @@ -1962,7 +2235,25 @@ class ToolsDB2(QtWidgets.QWidget): "gdb_i_overlap": "tools_iso_overlap", "gdb_i_milling_type": "tools_iso_milling_type", "gdb_i_follow": "tools_iso_follow", - "gdb_i_iso_type": "tools_iso_isotype" + "gdb_i_iso_type": "tools_iso_isotype", + + # Drilling + "gdb_e_cutz": "tools_drill_cutz", + "gdb_e_multidepth": "tools_drill_multidepth", + "gdb_e_depthperpass": "tools_drill_depthperpass", + "gdb_e_travelz": "tools_drill_travelz", + + "gdb_e_feedratez": "tools_drill_feedrate_z", + "gdb_e_fr_rapid": "tools_drill_feedrate_rapid", + "gdb_e_spindlespeed": "tools_drill_spindlespeed", + "gdb_e_dwell": "tools_drill_dwell", + "gdb_e_dwelltime": "tools_drill_dwelltime", + + "gdb_e_offset": "tools_drill_offset", + "gdb_e_drill_slots": "tools_drill_drill_slots", + "gdb_e_drill_slots_over": "tools_drill_drill_overlap", + "gdb_e_drill_last_drill": "tools_drill_last_drill", + } self.current_toolid = None @@ -1974,24 +2265,24 @@ class ToolsDB2(QtWidgets.QWidget): # ######################## SIGNALS ############################################# # ############################################################################## - add_entry_btn.clicked.connect(self.on_tool_add) - remove_entry_btn.clicked.connect(self.on_tool_delete) - export_db_btn.clicked.connect(self.on_export_tools_db_file) - import_db_btn.clicked.connect(self.on_import_tools_db_file) - self.save_db_btn.clicked.connect(self.on_save_db_btn_click) + self.ui.add_entry_btn.clicked.connect(self.on_tool_add) + self.ui.remove_entry_btn.clicked.connect(self.on_tool_delete) + self.ui.export_db_btn.clicked.connect(self.on_export_tools_db_file) + self.ui.import_db_btn.clicked.connect(self.on_import_tools_db_file) + self.ui.save_db_btn.clicked.connect(self.on_save_db_btn_click) # closebtn.clicked.connect(self.accept) - self.add_tool_from_db.clicked.connect(self.on_tool_requested_from_app) - self.cancel_tool_from_db.clicked.connect(self.on_cancel_tool) + self.ui.add_tool_from_db.clicked.connect(self.on_tool_requested_from_app) + self.ui.cancel_tool_from_db.clicked.connect(self.on_cancel_tool) - # 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.ui.tree_widget.selectionModel().selectionChanged.connect(self.on_list_selection_change) + self.ui.tree_widget.currentItemChanged.connect(self.on_list_selection_change) + self.ui.tree_widget.itemChanged.connect(self.on_list_item_edited) + self.ui.tree_widget.customContextMenuRequested.connect(self.on_menu_request) - self.tree_widget.itemDoubleClicked.connect(self.on_item_double_clicked) + self.ui.tree_widget.itemDoubleClicked.connect(self.on_item_double_clicked) - self.object_type_combo.currentIndexChanged.connect(self.on_object_type_changed) + self.ui.object_type_combo.currentIndexChanged.connect(self.on_object_type_changed) self.setup_db_ui() @@ -2012,11 +2303,11 @@ class ToolsDB2(QtWidgets.QWidget): save_changes = menu.addAction(QtGui.QIcon(self.app.resource_location + '/save_as.png'), _("Save changes")) save_changes.triggered.connect(self.on_save_changes) - # tree_item = self.tree_widget.itemAt(pos) - menu.exec(self.tree_widget.viewport().mapToGlobal(pos)) + # tree_item = self.ui.tree_widget.itemAt(pos) + menu.exec(self.ui.tree_widget.viewport().mapToGlobal(pos)) def on_save_changes(self): - widget_name = self.app.ui.plot_tab_area.currentWidget().objectName() + widget_name = self.app_ui.plot_tab_area.currentWidget().objectName() if widget_name == 'database_tab': # Tools DB saved, update flag self.app.tools_db_changed_flag = False @@ -2035,7 +2326,7 @@ class ToolsDB2(QtWidgets.QWidget): if column == 0: return - self.name_entry.set_value(item.text(1)) + self.ui.name_entry.set_value(item.text(1)) def storage_to_form(self, dict_storage): for form_key in self.form_fields: @@ -2098,10 +2389,10 @@ class ToolsDB2(QtWidgets.QWidget): self.ui_disconnect() nr_crt = 0 - parent = self.tree_widget - self.tree_widget.blockSignals(True) - self.tree_widget.clear() - self.tree_widget.blockSignals(False) + parent = self.ui.tree_widget + self.ui.tree_widget.blockSignals(True) + self.ui.tree_widget.clear() + self.ui.tree_widget.blockSignals(False) for toolid, dict_val in self.db_tool_dict.items(): row = nr_crt @@ -2110,12 +2401,12 @@ class ToolsDB2(QtWidgets.QWidget): t_name = dict_val['name'] try: # self.add_tool_table_line(row, name=t_name, tooldict=dict_val) - self.tree_widget.blockSignals(True) + self.ui.tree_widget.blockSignals(True) try: - self.tree_widget.addParentEditable(parent=parent, title=[str(row+1), t_name], editable=True) + self.ui.tree_widget.addParentEditable(parent=parent, title=[str(row+1), t_name], editable=True) except Exception as e: print('FlatCAMCoomn.ToolDB2.build_db_ui() -> ', str(e)) - self.tree_widget.blockSignals(False) + self.ui.tree_widget.blockSignals(False) except Exception as e: self.app.log.debug("ToolDB.build_db_ui.add_tool_table_line() --> %s" % str(e)) @@ -2124,24 +2415,26 @@ class ToolsDB2(QtWidgets.QWidget): self.storage_to_form(self.db_tool_dict['1']) # Enable appGUI - self.tool_description_box.setEnabled(True) - self.basic_box.setEnabled(True) - self.advanced_box.setEnabled(True) - self.ncc_box.setEnabled(True) - self.paint_box.setEnabled(True) - self.iso_box.setEnabled(True) + self.ui.tool_description_box.setEnabled(True) + self.ui.basic_box.setEnabled(True) + self.ui.advanced_box.setEnabled(True) + self.ui.ncc_box.setEnabled(True) + self.ui.paint_box.setEnabled(True) + self.ui.iso_box.setEnabled(True) + self.ui.drill_box.setEnabled(True) - self.tree_widget.setCurrentItem(self.tree_widget.topLevelItem(0)) - # self.tree_widget.setFocus() + self.ui.tree_widget.setCurrentItem(self.ui.tree_widget.topLevelItem(0)) + # self.ui.tree_widget.setFocus() else: # Disable appGUI - self.tool_description_box.setEnabled(False) - self.basic_box.setEnabled(False) - self.advanced_box.setEnabled(False) - self.ncc_box.setEnabled(False) - self.paint_box.setEnabled(False) - self.iso_box.setEnabled(False) + self.ui.tool_description_box.setEnabled(False) + self.ui.basic_box.setEnabled(False) + self.ui.advanced_box.setEnabled(False) + self.ui.ncc_box.setEnabled(False) + self.ui.paint_box.setEnabled(False) + self.ui.iso_box.setEnabled(False) + self.ui.drill_box.setEnabled(False) else: self.storage_to_form(self.db_tool_dict[str(self.current_toolid)]) @@ -2150,32 +2443,35 @@ class ToolsDB2(QtWidgets.QWidget): def on_object_type_changed(self, index=None, val=None): if val is None: - object_type = self.object_type_combo.get_value() + object_type = self.ui.object_type_combo.get_value() else: object_type = val + self.ui.tool_description_box.setEnabled(True) if self.db_tool_dict: - if object_type == _("Application Tool"): - self.tool_description_box.setEnabled(True) - self.basic_box.setEnabled(True) - self.advanced_box.setEnabled(True) - self.ncc_box.setEnabled(True) - self.paint_box.setEnabled(True) - self.iso_box.setEnabled(True) - elif object_type == _("Geometry"): - self.tool_description_box.setEnabled(True) - self.basic_box.setEnabled(True) - self.advanced_box.setEnabled(True) - self.ncc_box.setEnabled(False) - self.paint_box.setEnabled(False) - self.iso_box.setEnabled(False) - else: - self.tool_description_box.setEnabled(True) - self.basic_box.setEnabled(True) - self.advanced_box.setEnabled(True) - self.ncc_box.setEnabled(False) - self.paint_box.setEnabled(False) - self.iso_box.setEnabled(False) + if object_type == _("General"): + self.ui.basic_box.setEnabled(True) + self.ui.advanced_box.setEnabled(True) + self.ui.ncc_box.setEnabled(True) + self.ui.paint_box.setEnabled(True) + self.ui.iso_box.setEnabled(True) + self.ui.drill_box.setEnabled(True) + + if object_type == _("Milling"): + self.ui.basic_box.setEnabled(True) + self.ui.advanced_box.setEnabled(True) + self.ui.ncc_box.setEnabled(False) + self.ui.paint_box.setEnabled(False) + self.ui.iso_box.setEnabled(False) + self.ui.drill_box.setEnabled(False) + + if object_type == _("Drilling"): + self.ui.basic_box.setEnabled(False) + self.ui.advanced_box.setEnabled(False) + self.ui.ncc_box.setEnabled(False) + self.ui.paint_box.setEnabled(False) + self.ui.iso_box.setEnabled(False) + self.ui.drill_box.setEnabled(True) def on_tool_add(self): """ @@ -2207,7 +2503,7 @@ class ToolsDB2(QtWidgets.QWidget): "startz": self.app.defaults["geometry_startz"], "endz": float(self.app.defaults["geometry_endz"]), - "object_type": _("Application Tool"), + "object_type": _("General"), # NCC "tools_nccoperation": self.app.defaults["tools_nccoperation"], @@ -2233,6 +2529,23 @@ class ToolsDB2(QtWidgets.QWidget): "tools_iso_milling_type": self.app.defaults["tools_iso_milling_type"], "tools_iso_follow": self.app.defaults["tools_iso_follow"], "tools_iso_isotype": self.app.defaults["tools_iso_isotype"], + + # Drilling + "tools_drill_cutz": float(self.app.defaults["tools_drill_cutz"]), + "tools_drill_multidepth": self.app.defaults["tools_drill_multidepth"], + "tools_drill_depthperpass": float(self.app.defaults["tools_drill_depthperpass"]), + "tools_drill_travelz": float(self.app.defaults["tools_drill_travelz"]), + + "tools_drill_feedrate_z": float(self.app.defaults["tools_drill_feedrate_z"]), + "tools_drill_feedrate_rapid": float(self.app.defaults["tools_drill_feedrate_rapid"]), + "tools_drill_spindlespeed": float(self.app.defaults["tools_drill_spindlespeed"]), + "tools_drill_dwell": self.app.defaults["tools_drill_dwell"], + + "tools_drill_offset": float(self.app.defaults["tools_drill_offset"]), + "tools_drill_drill_slots": self.app.defaults["tools_drill_drill_slots"], + "tools_drill_drill_overlap": float(self.app.defaults["tools_drill_drill_overlap"]), + "tools_drill_last_drill": self.app.defaults["tools_drill_last_drill"], + }) temp = [] @@ -2272,10 +2585,10 @@ class ToolsDB2(QtWidgets.QWidget): self.build_db_ui() # select the last Tree item just added - nr_items = self.tree_widget.topLevelItemCount() + nr_items = self.ui.tree_widget.topLevelItemCount() if nr_items: - last_item = self.tree_widget.topLevelItem(nr_items - 1) - self.tree_widget.setCurrentItem(last_item) + last_item = self.ui.tree_widget.topLevelItem(nr_items - 1) + self.ui.tree_widget.setCurrentItem(last_item) last_item.setSelected(True) self.on_object_type_changed(val=dict_elem['data']['object_type']) @@ -2287,7 +2600,7 @@ class ToolsDB2(QtWidgets.QWidget): :return: """ new_tool_id = len(self.db_tool_dict) - for item in self.tree_widget.selectedItems(): + for item in self.ui.tree_widget.selectedItems(): old_tool_id = item.data(0, QtCore.Qt.DisplayRole) for toolid, dict_val in list(self.db_tool_dict.items()): @@ -2305,10 +2618,10 @@ class ToolsDB2(QtWidgets.QWidget): self.build_db_ui() # select the last Tree item just added - nr_items = self.tree_widget.topLevelItemCount() + nr_items = self.ui.tree_widget.topLevelItemCount() if nr_items: - last_item = self.tree_widget.topLevelItem(nr_items - 1) - self.tree_widget.setCurrentItem(last_item) + last_item = self.ui.tree_widget.topLevelItem(nr_items - 1) + self.ui.tree_widget.setCurrentItem(last_item) last_item.setSelected(True) self.callback_app() @@ -2319,7 +2632,7 @@ class ToolsDB2(QtWidgets.QWidget): Delete a selection of Tools in the Tools DB table :return: """ - for item in self.tree_widget.selectedItems(): + for item in self.ui.tree_widget.selectedItems(): toolname_to_remove = item.data(0, QtCore.Qt.DisplayRole) for toolid, dict_val in list(self.db_tool_dict.items()): @@ -2333,10 +2646,10 @@ class ToolsDB2(QtWidgets.QWidget): self.build_db_ui() # select the first Tree item - nr_items = self.tree_widget.topLevelItemCount() + nr_items = self.ui.tree_widget.topLevelItemCount() if nr_items: - first_item = self.tree_widget.topLevelItem(0) - self.tree_widget.setCurrentItem(first_item) + first_item = self.ui.tree_widget.topLevelItem(0) + self.ui.tree_widget.setCurrentItem(first_item) first_item.setSelected(True) self.app.inform.emit('[success] %s' % _("Tool removed from Tools DB.")) @@ -2434,9 +2747,9 @@ class ToolsDB2(QtWidgets.QWidget): filename = self.app.data_path + "/geo_tools_db.FlatDB" # Preferences save, update the color of the Tools DB Tab text - for idx in range(self.app.ui.plot_tab_area.count()): - if self.app.ui.plot_tab_area.tabText(idx) == _("Tools Database"): - self.app.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black')) + for idx in range(self.app_ui.plot_tab_area.count()): + if self.app_ui.plot_tab_area.tabText(idx) == _("Tools Database"): + self.app_ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('black')) self.save_db_btn.setStyleSheet("") # Save Tools DB in a file @@ -2457,22 +2770,22 @@ class ToolsDB2(QtWidgets.QWidget): self.on_save_tools_db() def on_calculate_tooldia(self): - if self.shape_combo.get_value() == 'V': - tip_dia = float(self.vdia_entry.get_value()) - half_tip_angle = float(self.vangle_entry.get_value()) / 2.0 - cut_z = float(self.cutz_entry.get_value()) + if self.ui.shape_combo.get_value() == 'V': + tip_dia = float(self.ui.vdia_entry.get_value()) + half_tip_angle = float(self.ui.vangle_entry.get_value()) / 2.0 + cut_z = float(self.ui.cutz_entry.get_value()) cut_z = -cut_z if cut_z < 0 else cut_z # calculated tool diameter so the cut_z parameter is obeyed tool_dia = tip_dia + (2 * cut_z * math.tan(math.radians(half_tip_angle))) - self.dia_entry.set_value(tool_dia) + self.ui.dia_entry.set_value(tool_dia) def ui_connect(self): # make sure that we don't make multiple connections to the widgets self.ui_disconnect() - self.name_entry.editingFinished.connect(self.update_tree_name) + self.ui.name_entry.editingFinished.connect(self.update_tree_name) for key in self.form_fields: wdg = self.form_fields[key] @@ -2499,34 +2812,34 @@ class ToolsDB2(QtWidgets.QWidget): # connect the calculate tooldia method to the controls # if the tool shape is 'V' the tool dia will be calculated to obey Cut Z parameter - self.shape_combo.currentIndexChanged.connect(self.on_calculate_tooldia) - self.cutz_entry.valueChanged.connect(self.on_calculate_tooldia) - self.vdia_entry.valueChanged.connect(self.on_calculate_tooldia) - self.vangle_entry.valueChanged.connect(self.on_calculate_tooldia) + self.ui.shape_combo.currentIndexChanged.connect(self.on_calculate_tooldia) + self.ui.cutz_entry.valueChanged.connect(self.on_calculate_tooldia) + self.ui.vdia_entry.valueChanged.connect(self.on_calculate_tooldia) + self.ui.vangle_entry.valueChanged.connect(self.on_calculate_tooldia) def ui_disconnect(self): try: - self.name_entry.editingFinished.disconnect(self.update_tree_name) + self.ui.name_entry.editingFinished.disconnect(self.update_tree_name) except (TypeError, AttributeError): pass try: - self.shape_combo.currentIndexChanged.disconnect(self.on_calculate_tooldia) + self.ui.shape_combo.currentIndexChanged.disconnect(self.on_calculate_tooldia) except (TypeError, AttributeError): pass try: - self.cutz_entry.valueChanged.disconnect(self.on_calculate_tooldia) + self.ui.cutz_entry.valueChanged.disconnect(self.on_calculate_tooldia) except (TypeError, AttributeError): pass try: - self.vdia_entry.valueChanged.disconnect(self.on_calculate_tooldia) + self.ui.vdia_entry.valueChanged.disconnect(self.on_calculate_tooldia) except (TypeError, AttributeError): pass try: - self.vangle_entry.valueChanged.disconnect(self.on_calculate_tooldia) + self.ui.vangle_entry.valueChanged.disconnect(self.on_calculate_tooldia) except (TypeError, AttributeError): pass @@ -2569,9 +2882,9 @@ class ToolsDB2(QtWidgets.QWidget): pass def update_tree_name(self): - val = self.name_entry.get_value() + val = self.ui.name_entry.get_value() - item = self.tree_widget.currentItem() + item = self.ui.tree_widget.currentItem() if item is None: return # I'm setting the value for the second column (designated by 1) because first column holds the ID @@ -2692,11 +3005,11 @@ class ToolsDB2(QtWidgets.QWidget): self.callback_app() def on_tool_requested_from_app(self): - if not self.tree_widget.selectedItems(): + if not self.ui.tree_widget.selectedItems(): self.app.inform.emit('[WARNING_NOTCL] %s...' % _("No Tool/row selected in the Tools Database table")) return - for item in self.tree_widget.selectedItems(): + for item in self.ui.tree_widget.selectedItems(): tool_uid = item.data(0, QtCore.Qt.DisplayRole) for key in self.db_tool_dict.keys(): @@ -2705,11 +3018,11 @@ class ToolsDB2(QtWidgets.QWidget): self.on_tool_request(tool=selected_tool) def on_cancel_tool(self): - for idx in range(self.app.ui.plot_tab_area.count()): - if self.app.ui.plot_tab_area.tabText(idx) == _("Tools Database"): - wdg = self.app.ui.plot_tab_area.widget(idx) + for idx in range(self.app_ui.plot_tab_area.count()): + if self.app_ui.plot_tab_area.tabText(idx) == _("Tools Database"): + wdg = self.app_ui.plot_tab_area.widget(idx) wdg.deleteLater() - self.app.ui.plot_tab_area.removeTab(idx) + self.app_ui.plot_tab_area.removeTab(idx) self.app.inform.emit('%s' % _("Cancelled adding tool from DB.")) # def resize_new_tool_table_widget(self, min_size, max_size): diff --git a/appObjects/AppObject.py b/appObjects/AppObject.py index aa039f26..1358812a 100644 --- a/appObjects/AppObject.py +++ b/appObjects/AppObject.py @@ -67,18 +67,19 @@ class AppObject(QtCore.QObject): when appending it to the collection. There is no need to handle name conflicts here. - :param kind: The kind of object to create. One of 'gerber', 'excellon', 'cncjob' and 'geometry'. - :type kind: str - :param name: Name for the object. - :type name: str - :param initialize: Function to run after creation of the object but before it is attached to the application. - The function is called with 2 parameters: the new object and the App instance. - :type initialize: function - :param plot: If to plot the resulting object - :param autoselected: if the resulting object is autoselected in the Project tab and therefore in the - self.collection - :return: None - :rtype: None + :param kind: The kind of object to create. One of 'gerber', 'excellon', 'cncjob' and 'geometry'. + :type kind: str + :param name: Name for the object. + :type name: str + :param initialize: Function to run after creation of the object but before it is attached to the + application. + The function is called with 2 parameters: the new object and the App instance. + :type initialize: function + :param plot: If to plot the resulting object + :param autoselected: if the resulting object is autoselected in the Project tab and therefore in the + self.collection + :return: Either the object or the string 'fail' + :rtype: object """ log.debug("AppObject.new_object()") @@ -102,7 +103,12 @@ class AppObject(QtCore.QObject): # Object creation/instantiation obj = classdict[kind](name) + # ############################################################################################################ + # adding object PROPERTIES + # ############################################################################################################ obj.units = self.app.options["units"] + obj.isHovering = False + obj.notHovering = True # IMPORTANT # The key names in defaults and options dictionary's are not random: @@ -113,13 +119,29 @@ class AppObject(QtCore.QObject): # let's say "excellon_toolchange", it will strip the excellon_) and to the obj.options the key will become # "toolchange" + # ############################################################################################################ + # this section copies the application defaults related to the object to the object OPTIONS + # ############################################################################################################ for option in self.app.options: if option.find(kind + "_") == 0: oname = option[len(kind) + 1:] obj.options[oname] = self.app.options[option] - obj.isHovering = False - obj.notHovering = True + # add some of the FlatCAM Tools related properties + if kind == 'excellon': + for option in self.app.options: + if option.find('tools_drill_') == 0 or option.find('tools_mill_') == 0: + obj.options[option] = self.app.options[option] + if kind == 'gerber': + for option in self.app.options: + if option.find('tools_iso_') == 0: + obj.options[option] = self.app.options[option] + if kind == 'geometry': + for option in self.app.options: + if option.find('tools_mill_') == 0: + obj.options[option] = self.app.options[option] + # ############################################################################################################ + # ############################################################################################################ # Initialize as per user request # User must take care to implement initialize @@ -127,6 +149,7 @@ class AppObject(QtCore.QObject): # have been invoked in a separate thread. t1 = time.time() log.debug("%f seconds before initialize()." % (t1 - t0)) + try: return_value = initialize(obj, self.app) except Exception as e: @@ -145,16 +168,20 @@ class AppObject(QtCore.QObject): log.debug("Object (%s) parsing and/or geometry creation failed." % kind) return "fail" + # ############################################################################################################ # Check units and convert if necessary # This condition CAN be true because initialize() can change obj.units + # ############################################################################################################ if self.app.options["units"].upper() != obj.units.upper(): self.app.inform.emit('%s: %s' % (_("Converting units to "), self.app.options["units"])) obj.convert_units(self.app.options["units"]) t3 = time.time() log.debug("%f seconds converting units." % (t3 - t2)) + # ############################################################################################################ # Create the bounding box for the object and then add the results to the obj.options # But not for Scripts or for Documents + # ############################################################################################################ if kind != 'document' and kind != 'script': try: xmin, ymin, xmax, ymax = obj.bounds() @@ -177,12 +204,16 @@ class AppObject(QtCore.QObject): except Exception as e: log.warning("AppObject.new_object() -> setting colors error. %s" % str(e)) + # ############################################################################################################ # update the KeyWords list with the name of the file + # ############################################################################################################ self.app.myKeywords.append(obj.options['name']) log.debug("Moving new object back to main thread.") + # ############################################################################################################ # Move the object to the main thread and let the app know that it is available. + # ############################################################################################################ obj.moveToThread(self.app.main_thread) self.object_created.emit(obj, obj_plot, obj_autoselected) diff --git a/appObjects/FlatCAMGeometry.py b/appObjects/FlatCAMGeometry.py index 2d5b089a..8f68d100 100644 --- a/appObjects/FlatCAMGeometry.py +++ b/appObjects/FlatCAMGeometry.py @@ -1032,9 +1032,9 @@ class GeometryObject(FlatCAMObj, Geometry): break self.app.on_tools_database() self.app.tools_db_tab.ok_to_add = True - self.app.tools_db_tab.buttons_frame.hide() - self.app.tools_db_tab.add_tool_from_db.show() - self.app.tools_db_tab.cancel_tool_from_db.show() + self.app.tools_db_tab.ui.buttons_frame.hide() + self.app.tools_db_tab.ui.add_tool_from_db.show() + self.app.tools_db_tab.ui.cancel_tool_from_db.show() def on_tool_from_db_inserted(self, tool): """ diff --git a/appTools/ToolIsolation.py b/appTools/ToolIsolation.py index 55ff5f64..5a845b2b 100644 --- a/appTools/ToolIsolation.py +++ b/appTools/ToolIsolation.py @@ -2440,9 +2440,9 @@ class ToolIsolation(AppTool, Gerber): break self.app.on_tools_database(source='iso') self.app.tools_db_tab.ok_to_add = True - self.app.tools_db_tab.buttons_frame.hide() - self.app.tools_db_tab.add_tool_from_db.show() - self.app.tools_db_tab.cancel_tool_from_db.show() + self.app.tools_db_tab.ui.buttons_frame.hide() + self.app.tools_db_tab.ui.add_tool_from_db.show() + self.app.tools_db_tab.ui.cancel_tool_from_db.show() def reset_fields(self): self.object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) diff --git a/appTools/ToolNCC.py b/appTools/ToolNCC.py index 5ed875c4..a65b7b08 100644 --- a/appTools/ToolNCC.py +++ b/appTools/ToolNCC.py @@ -3577,9 +3577,9 @@ class NonCopperClear(AppTool, Gerber): break self.app.on_tools_database(source='ncc') self.app.tools_db_tab.ok_to_add = True - self.app.tools_db_tab.buttons_frame.hide() - self.app.tools_db_tab.add_tool_from_db.show() - self.app.tools_db_tab.cancel_tool_from_db.show() + self.app.tools_db_tab.ui.buttons_frame.hide() + self.app.tools_db_tab.ui.add_tool_from_db.show() + self.app.tools_db_tab.ui.cancel_tool_from_db.show() def reset_fields(self): self.object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) diff --git a/appTools/ToolPaint.py b/appTools/ToolPaint.py index ff0c81c5..5ab6a045 100644 --- a/appTools/ToolPaint.py +++ b/appTools/ToolPaint.py @@ -2706,9 +2706,9 @@ class ToolPaint(AppTool, Gerber): break self.app.on_tools_database(source='paint') self.app.tools_db_tab.ok_to_add = True - self.app.tools_db_tab.buttons_frame.hide() - self.app.tools_db_tab.add_tool_from_db.show() - self.app.tools_db_tab.cancel_tool_from_db.show() + self.app.tools_db_tab.ui.buttons_frame.hide() + self.app.tools_db_tab.ui.add_tool_from_db.show() + self.app.tools_db_tab.ui.cancel_tool_from_db.show() def reset_fields(self): self.ui.obj_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex())) diff --git a/app_Main.py b/app_Main.py index 9c191f20..8b4d1333 100644 --- a/app_Main.py +++ b/app_Main.py @@ -5643,7 +5643,7 @@ class App(QtCore.QObject): for idx in range(self.ui.plot_tab_area.count()): if self.ui.plot_tab_area.tabText(idx) == _("Tools Database"): self.ui.plot_tab_area.tabBar.setTabTextColor(idx, QtGui.QColor('red')) - self.tools_db_tab.save_db_btn.setStyleSheet("QPushButton {color: red;}") + self.tools_db_tab.ui.save_db_btn.setStyleSheet("QPushButton {color: red;}") self.tools_db_changed_flag = True