- 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
This commit is contained in:
Marius Stanciu
2019-04-10 17:12:21 +03:00
committed by Marius
parent ce9e5a4546
commit 28dac56051
6 changed files with 312 additions and 136 deletions

View File

@@ -95,7 +95,7 @@ class App(QtCore.QObject):
# Version # Version
version = 8.913 version = 8.913
version_date = "2019/04/12" version_date = "2019/04/13"
beta = True beta = True
# current date now # 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, "global_sel_draw_color": self.ui.general_defaults_form.general_gui_group.sel_draw_color_entry,
# General GUI Settings # 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, "global_hover": self.ui.general_defaults_form.general_gui_set_group.hover_cb,
# Gerber General # Gerber General
@@ -646,7 +647,7 @@ class App(QtCore.QObject):
# General GUI Settings # General GUI Settings
"global_hover": True, "global_hover": True,
"global_layout": "compact",
# Gerber General # Gerber General
"gerber_plot": True, "gerber_plot": True,
"gerber_solid": True, "gerber_solid": True,
@@ -1848,7 +1849,7 @@ class App(QtCore.QObject):
self.save_factory_defaults(silent=False) self.save_factory_defaults(silent=False)
# ONLY AT FIRST STARTUP INIT THE GUI LAYOUT TO 'COMPACT' # ONLY AT FIRST STARTUP INIT THE GUI LAYOUT TO 'COMPACT'
initial_lay = '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 # Set the combobox in Preferences to the current layout
idx = self.ui.general_defaults_form.general_gui_set_group.layout_combo.findText(initial_lay) 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) 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: # make sure that we reenable the selection on Project Tab after returning from Editor Mode:
self.collection.view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) self.collection.view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
def get_last_folder(self): def get_last_folder(self):
return self.defaults["global_last_folder"] return self.defaults["global_last_folder"]
@@ -3213,6 +3213,7 @@ class App(QtCore.QObject):
settings = QSettings("Open Source", "FlatCAM") settings = QSettings("Open Source", "FlatCAM")
settings.setValue('saved_gui_state', self.ui.saveState()) settings.setValue('saved_gui_state', self.ui.saveState())
settings.setValue('maximized_gui', self.ui.isMaximized()) 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. # This will write the setting to the platform specific storage.
del settings del settings
@@ -3983,7 +3984,7 @@ class App(QtCore.QObject):
self.ui.general_defaults_form.general_gui_group.workspace_cb.setChecked(True) self.ui.general_defaults_form.general_gui_group.workspace_cb.setChecked(True)
self.on_workspace() self.on_workspace()
def on_layout(self, index, lay=None): def on_layout(self, index=None, lay=None):
self.report_usage("on_layout()") self.report_usage("on_layout()")
if lay: if lay:
current_layout = lay current_layout = lay

View File

@@ -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 9.04.2019
- Gerber Editor: added buffer and scale tools - Gerber Editor: added buffer and scale tools

View File

