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