Explorar o código

- 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

Marius Stanciu %!s(int64=6) %!d(string=hai) anos
pai
achega
28dac56051
Modificáronse 6 ficheiros con 312 adicións e 136 borrados
  1. 6 5
      FlatCAMApp.py
  2. 6 0
      README.md
  3. 228 102
      flatcamEditors/FlatCAMGrbEditor.py
  4. 72 29
      flatcamGUI/FlatCAMGUI.py
  5. BIN=BIN
      share/aperture16.png
  6. BIN=BIN
      share/track32.png

+ 6 - 5
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

+ 6 - 0
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

+ 228 - 102
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()")

+ 72 - 29
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

BIN=BIN
share/aperture16.png


BIN=BIN
share/track32.png