@@ -26,95 +26,168 @@ if '_' not in builtins.__dict__:
_ = gettext.gettext _ = gettext.gettext
# class ScaleGrbTool(FlatCAMTool): class FCPad(FCShapeTool):
# """ """
# Simple input for buffer distance. Resulting type: Polygon
# """ """
#
# toolName = _("Scale") def __init__(self, draw_app):
# DrawTool.__init__(self, draw_app)
# def __init__(self, app, draw_app): self.name = 'pad'
# FlatCAMTool.__init__(self, app)
# self.start_msg = _("Click on CENTER ...")
# self.draw_app = draw_app self.steps_per_circ = self.draw_app.app.defaults["geometry_circle_steps"]
#
# # Title def click(self, point):
# title_label = QtWidgets.QLabel("{name} {tooln} ".format(name=_("Editor"), tooln=self.toolName)) self.points.append(point)
# title_label.setStyleSheet("""
# QLabel if len(self.points) == 1:
# { self.draw_app.app.inform.emit(_("Click on Circle perimeter point to complete ..."))
# font-size: 16px; return "Click on perimeter to complete ..."
# font-weight: bold;
# } if len(self.points) == 2:
# """) self.make()
# self.layout.addWidget(title_label) return "Done."
#
# # this way I can hide/show the frame return ""
# self.scale_tool_frame = QtWidgets.QFrame()
# self.scale_tool_frame.setContentsMargins(0, 0, 0, 0) def utility_geometry(self, data=None):
# self.layout.addWidget(self.scale_tool_frame) if len(self.points) == 1:
# self.scale_tools_box = QtWidgets.QVBoxLayout() p1 = self.points[0]
# self.scale_tools_box.setContentsMargins(0, 0, 0, 0) p2 = data
# self.scale_tool_frame.setLayout(self.scale_tools_box) radius = sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2)
# return DrawToolUtilityShape(Point(p1).buffer(radius, int(self.steps_per_circ / 4)))
# # Form Layout
# form_layout = QtWidgets.QFormLayout() return None
# self.scale_tools_box.addLayout(form_layout)
# def make(self):
# # Buffer distance p1 = self.points[0]
# self.scale_factor_entry = FCEntry() p2 = self.points[1]
# form_layout.addRow(_("Scale Factor:"), self.scale_factor_entry) radius = distance(p1, p2)
# self.geometry = DrawToolShape(Point(p1).buffer(radius, int(self.steps_per_circ / 4)))
# # Buttons self.complete = True
# hlay1 = QtWidgets.QHBoxLayout() self.draw_app.app.inform.emit(_("[success] Done. Adding Circle completed."))
# self.scale_tools_box.addLayout(hlay1)
#
# self.scale_button = QtWidgets.QPushButton(_("Scale")) class FCRectPad(FCShapeTool):
# hlay1.addWidget(self.scale_button) """
# Resulting type: Polygon
# self.layout.addStretch() """
#
# # Signals def __init__(self, draw_app):
# self.scale_button.clicked.connect(self.on_scale) DrawTool.__init__(self, draw_app)
# self.name = 'rectangle'
# # Init GUI
# self.scale_factor_entry.set_value(1) self.start_msg = _("Click on 1st corner ...")
#
# def run(self): def click(self, point):
# self.app.report_usage("Gerber Editor ToolScale()") self.points.append(point)
# FlatCAMTool.run(self)
# if len(self.points) == 1:
# # if the splitter us hidden, display it return "Click on opposite corner to complete ..."
# if self.app.ui.splitter.sizes()[0] == 0:
# self.app.ui.splitter.setSizes([1, 1]) if len(self.points) == 2:
# self.make()
# self.app.ui.notebook.setTabText(2, _("Scale Tool")) return "Done."
#
# def on_scale(self): return ""
# if not self.draw_app.selected:
# self.app.inform.emit(_("[WARNING_NOTCL] Scale cancelled. No aperture selected.")) def utility_geometry(self, data=None):
# return if len(self.points) == 1:
# p1 = self.points[0]
# try: p2 = data
# buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value()) return DrawToolUtilityShape(LinearRing([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])]))
# except ValueError:
# # try to convert comma to decimal point. if it's still not working error message and return return None
# try:
# buffer_distance = float(self.buff_tool.buffer_distance_entry.get_value().replace(',', '.')) def make(self):
# self.buff_tool.buffer_distance_entry.set_value(buffer_distance) p1 = self.points[0]
# except ValueError: p2 = self.points[1]
# self.app.inform.emit(_("[WARNING_NOTCL] Buffer distance value is missing or wrong format. " # self.geometry = LinearRing([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])])
# "Add it and retry.")) self.geometry = DrawToolShape(Polygon([p1, (p2[0], p1[1]), p2, (p1[0], p2[1])]))
# return self.complete = True
# # the cb index start from 0 but the join styles for the buffer start from 1 therefore the adjustment self.draw_app.app.inform.emit(_("[success] Done. Rectangle completed."))
# # 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) class FCRegion(FCShapeTool):
# self.app.ui.notebook.setTabText(2, _("Tools")) """
# self.draw_app.app.ui.splitter.setSizes([0, 1]) Resulting type: Polygon
# """
# self.deactivate()
# self.app.inform.emit(_("[success] Done. Scale Tool completed.")) 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): class FCScale(FCShapeTool):
@@ -194,7 +267,7 @@ class FCBuffer(FCShapeTool):
class FCApertureMove(FCShapeTool): class FCApertureMove(FCShapeTool):
def __init__(self, draw_app): def __init__(self, draw_app):
DrawTool.__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.shape_buffer = self.draw_app.shape_buffer
self.origin = None self.origin = None
@@ -287,7 +360,7 @@ class FCApertureMove(FCShapeTool):
class FCApertureCopy(FCApertureMove): class FCApertureCopy(FCApertureMove):
def __init__(self, draw_app): def __init__(self, draw_app):
FCApertureMove.__init__(self, draw_app) FCApertureMove.__init__(self, draw_app)
self.name = 'aperture_copy' self.name = 'copy'
def make(self): def make(self):
# Create new geometry # Create new geometry
@@ -317,6 +390,7 @@ class FCApertureSelect(DrawTool):
def __init__(self, grb_editor_app): def __init__(self, grb_editor_app):
DrawTool.__init__(self, grb_editor_app) DrawTool.__init__(self, grb_editor_app)
self.name = 'select' self.name = 'select'
self.origin = None
self.grb_editor_app = grb_editor_app self.grb_editor_app = grb_editor_app
self.storage = self.grb_editor_app.storage_dict 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('all')
self.grb_editor_app.hide_tool('select') self.grb_editor_app.hide_tool('select')
def set_origin(self, origin):
self.origin = origin
def click(self, point): def click(self, point):
key_modifier = QtWidgets.QApplication.keyboardModifiers() key_modifier = QtWidgets.QApplication.keyboardModifiers()
if self.grb_editor_app.app.defaults["global_mselect_key"] == 'Control': if self.grb_editor_app.app.defaults["global_mselect_key"] == 'Control':
@@ -628,13 +705,19 @@ class FlatCAMGrbEditor(QtCore.QObject):
self.tools_gerber = { self.tools_gerber = {
"select": {"button": self.app.ui.grb_select_btn, "select": {"button": self.app.ui.grb_select_btn,
"constructor": FCApertureSelect}, "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}, "constructor": FCBuffer},
"aperture_scale": {"button": self.app.ui.aperture_scale_btn, "scale": {"button": self.app.ui.aperture_scale_btn,
"constructor": FCScale}, "constructor": FCScale},
"aperture_copy": {"button": self.app.ui.aperture_copy_btn, "copy": {"button": self.app.ui.aperture_copy_btn,
"constructor": FCApertureCopy}, "constructor": FCApertureCopy},
"aperture_move": {"button": self.app.ui.aperture_move_btn, "move": {"button": self.app.ui.aperture_move_btn,
"constructor": FCApertureMove}, "constructor": FCApertureMove},
} }
@@ -682,6 +765,13 @@ class FlatCAMGrbEditor(QtCore.QObject):
self.delaperture_btn.clicked.connect(self.on_aperture_delete) self.delaperture_btn.clicked.connect(self.on_aperture_delete)
self.apertures_table.cellPressed.connect(self.on_row_selected) 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_copy_menuitem.triggered.connect(self.on_copy_button)
self.app.ui.grb_delete_menuitem.triggered.connect(self.on_delete_btn) self.app.ui.grb_delete_menuitem.triggered.connect(self.on_delete_btn)
@@ -1492,7 +1582,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
try: try:
selected_apid = str(self.tool2tooldia[row + 1]) 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']: for obj in self.storage_dict[selected_apid]['solid_geometry']:
self.selected.append(obj) self.selected.append(obj)
@@ -1505,11 +1595,15 @@ class FlatCAMGrbEditor(QtCore.QObject):
self.options[key] = self.sender().isChecked() self.options[key] = self.sender().isChecked()
return self.options[key] 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()") self.app.log.debug("on_shape_complete()")
# Add shape if storage is not None:
self.add_gerber_shape(self.active_tool.geometry, storage) # 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 # Remove any utility shapes
self.delete_utility_geometry() self.delete_utility_geometry()
@@ -1615,8 +1709,31 @@ class FlatCAMGrbEditor(QtCore.QObject):
if self.app.panning_action is True: if self.app.panning_action is True:
self.app.panning_action = False self.app.panning_action = False
else: else:
self.app.cursor = QtGui.QCursor() if self.in_action is False:
self.app.ui.popMenu.popup(self.app.cursor.pos()) 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: except Exception as e:
log.warning("Error: %s" % str(e)) log.warning("Error: %s" % str(e))
raise raise
@@ -1866,7 +1983,7 @@ class FlatCAMGrbEditor(QtCore.QObject):
self.app.log.debug("on_shape_complete()") self.app.log.debug("on_shape_complete()")
# Add shape # Add shape
self.add_shape(self.active_tool.geometry) self.add_gerber_shape(self.active_tool.geometry)
# Remove any utility shapes # Remove any utility shapes
self.delete_utility_geometry() self.delete_utility_geometry()
@@ -1956,6 +2073,15 @@ class FlatCAMGrbEditor(QtCore.QObject):
self.select_tool('move') self.select_tool('move')
return 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): def on_buffer(self):
buff_value = 0.01 buff_value = 0.01
log.debug("FlatCAMGrbEditor.on_buffer()") log.debug("FlatCAMGrbEditor.on_buffer()")

