From 28dac560510d3e2a409a61970ca3ee68c44b2216 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Wed, 10 Apr 2019 17:12:21 +0300 Subject: [PATCH] - Gerber Editor: added Add Track and Add Region functions - Gerber Editor: fixed key shortcuts - fixed setting the Layout combobox in Preferences according to the current layout --- FlatCAMApp.py | 11 +- README.md | 6 + flatcamEditors/FlatCAMGrbEditor.py | 330 ++++++++++++++++++++--------- flatcamGUI/FlatCAMGUI.py | 101 ++++++--- share/aperture16.png | Bin 0 -> 377 bytes share/track32.png | Bin 0 -> 342 bytes 6 files changed, 312 insertions(+), 136 deletions(-) create mode 100644 share/aperture16.png create mode 100644 share/track32.png diff --git a/FlatCAMApp.py b/FlatCAMApp.py index afc5069b..24ce0a3d 100644 --- a/FlatCAMApp.py +++ b/FlatCAMApp.py @@ -95,7 +95,7 @@ class App(QtCore.QObject): # Version version = 8.913 - version_date = "2019/04/12" + version_date = "2019/04/13" beta = True # current date now @@ -341,6 +341,7 @@ class App(QtCore.QObject): "global_sel_draw_color": self.ui.general_defaults_form.general_gui_group.sel_draw_color_entry, # General GUI Settings + "global_layout": self.ui.general_defaults_form.general_gui_set_group.layout_combo, "global_hover": self.ui.general_defaults_form.general_gui_set_group.hover_cb, # Gerber General @@ -646,7 +647,7 @@ class App(QtCore.QObject): # General GUI Settings "global_hover": True, - + "global_layout": "compact", # Gerber General "gerber_plot": True, "gerber_solid": True, @@ -1848,7 +1849,7 @@ class App(QtCore.QObject): self.save_factory_defaults(silent=False) # ONLY AT FIRST STARTUP INIT THE GUI LAYOUT TO 'COMPACT' initial_lay = 'compact' - self.on_layout(index=None, lay=initial_lay) + self.on_layout(lay=initial_lay) # Set the combobox in Preferences to the current layout idx = self.ui.general_defaults_form.general_gui_set_group.layout_combo.findText(initial_lay) self.ui.general_defaults_form.general_gui_set_group.layout_combo.setCurrentIndex(idx) @@ -2220,7 +2221,6 @@ class App(QtCore.QObject): # make sure that we reenable the selection on Project Tab after returning from Editor Mode: self.collection.view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) - def get_last_folder(self): return self.defaults["global_last_folder"] @@ -3213,6 +3213,7 @@ class App(QtCore.QObject): settings = QSettings("Open Source", "FlatCAM") settings.setValue('saved_gui_state', self.ui.saveState()) settings.setValue('maximized_gui', self.ui.isMaximized()) + settings.setValue('language', self.ui.general_defaults_form.general_app_group.language_cb.get_value()) # This will write the setting to the platform specific storage. del settings @@ -3983,7 +3984,7 @@ class App(QtCore.QObject): self.ui.general_defaults_form.general_gui_group.workspace_cb.setChecked(True) self.on_workspace() - def on_layout(self, index, lay=None): + def on_layout(self, index=None, lay=None): self.report_usage("on_layout()") if lay: current_layout = lay diff --git a/README.md b/README.md index 7b178b67..6ec1ba1f 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,12 @@ CAD program, and create G-Code for Isolation routing. ================================================= +10.04.2019 + +- Gerber Editor: added Add Track and Add Region functions +- Gerber Editor: fixed key shortcuts +- fixed setting the Layout combobox in Preferences according to the current layout + 9.04.2019 - Gerber Editor: added buffer and scale tools diff --git a/flatcamEditors/FlatCAMGrbEditor.py b/flatcamEditors/FlatCAMGrbEditor.py index 1d6351c3..7a659a9b 100644 --- a/flatcamEditors/FlatCAMGrbEditor.py +++ b/flatcamEditors/FlatCAMGrbEditor.py @@ -26,95 +26,168 @@ if '_' not in builtins.__dict__: _ = gettext.gettext -# class ScaleGrbTool(FlatCAMTool): -# """ -# Simple input for buffer distance. -# """ -# -# toolName = _("Scale") -# -# def __init__(self, app, draw_app): -# FlatCAMTool.__init__(self, app) -# -# self.draw_app = draw_app -# -# # Title -# title_label = QtWidgets.QLabel("{name} {tooln} ".format(name=_("Editor"), tooln=self.toolName)) -# title_label.setStyleSheet(""" -# QLabel -# { -# font-size: 16px; -# font-weight: bold; -# } -# """) -# self.layout.addWidget(title_label) -# -# # this way I can hide/show the frame -# self.scale_tool_frame = QtWidgets.QFrame() -# self.scale_tool_frame.setContentsMargins(0, 0, 0, 0) -# self.layout.addWidget(self.scale_tool_frame) -# self.scale_tools_box = QtWidgets.QVBoxLayout() -# self.scale_tools_box.setContentsMargins(0, 0, 0, 0) -# self.scale_tool_frame.setLayout(self.scale_tools_box) -# -# # Form Layout -# form_layout = QtWidgets.QFormLayout() -# self.scale_tools_box.addLayout(form_layout) -# -# # Buffer distance -# self.scale_factor_entry = FCEntry() -# form_layout.addRow(_("Scale Factor:"), self.scale_factor_entry) -# -# # Buttons -# hlay1 = QtWidgets.QHBoxLayout() -# self.scale_tools_box.addLayout(hlay1) -# -# self.scale_button = QtWidgets.QPushButton(_("Scale")) -# hlay1.addWidget(self.scale_button) -# -# self.layout.addStretch() -# -# # Signals -# self.scale_button.clicked.connect(self.on_scale) -# -# # Init GUI -# self.scale_factor_entry.set_value(1) -# -# def run(self): -# self.app.report_usage("Gerber Editor ToolScale()") -# FlatCAMTool.run(self) -# -# # if the splitter us hidden, display it -# if self.app.ui.splitter.sizes()[0] == 0: -# self.app.ui.splitter.setSizes([1, 1]) -# -# self.app.ui.notebook.setTabText(2, _("Scale Tool")) -# -# def on_scale(self): -# if not self.draw_app.selected: -# self.app.inform.emit(_("[WARNING_NOTCL] Scale cancelled. No aperture selected.")) -# return -# -# try: -# buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value()) -# except ValueError: -# # try to convert comma to decimal point. if it's still not working error message and return -# try: -# buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.')) -# self.buff_tool.buffer_distance_entry.set_value(buffer_distance) -# except ValueError: -# self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " -# "Add it and retry.")) -# return -# # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment -# # I populated the combobox such that the index coincide with the join styles value (whcih is really an INT) -# join_style = self.buff_tool.buffer_corner_cb.currentIndex() + 1 -# self.draw_app.buffer(buffer_distance, join_style) -# self.app.ui.notebook.setTabText(2, _("Tools")) -# self.draw_app.app.ui.splitter.setSizes([0, 1]) -# -# self.deactivate() -# self.app.inform.emit(_("[success] Done. Scale Tool completed.")) +class FCPad(FCShapeTool): + """ + Resulting type: Polygon + """ + + def __init__(self, draw_app): + DrawTool.__init__(self, draw_app) + self.name = 'pad' + + self.start_msg = _("Click on CENTER ...") + self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"] + + def click(self, point): + self.points.append(point) + + if len(self.points) == 1: + self.draw_app.app.inform.emit(_("Click on Circle perimeter point to complete ...")) + return "Click on perimeter to complete ..." + + if len(self.points) == 2: + self.make() + return "Done." + + return "" + + def utility_geometry(self, data=None): + if len(self.points) == 1: + p1 = self.points[0] + p2 = data + radius = sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) + return DrawToolUtilityShape(Point(p1).buffer(radius, int(self.steps_per_circ / 4))) + + return None + + def make(self): + p1 = self.points[0] + p2 = self.points[1] + radius = distance(p1, p2) + self.geometry = DrawToolShape(Point(p1).buffer(radius, int(self.steps_per_circ / 4))) + self.complete = True + self.draw_app.app.inform.emit(_("[success] Done. Adding Circle completed.")) + + +class FCRectPad(FCShapeTool): + """ + Resulting type: Polygon + """ + + def __init__(self, draw_app): + DrawTool.__init__(self, draw_app) + self.name = 'rectangle' + + self.start_msg = _("Click on 1st corner ...") + + def click(self, point): + self.points.append(point) + + if len(self.points) == 1: + return "Click on opposite corner to complete ..." + + if len(self.points) == 2: + self.make() + return "Done." + + return "" + + def utility_geometry(self, data=None): + if len(self.points) == 1: + p1 = self.points[0] + p2 = data + return DrawToolUtilityShape(LinearRing([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])])) + + return None + + def make(self): + p1 = self.points[0] + p2 = self.points[1] + # self.geometry = LinearRing([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])]) + self.geometry = DrawToolShape(Polygon([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])])) + self.complete = True + self.draw_app.app.inform.emit(_("[success] Done. Rectangle completed.")) + + +class FCRegion(FCShapeTool): + """ + Resulting type: Polygon + """ + + def __init__(self, draw_app): + DrawTool.__init__(self, draw_app) + self.name = 'region' + self.draw_app = draw_app + + size_ap = float(self.draw_app.storage_dict[self.draw_app.last_aperture_selected]['size']) + self.buf_val = (size_ap / 2) if size_ap > 0 else 0.0000001 + + self.start_msg = _("Click on 1st point ...") + + def click(self, point): + self.draw_app.in_action = True + self.points.append(point) + + if len(self.points) > 0: + self.draw_app.app.inform.emit(_("Click on next Point or click Right mouse button to complete ...")) + return "Click on next point or hit ENTER to complete ..." + + return "" + + def utility_geometry(self, data=None): + + if len(self.points) == 1: + temp_points = [x for x in self.points] + temp_points.append(data) + return DrawToolUtilityShape(LineString(temp_points).buffer(self.buf_val, join_style=1)) + + if len(self.points) > 1: + temp_points = [x for x in self.points] + temp_points.append(data) + return DrawToolUtilityShape(LinearRing(temp_points).buffer(self.buf_val, join_style=1)) + + return None + + def make(self): + # self.geometry = LinearRing(self.points) + self.geometry = DrawToolShape(Polygon(self.points).buffer(self.buf_val, join_style=2)) + self.draw_app.in_action = False + self.complete = True + self.draw_app.app.inform.emit(_("[success] Done. Region completed.")) + + def on_key(self, key): + if key == 'backspace': + if len(self.points) > 0: + self.points = self.points[0:-1] + + +class FCTrack(FCRegion): + """ + Resulting type: Polygon + """ + + def make(self): + + self.geometry = DrawToolShape(LineString(self.points).buffer(self.buf_val)) + self.name = 'track' + + self.draw_app.in_action = False + self.complete = True + self.draw_app.app.inform.emit(_("[success] Done. Path completed.")) + + def utility_geometry(self, data=None): + if len(self.points) > 0: + temp_points = [x for x in self.points] + temp_points.append(data) + + return DrawToolUtilityShape(LineString(temp_points).buffer(self.buf_val)) + + return None + + def on_key(self, key): + if key == 'backspace': + if len(self.points) > 0: + self.points = self.points[0:-1] class FCScale(FCShapeTool): @@ -194,7 +267,7 @@ class FCBuffer(FCShapeTool): class FCApertureMove(FCShapeTool): def __init__(self, draw_app): DrawTool.__init__(self, draw_app) - self.name = 'aperture_move' + self.name = 'move' # self.shape_buffer = self.draw_app.shape_buffer self.origin = None @@ -287,7 +360,7 @@ class FCApertureMove(FCShapeTool): class FCApertureCopy(FCApertureMove): def __init__(self, draw_app): FCApertureMove.__init__(self, draw_app) - self.name = 'aperture_copy' + self.name = 'copy' def make(self): # Create new geometry @@ -317,6 +390,7 @@ class FCApertureSelect(DrawTool): def __init__(self, grb_editor_app): DrawTool.__init__(self, grb_editor_app) self.name = 'select' + self.origin = None self.grb_editor_app = grb_editor_app self.storage = self.grb_editor_app.storage_dict @@ -329,6 +403,9 @@ class FCApertureSelect(DrawTool): self.grb_editor_app.hide_tool('all') self.grb_editor_app.hide_tool('select') + def set_origin(self, origin): + self.origin = origin + def click(self, point): key_modifier = QtWidgets.QApplication.keyboardModifiers() if self.grb_editor_app.app.defaults["global_mselect_key"] == 'Control': @@ -628,13 +705,19 @@ class FlatCAMGrbEditor(QtCore.QObject): self.tools_gerber = { "select": {"button": self.app.ui.grb_select_btn, "constructor": FCApertureSelect}, - "aperture_buffer": {"button": self.app.ui.aperture_buffer_btn, + "pad": {"button": self.app.ui.grb_add_pad_btn, + "constructor": FCPad}, + "track": {"button": self.app.ui.grb_add_track_btn, + "constructor": FCTrack}, + "region": {"button": self.app.ui.grb_add_region_btn, + "constructor": FCRegion}, + "buffer": {"button": self.app.ui.aperture_buffer_btn, "constructor": FCBuffer}, - "aperture_scale": {"button": self.app.ui.aperture_scale_btn, + "scale": {"button": self.app.ui.aperture_scale_btn, "constructor": FCScale}, - "aperture_copy": {"button": self.app.ui.aperture_copy_btn, + "copy": {"button": self.app.ui.aperture_copy_btn, "constructor": FCApertureCopy}, - "aperture_move": {"button": self.app.ui.aperture_move_btn, + "move": {"button": self.app.ui.aperture_move_btn, "constructor": FCApertureMove}, } @@ -682,6 +765,13 @@ class FlatCAMGrbEditor(QtCore.QObject): self.delaperture_btn.clicked.connect(self.on_aperture_delete) self.apertures_table.cellPressed.connect(self.on_row_selected) + self.app.ui.grb_add_pad_menuitem.triggered.connect(self.on_pad_add) + self.app.ui.grb_add_track_menuitem.triggered.connect(self.on_track_add) + self.app.ui.grb_add_region_menuitem.triggered.connect(self.on_region_add) + + self.app.ui.grb_add_buffer_menuitem.triggered.connect(self.on_buffer) + self.app.ui.grb_add_scale_menuitem.triggered.connect(self.on_scale) + self.app.ui.grb_copy_menuitem.triggered.connect(self.on_copy_button) self.app.ui.grb_delete_menuitem.triggered.connect(self.on_delete_btn) @@ -1492,7 +1582,7 @@ class FlatCAMGrbEditor(QtCore.QObject): try: selected_apid = str(self.tool2tooldia[row + 1]) - self.last_aperture_selected = row + 1 + self.last_aperture_selected = self.apertures_table.item(row, 1).text() for obj in self.storage_dict[selected_apid]['solid_geometry']: self.selected.append(obj) @@ -1505,11 +1595,15 @@ class FlatCAMGrbEditor(QtCore.QObject): self.options[key] = self.sender().isChecked() return self.options[key] - def on_grb_shape_complete(self, storage): + def on_grb_shape_complete(self, storage=None): self.app.log.debug("on_shape_complete()") - # Add shape - self.add_gerber_shape(self.active_tool.geometry, storage) + if storage is not None: + # Add shape + self.add_gerber_shape(self.active_tool.geometry, storage) + else: + stora = self.storage_dict[self.last_aperture_selected]['solid_geometry'] + self.add_gerber_shape(self.active_tool.geometry, storage=stora) # Remove any utility shapes self.delete_utility_geometry() @@ -1615,8 +1709,31 @@ class FlatCAMGrbEditor(QtCore.QObject): if self.app.panning_action is True: self.app.panning_action = False else: - self.app.cursor = QtGui.QCursor() - self.app.ui.popMenu.popup(self.app.cursor.pos()) + if self.in_action is False: + self.app.cursor = QtGui.QCursor() + self.app.ui.popMenu.popup(self.app.cursor.pos()) + else: + # if right click on canvas and the active tool need to be finished (like Path or Polygon) + # right mouse click will finish the action + if isinstance(self.active_tool, FCShapeTool): + self.active_tool.click(self.app.geo_editor.snap(self.x, self.y)) + self.active_tool.make() + if self.active_tool.complete: + self.on_grb_shape_complete() + self.app.inform.emit(_("[success] Done.")) + + # MS: always return to the Select Tool if modifier key is not pressed + # else return to the current tool + key_modifier = QtWidgets.QApplication.keyboardModifiers() + if self.app.defaults["global_mselect_key"] == 'Control': + modifier_to_use = Qt.ControlModifier + else: + modifier_to_use = Qt.ShiftModifier + + if key_modifier == modifier_to_use: + self.select_tool(self.active_tool.name) + else: + self.select_tool("select") except Exception as e: log.warning("Error: %s" % str(e)) raise @@ -1866,7 +1983,7 @@ class FlatCAMGrbEditor(QtCore.QObject): self.app.log.debug("on_shape_complete()") # Add shape - self.add_shape(self.active_tool.geometry) + self.add_gerber_shape(self.active_tool.geometry) # Remove any utility shapes self.delete_utility_geometry() @@ -1956,6 +2073,15 @@ class FlatCAMGrbEditor(QtCore.QObject): self.select_tool('move') return + def on_pad_add(self): + self.select_tool('pad') + + def on_track_add(self): + self.select_tool('track') + + def on_region_add(self): + self.select_tool('region') + def on_buffer(self): buff_value = 0.01 log.debug("FlatCAMGrbEditor.on_buffer()") diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 46ebc371..ee66e38a 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/flatcamGUI/FlatCAMGUI.py @@ -451,18 +451,25 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.exc_move_drill_menuitem = self.exc_editor_menu.addAction( QtGui.QIcon('share/move32.png'),_( 'Move Drill(s)\tM')) + ### APPLICATION GERBER EDITOR MENU ### + self.grb_editor_menu = QtWidgets.QMenu(_(">Gerber Editor<")) self.menu.addMenu(self.grb_editor_menu) - self.grb_add_trace_menuitem = self.grb_editor_menu.addAction( - QtGui.QIcon('share/rectangle32.png'), _('Add Trace\tT')) - self.grb_add_zone_menuitem = self.exc_editor_menu.addAction(QtGui.QIcon('share/plus16.png'), - _('Add Zone\tZ')) + self.grb_add_pad_menuitem = self.grb_editor_menu.addAction( + QtGui.QIcon('share/aperture16.png'), _('Add Pad\tP')) + self.grb_add_track_menuitem = self.grb_editor_menu.addAction( + QtGui.QIcon('share/track32.png'), _('Add Track\tT')) + self.grb_add_region_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/rectangle32.png'), + _('Add Region\tN')) + self.grb_editor_menu.addSeparator() + + self.grb_add_buffer_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/buffer16-2.png'), + _('Buffer\tB')) + self.grb_add_scale_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/scale32.png'), + _('Scale\tS')) self.grb_editor_menu.addSeparator() - self.grb_resize_aperture_menuitem = self.grb_editor_menu.addAction( - QtGui.QIcon('share/resize16.png'), _('Resize Aperture\tR') - ) self.grb_copy_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/copy32.png'), _('Copy\tC')) self.grb_delete_menuitem = self.grb_editor_menu.addAction( QtGui.QIcon('share/deleteshape32.png'), _('Delete\tDEL') @@ -481,7 +488,6 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.exc_editor_menu.menuAction().setVisible(False) self.exc_editor_menu.setDisabled(True) - ################################ ### Project Tab Context menu ### ################################ @@ -630,7 +636,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.exc_edit_toolbar.addSeparator() self.copy_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _('Copy Drill')) - self.delete_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), _("Delete Drill")) + self.delete_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/trash32.png'), _("Delete Drill")) self.exc_edit_toolbar.addSeparator() self.move_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move Drill")) @@ -661,7 +667,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.geo_cutpath_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/cutpath32.png'), _('Cut Path')) self.geo_copy_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _("Copy Shape(s)")) - self.geo_delete_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), + self.geo_delete_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/trash32.png'), _("Delete Shape '-'")) self.geo_transform_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/transform.png'), _("Transformations")) @@ -670,12 +676,20 @@ class FlatCAMGUI(QtWidgets.QMainWindow): ### Gerber Editor Toolbar ### self.grb_select_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select")) + self.grb_add_pad_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/aperture16.png'), _("Add Pad")) + self.grb_add_track_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/track32.png'), _("Add Track")) + self.grb_add_region_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), _("Add Region")) + self.grb_edit_toolbar.addSeparator() + self.aperture_buffer_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Buffer')) self.aperture_scale_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/scale32.png'), _('Scale')) + self.grb_edit_toolbar.addSeparator() self.aperture_copy_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _("Copy")) + self.aperture_delete_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/trash32.png'), + _("Delete")) + self.grb_edit_toolbar.addSeparator() self.aperture_move_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move")) - ### Snap Toolbar ### # Snap GRID toolbar is always active to facilitate usage of measurements done on GRID # self.addToolBar(self.snap_toolbar) @@ -1426,9 +1440,11 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.draw_move = self.g_editor_cmenu.addAction(QtGui.QIcon('share/move32.png'), _("Move")) self.grb_editor_cmenu = self.popMenu.addMenu(QtGui.QIcon('share/draw32.png'), _("Gerber Editor")) + self.grb_draw_track = self.grb_editor_cmenu.addAction(QtGui.QIcon('share/aperture16.png'), _("Pad")) self.grb_draw_track = self.grb_editor_cmenu.addAction(QtGui.QIcon('share/path32.png'), _("Track")) - self.grb_draw_zone = self.grb_editor_cmenu.addAction(QtGui.QIcon('share/rectangle32.png'), _("Zone")) + self.grb_draw_zone = self.grb_editor_cmenu.addAction(QtGui.QIcon('share/polygon32.png'), _("Region")) self.grb_editor_cmenu.addSeparator() + self.grb_delete = self.grb_editor_cmenu.addAction(QtGui.QIcon('share/trash32.png'), _("Delete")) self.grb_move = self.grb_editor_cmenu.addAction(QtGui.QIcon('share/move32.png'), _("Move")) self.e_editor_cmenu = self.popMenu.addMenu(QtGui.QIcon('share/drill32.png'), _("Exc Editor")) @@ -1601,6 +1617,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.restoreState(saved_gui_state) log.debug("FlatCAMGUI.__init__() --> UI state restored.") + settings = QSettings("Open Source", "FlatCAM") if settings.contains("layout"): layout = settings.value('layout', type=str) if layout == 'standard': @@ -1622,6 +1639,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.corner_snap_btn.setVisible(True) self.snap_magnet.setDisabled(True) self.corner_snap_btn.setDisabled(True) + log.debug("FlatCAMGUI.__init__() --> UI layout restored from QSettings.") else: self.exc_edit_toolbar.setVisible(False) self.exc_edit_toolbar.setDisabled(True) @@ -1632,6 +1650,11 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.corner_snap_btn.setVisible(False) self.snap_magnet.setVisible(False) + settings.setValue('layout', "standard") + + # This will write the setting to the platform specific storage. + del settings + log.debug("FlatCAMGUI.__init__() --> UI layout restored from defaults. QSettings set to 'standard'") def eventFilter(self, obj, event): if self.general_defaults_form.general_app_group.toggle_tooltips_cb.get_value() is False: @@ -1702,7 +1725,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.exc_edit_toolbar.addSeparator() self.copy_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _('Copy Drill')) - self.delete_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), + self.delete_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/trash32.png'), _("Delete Drill")) self.exc_edit_toolbar.addSeparator() @@ -1735,7 +1758,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.geo_edit_toolbar.addSeparator() self.geo_cutpath_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/cutpath32.png'), _('Cut Path')) self.geo_copy_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _("Copy Objects")) - self.geo_delete_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'), + self.geo_delete_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/trash32.png'), _("Delete Shape")) self.geo_transform_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/transform.png'), _("Transformations")) @@ -1745,7 +1768,19 @@ class FlatCAMGUI(QtWidgets.QMainWindow): ### Gerber Editor Toolbar ### self.grb_select_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select")) + self.grb_add_pad_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/aperture16.png'), _("Add Pad")) + self.grb_add_track_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/track32.png'), _("Add Track")) + self.grb_add_region_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), _("Add Region")) + self.grb_edit_toolbar.addSeparator() + self.aperture_buffer_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), _('Buffer')) + self.aperture_scale_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/scale32.png'), _('Scale')) + self.grb_edit_toolbar.addSeparator() + self.aperture_copy_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _("Copy")) + self.aperture_delete_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/trash32.png'), + _("Delete")) + self.grb_edit_toolbar.addSeparator() + self.aperture_move_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move")) ### Snap Toolbar ### # Snap GRID toolbar is always active to facilitate usage of measurements done on GRID @@ -2464,29 +2499,18 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if self.app.grb_editor.selected: self.app.inform.emit(_("Click on target point.")) self.app.ui.aperture_copy_btn.setChecked(True) - self.app.grb_editor.on_tool_select('aperture_copy') + self.app.grb_editor.on_tool_select('copy') self.app.grb_editor.active_tool.set_origin( (self.app.grb_editor.snap_x, self.app.grb_editor.snap_y)) else: self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to copy.")) return - # Add Aperture Tool - if key == QtCore.Qt.Key_A or key == 'A': - self.app.grb_editor.launched_from_shortcuts = True - self.app.inform.emit(_("Click on target point.")) - self.app.ui.add_aperture_btn.setChecked(True) - - self.app.grb_editor.x = self.app.mouse[0] - self.app.grb_editor.y = self.app.mouse[1] - - self.app.grb_editor.select_tool('aperture_add') - return # Scale Tool if key == QtCore.Qt.Key_B or key == 'B': self.app.grb_editor.launched_from_shortcuts = True - self.app.grb_editor.select_tool('aperture_buffer') + self.app.grb_editor.select_tool('buffer') return # Grid Snap @@ -2516,17 +2540,35 @@ class FlatCAMGUI(QtWidgets.QMainWindow): if self.app.grb_editor.selected: self.app.inform.emit(_("Click on target point.")) self.app.ui.aperture_move_btn.setChecked(True) - self.app.grb_editor.on_tool_select('aperture_move') + self.app.grb_editor.on_tool_select('move') self.app.grb_editor.active_tool.set_origin( (self.app.grb_editor.snap_x, self.app.grb_editor.snap_y)) else: self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to move.")) return + # Add Pad Tool + if key == QtCore.Qt.Key_P or key == 'P': + self.app.grb_editor.launched_from_shortcuts = True + self.app.inform.emit(_("Click on target point.")) + self.app.ui.add_aperture_btn.setChecked(True) + + self.app.grb_editor.x = self.app.mouse[0] + self.app.grb_editor.y = self.app.mouse[1] + + self.app.grb_editor.select_tool('pad') + return + + # Add Region Tool + if key == QtCore.Qt.Key_R or key == 'R': + self.app.grb_editor.launched_from_shortcuts = True + self.app.grb_editor.select_tool('region') + return + # Scale Tool if key == QtCore.Qt.Key_S or key == 'S': self.app.grb_editor.launched_from_shortcuts = True - self.app.grb_editor.select_tool('aperture_scale') + self.app.grb_editor.select_tool('scale') return # Add Track @@ -2534,6 +2576,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow): self.app.grb_editor.launched_from_shortcuts = True ## Current application units in Upper Case self.units = self.general_defaults_group.general_app_group.units_radio.get_value().upper() + self.app.grb_editor.select_tool('track') return # Zoom Fit diff --git a/share/aperture16.png b/share/aperture16.png new file mode 100644 index 0000000000000000000000000000000000000000..f02f05ce65a9f8dc28e1801c83430ce6c38b5c02 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc4Sb$1jv*HQXD`|NIXMb6d|Y~QUQpD!2dx^t zH@G@ESy^XzBsRC6V%^dHpQBO0f?;8^lgT!!lvI6;>1s;*b3=DjSL74G){)!Z!;A>A8$B+p3x6^#N4jBlvu5M}%GT-%)gGDyat>#twMwy;hFF#J;%vUNdeD^_j6K7G|^87QW z9Ct`rbg8JbU%bY#$lq!9i^)H-j}@@be-w7DW<_5E>seRRqO