From 4709b336f5d40835f6ec11025d4f9d618768fa32 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 30 Apr 2022 17:46:48 +0300 Subject: [PATCH] - in Excellon Editor, finished the upgrade work on the Resize Plugin --- CHANGELOG.md | 5 +- appEditors/AppExcEditor.py | 216 ++++++++++++++-------- appEditors/exc_plugins/ExcResizePlugin.py | 173 +++++++++++++++++ appEditors/exc_plugins/ExcScalePlugin.py | 0 appGUI/MainGUI.py | 22 +-- 5 files changed, 322 insertions(+), 94 deletions(-) create mode 100644 appEditors/exc_plugins/ExcResizePlugin.py delete mode 100644 appEditors/exc_plugins/ExcScalePlugin.py diff --git a/CHANGELOG.md b/CHANGELOG.md index 6443390c..b5afc68c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,8 +12,9 @@ CHANGELOG for FlatCAM Evo beta - in Excellon Editor, Slot Plugin, made sure that once the Editor is active any change for this plugin parameters will be kept until editor is exit or that parameter is changed again - in Excellon Editor, Drill Array Plugin, upgraded the UI and work in progress for the features - prettified some GUI elements (some of those that are used in the popup messages) -- in Excellon Editor, finished th upgrade work on the Drill Array Plugin -- in Excellon Editor, finished th upgrade work on the Slot Array Plugin +- in Excellon Editor, finished the upgrade work on the Drill Array Plugin +- in Excellon Editor, finished the upgrade work on the Slot Array Plugin +- in Excellon Editor, finished the upgrade work on the Resize Plugin 29.04.2022 diff --git a/appEditors/AppExcEditor.py b/appEditors/AppExcEditor.py index be614548..d998884b 100644 --- a/appEditors/AppExcEditor.py +++ b/appEditors/AppExcEditor.py @@ -11,8 +11,9 @@ from appEditors.exc_plugins.ExcDrillPlugin import * from appEditors.exc_plugins.ExcSlotPlugin import ExcSlotEditorTool from appEditors.exc_plugins.ExcDrillArrayPlugin import ExcDrillArrayEditorTool from appEditors.exc_plugins.ExcSlotArrayPlugin import ExcSlotArrayEditorTool +from appEditors.exc_plugins.ExcResizePlugin import ExcResizeEditorTool -from appGUI.GUIElements import FCEntry, FCTable, FCDoubleSpinner, RadioSet, FCSpinner, FCButton, FCLabel, GLay +from appGUI.GUIElements import FCEntry, FCTable, FCDoubleSpinner, FCButton, FCLabel, GLay from appEditors.AppGeoEditor import FCShapeTool, DrawTool, DrawToolShape, DrawToolUtilityShape, AppGeoEditor from shapely.geometry import LineString, LinearRing, MultiLineString, Polygon, MultiPolygon, Point @@ -59,8 +60,6 @@ class SelectEditorExc(FCShapeTool): # here we store all shapes that were selected so we can search for the nearest to our click location self.sel_storage = AppExcEditor.make_storage() - self.draw_app.ui.resize_frame.hide() - # make sure that the cursor text from the DrillAdd is deleted if self.draw_app.app.plotcanvas.text_cursor.parent and self.draw_app.app.use_3d_engine: self.draw_app.app.plotcanvas.text_cursor.parent = None @@ -1893,10 +1892,10 @@ class ResizeEditorExc(FCShapeTool): def __init__(self, draw_app): DrawTool.__init__(self, draw_app) self.name = 'drill_resize' + self.draw_app = draw_app + self.app = self.draw_app.app - self.draw_app.app.inform.emit(_("Click on the Drill(s) to resize ...")) self.resize_dia = None - self.draw_app.ui.resize_frame.show() self.points = None # made this a set so there are no duplicates @@ -1906,11 +1905,53 @@ class ResizeEditorExc(FCShapeTool): self.geometry = [] self.destination_storage = None - self.draw_app.ui.resize_btn.clicked.connect(self.make) - self.draw_app.ui.resdrill_entry.editingFinished.connect(self.make) + try: + QtGui.QGuiApplication.restoreOverrideCursor() + except Exception: + pass + # ############################################################################################################# + # Plugin UI + # ############################################################################################################# + self.resize_tool = ExcResizeEditorTool(self.app, self.draw_app, plugin_name=_("Resize")) + self.ui = self.resize_tool.ui + self.resize_tool.run() - # Switch notebook to Properties page - self.draw_app.app.ui.notebook.setCurrentWidget(self.draw_app.app.ui.properties_tab) + if self.app.use_3d_engine: + self.draw_app.app.plotcanvas.view.camera.zoom_callback = self.draw_cursor_data + self.draw_app.app.jump_signal.connect(lambda x: self.draw_app.update_utility_geometry(data=x)) + + if not self.draw_app.snap_x: + self.draw_app.snap_x = 0.0 + if not self.draw_app.snap_y: + self.draw_app.snap_y = 0.0 + + self.app.ui.notebook.setTabText(2, _("Resize")) + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + + self.set_plugin_ui() + + # Signals + try: + self.ui.resize_btn.clicked.disconnect() + except (AttributeError, TypeError): + pass + try: + self.ui.res_dia_entry.editingFinished.disconnect() + except (AttributeError, TypeError): + pass + self.ui.resize_btn.clicked.connect(self.on_resize) + self.ui.res_dia_entry.editingFinished.connect(self.on_resize) + + self.draw_app.app.inform.emit(_("Click on the Drill(s) to resize ...")) + + def set_plugin_ui(self): + curr_row = self.draw_app.ui.tools_table_exc.currentRow() + tool_dia = float(self.draw_app.ui.tools_table_exc.item(curr_row, 1).text()) + self.ui.dia_entry.set_value(tool_dia) + + def utility_geometry(self, data=None): + return DrawToolUtilityShape([]) def make(self): self.draw_app.is_modified = True @@ -1920,9 +1961,8 @@ class ResizeEditorExc(FCShapeTool): except TypeError: pass - try: - new_dia = self.draw_app.ui.resdrill_entry.get_value() - except Exception: + new_dia = self.ui.res_dia_entry.get_value() + if new_dia == 0.0: self.draw_app.app.inform.emit('[ERROR_NOTCL] %s' % _("Resize drill(s) failed. Please enter a diameter for resize.")) return @@ -2101,22 +2141,79 @@ class ResizeEditorExc(FCShapeTool): self.draw_app.app.inform.emit('[success] %s' % _("Done.")) else: - self.draw_app.app.inform.emit('[WARNING_NOTCL] %s' % _("Cancelled. Nothing selected.")) + self.draw_app.app.inform.emit('[WARNING_NOTCL] %s %s' % (_("Cancelled."), _("Nothing selected"))) # init this set() for another use perhaps self.selected_dia_set = set() - self.draw_app.ui.resize_frame.hide() self.complete = True # MS: always return to the Select Tool self.draw_app.select_tool("drill_select") + def on_resize(self): + self.make() + self.clean_up() + + def draw_cursor_data(self, pos=None, delete=False): + if pos is None: + pos = self.draw_app.snap_x, self.draw_app.snap_y + + if delete: + if self.draw_app.app.use_3d_engine: + self.draw_app.app.plotcanvas.text_cursor.parent = None + self.draw_app.app.plotcanvas.view.camera.zoom_callback = lambda *args: None + return + + if not self.points: + self.points = self.draw_app.snap_x, self.draw_app.snap_y + + # font size + qsettings = QtCore.QSettings("Open Source", "FlatCAM") + if qsettings.contains("hud_font_size"): + fsize = qsettings.value('hud_font_size', type=int) + else: + fsize = 8 + + x = pos[0] + y = pos[1] + try: + length = abs(np.sqrt((x - self.points[0]) ** 2 + (y - self.points[1]) ** 2)) + except IndexError: + length = self.draw_app.app.dec_format(0.0, self.draw_app.app.decimals) + + x_dec = str(self.draw_app.app.dec_format(x, self.draw_app.app.decimals)) if x else '0.0' + y_dec = str(self.draw_app.app.dec_format(y, self.draw_app.app.decimals)) if y else '0.0' + length_dec = str(self.draw_app.app.dec_format(length, self.draw_app.app.decimals)) if length else '0.0' + + units = self.draw_app.app.app_units.lower() + l1_txt = 'X: %s [%s]' % (x_dec, units) + l2_txt = 'Y: %s [%s]' % (y_dec, units) + l3_txt = 'L: %s [%s]' % (length_dec, units) + cursor_text = '%s\n%s\n\n%s' % (l1_txt, l2_txt, l3_txt) + + if self.draw_app.app.use_3d_engine: + new_pos = self.draw_app.app.plotcanvas.translate_coords_2((x, y)) + x, y, __, ___ = self.draw_app.app.plotcanvas.translate_coords((new_pos[0]+30, new_pos[1])) + + # text + self.draw_app.app.plotcanvas.text_cursor.font_size = fsize + self.draw_app.app.plotcanvas.text_cursor.text = cursor_text + self.draw_app.app.plotcanvas.text_cursor.pos = x, y + self.draw_app.app.plotcanvas.text_cursor.anchors = 'left', 'top' + + if self.draw_app.app.plotcanvas.text_cursor.parent is None: + self.draw_app.app.plotcanvas.text_cursor.parent = self.draw_app.app.plotcanvas.view.scene + def clean_up(self): self.draw_app.selected = [] self.draw_app.ui.tools_table_exc.clearSelection() self.draw_app.plot_all() + if self.draw_app.app.use_3d_engine: + self.draw_app.app.plotcanvas.text_cursor.parent = None + self.draw_app.app.plotcanvas.view.camera.zoom_callback = lambda *args: None + try: self.draw_app.app.jump_signal.disconnect() except (TypeError, AttributeError): @@ -2442,9 +2539,19 @@ class AppExcEditor(QtCore.QObject): self.last_darray_circ_angle = None self.last_darray_radius = None + self.last_sarray_radius = None + self.last_sarray_circ_angle = None + self.last_sarray_lin_angle = None + self.last_sarray_pitch = None + self.last_sarray_circ_dir = None + self.last_sarray_lin_dir = None + self.last_sarray_size = None + self.last_sarray_type = None + self.last_slot_length = None self.last_slot_direction = None self.last_slot_angle = None + self.complete = False self.editor_options = { @@ -4070,7 +4177,7 @@ class AppExcEditor(QtCore.QObject): self.update_utility_geometry(data=(x, y)) self.update_utility_geometry(data=(x, y)) - if self.active_tool.name in ['drill_add', 'drill_array', 'slot_add', 'slot_array', 'copy']: + if self.active_tool.name in ['drill_add', 'drill_array', 'slot_add', 'slot_array', 'copy', 'drill_resize']: try: self.active_tool.draw_cursor_data(pos=(x, y)) except AttributeError: @@ -4132,7 +4239,7 @@ class AppExcEditor(QtCore.QObject): else: storage.insert(shp) # TODO: Check performance - def add_shape(self, shape): + def add_shape(self, shp): """ Adds a shape to the shape storage. @@ -4142,22 +4249,22 @@ class AppExcEditor(QtCore.QObject): """ # List of DrawToolShape? - if isinstance(shape, list): - for subshape in shape: + if isinstance(shp, list): + for subshape in shp: self.add_shape(subshape) return - assert isinstance(shape, DrawToolShape), \ - "Expected a DrawToolShape, got %s" % type(shape) + assert isinstance(shp, DrawToolShape), \ + "Expected a DrawToolShape, got %s" % type(shp) - assert shape.geo is not None, \ + assert shp.geo is not None, \ "Shape object has empty geometry (None)" - assert (isinstance(shape.geo, list) and len(shape.geo) > 0) or not isinstance(shape.geo, list), \ + assert (isinstance(shp.geo, list) and len(shp.geo) > 0) or not isinstance(shp.geo, list), \ "Shape objects has empty geometry ([])" - if isinstance(shape, DrawToolUtilityShape): - self.utility.append(shape) + if isinstance(shp, DrawToolUtilityShape): + self.utility.append(shp) # else: # self.storage.insert(shape) @@ -4698,63 +4805,10 @@ class AppExcEditorUI: ) grid1.addWidget(self.deltool_btn, 2, 0, 1, 2) - separator_line = QtWidgets.QFrame() - separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine) - separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - grid1.addWidget(separator_line, 4, 0, 1, 2) - - # ############################################################################################################# - # ############################## Resize Tool Grid ############################################################# - # ############################################################################################################# - # add a frame and inside add a grid box layout. Inside this layout I add all the Drills widgets - # this way I can hide/show the frame - self.resize_frame = QtWidgets.QFrame() - self.resize_frame.setContentsMargins(0, 0, 0, 0) - self.ui_vertical_lay.addWidget(self.resize_frame) - - self.resize_grid = GLay(v_spacing=5, h_spacing=3) - self.resize_grid.setContentsMargins(0, 0, 0, 0) - self.resize_frame.setLayout(self.resize_grid) - - self.drillresize_label = FCLabel('%s' % _("Resize Tool"), bold=True) - self.drillresize_label.setToolTip( - _("Resize a drill or a selection of drills.") - ) - self.resize_grid.addWidget(self.drillresize_label, 0, 0, 1, 2) - - # Resize Diameter - res_entry_lbl = FCLabel('%s:' % _('Resize Dia')) - res_entry_lbl.setToolTip( - _("Diameter to resize to.") - ) - - hlay2 = QtWidgets.QHBoxLayout() - self.resdrill_entry = FCDoubleSpinner(policy=False) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.MinimumExpanding, - QtWidgets.QSizePolicy.Policy.Preferred) - self.resdrill_entry.setSizePolicy(sizePolicy) - self.resdrill_entry.set_precision(self.decimals) - self.resdrill_entry.set_range(0.0000, 10000.0000) - - hlay2.addWidget(self.resdrill_entry) - - # Resize Button - self.resize_btn = FCButton(_('Resize')) - self.resize_btn.setIcon(QtGui.QIcon(self.app.resource_location + '/resize16.png')) - self.resize_btn.setToolTip( - _("Resize drill(s)") - ) - hlay2.addWidget(self.resize_btn) - - self.resize_grid.addWidget(res_entry_lbl, 2, 0) - self.resize_grid.addLayout(hlay2, 2, 1) - - separator_line = QtWidgets.QFrame() - separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine) - separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) - self.resize_grid.addWidget(separator_line, 6, 0, 1, 2) - - self.resize_frame.hide() + # separator_line = QtWidgets.QFrame() + # separator_line.setFrameShape(QtWidgets.QFrame.Shape.HLine) + # separator_line.setFrameShadow(QtWidgets.QFrame.Shadow.Sunken) + # grid1.addWidget(separator_line, 4, 0, 1, 2) self.ui_vertical_lay.addStretch() layout.addStretch(1) diff --git a/appEditors/exc_plugins/ExcResizePlugin.py b/appEditors/exc_plugins/ExcResizePlugin.py new file mode 100644 index 00000000..98dde557 --- /dev/null +++ b/appEditors/exc_plugins/ExcResizePlugin.py @@ -0,0 +1,173 @@ + +from appTool import * + +fcTranslate.apply_language('strings') +if '_' not in builtins.__dict__: + _ = gettext.gettext + + +class ExcResizeEditorTool(AppTool): + """ + Simple input for buffer distance. + """ + + def __init__(self, app, draw_app, plugin_name): + AppTool.__init__(self, app) + + self.draw_app = draw_app + self.decimals = app.decimals + self.plugin_name = plugin_name + + self.ui = ExcResizeEditorUI(layout=self.layout, resize_class=self, plugin_name=plugin_name) + + self.connect_signals_at_init() + self.set_tool_ui() + + def connect_signals_at_init(self): + # Signals + self.ui.clear_btn.clicked.connect(self.on_clear) + + def disconnect_signals(self): + # Signals + try: + self.ui.clear_btn.clicked.disconnect() + except (TypeError, AttributeError): + pass + + def run(self): + self.app.defaults.report_usage("Geo Editor ToolPath()") + AppTool.run(self) + + # if the splitter us hidden, display it + if self.app.ui.splitter.sizes()[0] == 0: + self.app.ui.splitter.setSizes([1, 1]) + + # if the Tool Tab is hidden display it, else hide it but only if the objectName is the same + found_idx = None + for idx in range(self.app.ui.notebook.count()): + if self.app.ui.notebook.widget(idx).objectName() == "plugin_tab": + found_idx = idx + break + # show the Tab + if not found_idx: + try: + self.app.ui.notebook.addTab(self.app.ui.plugin_tab, _("Plugin")) + except RuntimeError: + self.app.ui.plugin_tab = QtWidgets.QWidget() + self.app.ui.plugin_tab.setObjectName("plugin_tab") + self.app.ui.plugin_tab_layout = QtWidgets.QVBoxLayout(self.app.ui.plugin_tab) + self.app.ui.plugin_tab_layout.setContentsMargins(2, 2, 2, 2) + + self.app.ui.plugin_scroll_area = VerticalScrollArea() + self.app.ui.plugin_tab_layout.addWidget(self.app.ui.plugin_scroll_area) + self.app.ui.notebook.addTab(self.app.ui.plugin_tab, _("Plugin")) + + # focus on Tool Tab + self.app.ui.notebook.setCurrentWidget(self.app.ui.plugin_tab) + + # self.app.ui.notebook.callback_on_close = self.on_tab_close + + self.app.ui.notebook.setTabText(2, self.plugin_name) + + def set_tool_ui(self): + # Init appGUI + pass + + def on_tab_close(self): + self.disconnect_signals() + self.hide_tool() + # self.app.ui.notebook.callback_on_close = lambda: None + + def on_clear(self): + self.set_tool_ui() + + def hide_tool(self): + self.ui.tool_frame.hide() + self.app.ui.notebook.setCurrentWidget(self.app.ui.properties_tab) + if self.draw_app.active_tool.name != 'select': + self.draw_app.select_tool("select") + + +class ExcResizeEditorUI: + + def __init__(self, layout, resize_class, plugin_name): + self.pluginName = plugin_name + self.ed_class = resize_class + self.decimals = self.ed_class.app.decimals + self.layout = layout + + # Title + title_label = FCLabel("%s" % ('Editor ' + self.pluginName)) + title_label.setStyleSheet(""" + QLabel + { + font-size: 16px; + font-weight: bold; + } + """) + self.layout.addWidget(title_label) + + # this way I can hide/show the frame + self.tool_frame = QtWidgets.QFrame() + self.tool_frame.setContentsMargins(0, 0, 0, 0) + self.layout.addWidget(self.tool_frame) + self.editor_vbox = QtWidgets.QVBoxLayout() + self.editor_vbox.setContentsMargins(0, 0, 0, 0) + self.tool_frame.setLayout(self.editor_vbox) + + # Tool Diameter + self.tool_lbl = FCLabel('%s' % _("Tool Diameter"), bold=True, color='blue') + self.editor_vbox.addWidget(self.tool_lbl) + # ############################################################################################################# + # Diameter Frame + # ############################################################################################################# + dia_frame = FCFrame() + self.editor_vbox.addWidget(dia_frame) + + dia_grid = GLay(v_spacing=5, h_spacing=3, c_stretch=[0, 1, 0]) + dia_frame.setLayout(dia_grid) + + # Dia Value + self.dia_lbl = FCLabel('%s:' % _("Value")) + self.dia_entry = NumericalEvalEntry(border_color='#0069A9') + self.dia_entry.setDisabled(True) + self.dia_unit = FCLabel('%s' % 'mm') + + dia_grid.addWidget(self.dia_lbl, 0, 0) + dia_grid.addWidget(self.dia_entry, 0, 1) + dia_grid.addWidget(self.dia_unit, 0, 2) + + # ############################################################################################################# + # Resize Frame + # ############################################################################################################# + resize_frame = FCFrame() + self.editor_vbox.addWidget(resize_frame) + + resize_grid = GLay(v_spacing=5, h_spacing=3, c_stretch=[0, 1, 0]) + resize_frame.setLayout(resize_grid) + + # Resize Diameter + self.res_dia_lbl = FCLabel('%s %s:' % (_("Resize"), _("Value").lower())) + self.res_dia_lbl.setToolTip( + _("Diameter to resize to.") + ) + self.res_dia_entry = FCDoubleSpinner(policy=False) + self.res_dia_entry.set_precision(self.decimals) + self.res_dia_entry.set_range(0.0000, 10000.0000) + + resize_grid.addWidget(self.res_dia_lbl, 0, 0) + resize_grid.addWidget(self.res_dia_entry, 0, 1) + + self.clear_btn = QtWidgets.QToolButton() + self.clear_btn.setIcon(QtGui.QIcon(self.ed_class.app.resource_location + '/trash32.png')) + resize_grid.addWidget(self.clear_btn, 0, 2) + + self.resize_btn = FCButton(_("Resize")) + self.resize_btn.setToolTip( + _("Resize a drill or a selection of drills.") + ) + self.resize_btn.setIcon(QtGui.QIcon(self.ed_class.app.resource_location + '/resize16.png')) + self.editor_vbox.addWidget(self.resize_btn) + + GLay.set_common_column_size([dia_grid, resize_grid], 0) + self.layout.addStretch(1) diff --git a/appEditors/exc_plugins/ExcScalePlugin.py b/appEditors/exc_plugins/ExcScalePlugin.py deleted file mode 100644 index e69de29b..00000000 diff --git a/appGUI/MainGUI.py b/appGUI/MainGUI.py index 9efd53e6..b3307cb2 100644 --- a/appGUI/MainGUI.py +++ b/appGUI/MainGUI.py @@ -801,7 +801,7 @@ class MainGUI(QtWidgets.QMainWindow): self.exc_resize_drill_menuitem = self.exc_editor_menu.addAction( QtGui.QIcon(self.app.resource_location + '/resize16.png'), - '%s\t%s' % (_('Resize Drill(S)'), _('R')) + '%s\t%s' % (_('Resize Drill'), _('R')) ) self.exc_copy_drill_menuitem = self.exc_editor_menu.addAction( QtGui.QIcon(self.app.resource_location + '/copy32.png'), @@ -814,7 +814,7 @@ class MainGUI(QtWidgets.QMainWindow): self.exc_move_drill_menuitem = self.exc_editor_menu.addAction( QtGui.QIcon(self.app.resource_location + '/move32.png'), - '%s\t%s' % (_('Move Drill'), _('M'))) + '%s\t%s' % (_('Move'), _('M'))) # ######################################################################## # ########################## GERBER Editor # ############################# @@ -1234,13 +1234,13 @@ class MainGUI(QtWidgets.QMainWindow): self.exc_edit_toolbar.addSeparator() self.copy_drill_btn = self.exc_edit_toolbar.addAction( - QtGui.QIcon(self.app.resource_location + '/copy32.png'), _('Copy Drill')) + QtGui.QIcon(self.app.resource_location + '/copy32.png'), _('Copy')) self.delete_drill_btn = self.exc_edit_toolbar.addAction( - QtGui.QIcon(self.app.resource_location + '/trash32.png'), _("Delete Drill")) + QtGui.QIcon(self.app.resource_location + '/trash32.png'), _("Delete")) self.exc_edit_toolbar.addSeparator() self.move_drill_btn = self.exc_edit_toolbar.addAction( - QtGui.QIcon(self.app.resource_location + '/move32.png'), _("Move Drill")) + QtGui.QIcon(self.app.resource_location + '/move32.png'), _("Move")) # ######################################################################## # ########################## Geometry Editor Toolbar# #################### @@ -2611,13 +2611,13 @@ class MainGUI(QtWidgets.QMainWindow): self.exc_edit_toolbar.addSeparator() self.copy_drill_btn = self.exc_edit_toolbar.addAction( - QtGui.QIcon(self.app.resource_location + '/copy32.png'), _('Copy Drill')) + QtGui.QIcon(self.app.resource_location + '/copy32.png'), _('Copy')) self.delete_drill_btn = self.exc_edit_toolbar.addAction( - QtGui.QIcon(self.app.resource_location + '/trash32.png'), _("Delete Drill")) + QtGui.QIcon(self.app.resource_location + '/trash32.png'), _("Delete")) self.exc_edit_toolbar.addSeparator() self.move_drill_btn = self.exc_edit_toolbar.addAction( - QtGui.QIcon(self.app.resource_location + '/move32.png'), _("Move Drill")) + QtGui.QIcon(self.app.resource_location + '/move32.png'), _("Move")) # ######################################################################## # ################### Geometry Editor Toolbar ############################ @@ -5371,16 +5371,16 @@ class ShortcutsTab(QtWidgets.QWidget): """ % ( _("EXCELLON EDITOR"), _('A'), _("Add Drill Array"), - _('C'), _("Copy Drill"), + _('C'), _("Copy"), _('D'), _("Add Drill"), _('J'), _("Jump to Location (x, y)"), - _('M'), _("Move Drill"), + _('M'), _("Move"), _('Q'), _("Add Slot Array"), _('R'), _("Resize Drill"), _('T'), _("Add a new Tool"), _('W'), _("Add Slot"), _('Shift+M'), _("Distance Minimum Tool"), - _('Del'), _("Delete Drill"), + _('Del'), _("Delete"), _('Del'), _("Alternate: Delete Tool"), _('Esc'), _("Abort and return to Select"), _('Space'), _("Toggle Slot direction"),