View File

@@ -451,18 +451,25 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.exc_move_drill_menuitem = self.exc_editor_menu.addAction( self.exc_move_drill_menuitem = self.exc_editor_menu.addAction(
QtGui.QIcon('share/move32.png'),_( 'Move Drill(s)\tM')) QtGui.QIcon('share/move32.png'),_( 'Move Drill(s)\tM'))
### APPLICATION GERBER EDITOR MENU ###
self.grb_editor_menu = QtWidgets.QMenu(_(">Gerber Editor<")) self.grb_editor_menu = QtWidgets.QMenu(_(">Gerber Editor<"))
self.menu.addMenu(self.grb_editor_menu) self.menu.addMenu(self.grb_editor_menu)
self.grb_add_trace_menuitem = self.grb_editor_menu.addAction( self.grb_add_pad_menuitem = self.grb_editor_menu.addAction(
QtGui.QIcon('share/rectangle32.png'), _('Add Trace\tT')) QtGui.QIcon('share/aperture16.png'), _('Add Pad\tP'))
self.grb_add_zone_menuitem = self.exc_editor_menu.addAction(QtGui.QIcon('share/plus16.png'), self.grb_add_track_menuitem = self.grb_editor_menu.addAction(
_('Add Zone\tZ')) 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_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_copy_menuitem = self.grb_editor_menu.addAction(QtGui.QIcon('share/copy32.png'), _('Copy\tC'))
self.grb_delete_menuitem = self.grb_editor_menu.addAction( self.grb_delete_menuitem = self.grb_editor_menu.addAction(
QtGui.QIcon('share/deleteshape32.png'), _('Delete\tDEL') 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.menuAction().setVisible(False)
self.exc_editor_menu.setDisabled(True) self.exc_editor_menu.setDisabled(True)
################################ ################################
### Project Tab Context menu ### ### Project Tab Context menu ###
################################ ################################
@@ -630,7 +636,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.exc_edit_toolbar.addSeparator() self.exc_edit_toolbar.addSeparator()
self.copy_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _('Copy Drill')) 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.exc_edit_toolbar.addSeparator()
self.move_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move Drill")) 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_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_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 '-'")) _("Delete Shape '-'"))
self.geo_transform_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/transform.png'), self.geo_transform_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/transform.png'),
_("Transformations")) _("Transformations"))
@@ -670,12 +676,20 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
### Gerber Editor Toolbar ### ### Gerber Editor Toolbar ###
self.grb_select_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select")) 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_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.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_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")) self.aperture_move_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move"))
### Snap Toolbar ### ### Snap Toolbar ###
# Snap GRID toolbar is always active to facilitate usage of measurements done on GRID # Snap GRID toolbar is always active to facilitate usage of measurements done on GRID
# self.addToolBar(self.snap_toolbar) # 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.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_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_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_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.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")) 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) self.restoreState(saved_gui_state)
log.debug("FlatCAMGUI.__init__() --> UI state restored.") log.debug("FlatCAMGUI.__init__() --> UI state restored.")
settings = QSettings("Open Source", "FlatCAM")
if settings.contains("layout"): if settings.contains("layout"):
layout = settings.value('layout', type=str) layout = settings.value('layout', type=str)
if layout == 'standard': if layout == 'standard':
@@ -1622,6 +1639,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.corner_snap_btn.setVisible(True) self.corner_snap_btn.setVisible(True)
self.snap_magnet.setDisabled(True) self.snap_magnet.setDisabled(True)
self.corner_snap_btn.setDisabled(True) self.corner_snap_btn.setDisabled(True)
log.debug("FlatCAMGUI.__init__() --> UI layout restored from QSettings.")
else: else:
self.exc_edit_toolbar.setVisible(False) self.exc_edit_toolbar.setVisible(False)
self.exc_edit_toolbar.setDisabled(True) self.exc_edit_toolbar.setDisabled(True)
@@ -1632,6 +1650,11 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.corner_snap_btn.setVisible(False) self.corner_snap_btn.setVisible(False)
self.snap_magnet.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): def eventFilter(self, obj, event):
if self.general_defaults_form.general_app_group.toggle_tooltips_cb.get_value() is False: 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.exc_edit_toolbar.addSeparator()
self.copy_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/copy32.png'), _('Copy Drill')) 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")) _("Delete Drill"))
self.exc_edit_toolbar.addSeparator() self.exc_edit_toolbar.addSeparator()
@@ -1735,7 +1758,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.geo_edit_toolbar.addSeparator() self.geo_edit_toolbar.addSeparator()
self.geo_cutpath_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/cutpath32.png'), _('Cut Path')) 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_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")) _("Delete Shape"))
self.geo_transform_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/transform.png'), self.geo_transform_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/transform.png'),
_("Transformations")) _("Transformations"))
@@ -1745,7 +1768,19 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
### Gerber Editor Toolbar ### ### Gerber Editor Toolbar ###
self.grb_select_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select")) 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 Toolbar ###
# Snap GRID toolbar is always active to facilitate usage of measurements done on GRID # 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: if self.app.grb_editor.selected:
self.app.inform.emit(_("Click on target point.")) self.app.inform.emit(_("Click on target point."))
self.app.ui.aperture_copy_btn.setChecked(True) 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.active_tool.set_origin(
(self.app.grb_editor.snap_x, self.app.grb_editor.snap_y)) (self.app.grb_editor.snap_x, self.app.grb_editor.snap_y))
else: else:
self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to copy.")) self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to copy."))
return 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 # Scale Tool
if key == QtCore.Qt.Key_B or key == 'B': if key == QtCore.Qt.Key_B or key == 'B':
self.app.grb_editor.launched_from_shortcuts = True self.app.grb_editor.launched_from_shortcuts = True
self.app.grb_editor.select_tool('aperture_buffer') self.app.grb_editor.select_tool('buffer')
return return
# Grid Snap # Grid Snap
@@ -2516,17 +2540,35 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
if self.app.grb_editor.selected: if self.app.grb_editor.selected:
self.app.inform.emit(_("Click on target point.")) self.app.inform.emit(_("Click on target point."))
self.app.ui.aperture_move_btn.setChecked(True) 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.active_tool.set_origin(
(self.app.grb_editor.snap_x, self.app.grb_editor.snap_y)) (self.app.grb_editor.snap_x, self.app.grb_editor.snap_y))
else: else:
self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to move.")) self.app.inform.emit(_("[WARNING_NOTCL] Cancelled. Nothing selected to move."))
return 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 # Scale Tool
if key == QtCore.Qt.Key_S or key == 'S': if key == QtCore.Qt.Key_S or key == 'S':
self.app.grb_editor.launched_from_shortcuts = True self.app.grb_editor.launched_from_shortcuts = True
self.app.grb_editor.select_tool('aperture_scale') self.app.grb_editor.select_tool('scale')
return return
# Add Track # Add Track
@@ -2534,6 +2576,7 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.app.grb_editor.launched_from_shortcuts = True self.app.grb_editor.launched_from_shortcuts = True
## Current application units in Upper Case ## Current application units in Upper Case
self.units = self.general_defaults_group.general_app_group.units_radio.get_value().upper() self.units = self.general_defaults_group.general_app_group.units_radio.get_value().upper()
self.app.grb_editor.select_tool('track')
return return
# Zoom Fit # Zoom Fit

BIN
share/aperture16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 377 B

BIN
share/track32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 342 B