diff --git a/FlatCAMGUI.py b/FlatCAMGUI.py
index 12fdbacb..4cc239a6 100644
--- a/FlatCAMGUI.py
+++ b/FlatCAMGUI.py
@@ -384,6 +384,24 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.menuproject.addSeparator()
self.menuprojectproperties = self.menuproject.addAction(QtGui.QIcon('share/properties32.png'), 'Properties')
+ ################
+ ### Splitter ###
+ ################
+
+ # IMPORTANT #
+ # The order: SPITTER -> NOTEBOOK -> SNAP TOOLBAR is important and without it the GUI will not be initialized as
+ # desired.
+ self.splitter = QtWidgets.QSplitter()
+ self.setCentralWidget(self.splitter)
+
+ self.notebook = QtWidgets.QTabWidget()
+ self.splitter.addWidget(self.notebook)
+
+ self.splitter_left = QtWidgets.QSplitter(Qt.Vertical)
+ self.splitter.addWidget(self.splitter_left)
+ self.splitter_left.addWidget(self.notebook)
+ self.splitter_left.setHandleWidth(0)
+
###############
### Toolbar ###
###############
@@ -408,24 +426,6 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.geo_edit_toolbar.setObjectName('GeoEditor_TB')
self.addToolBar(self.geo_edit_toolbar)
- ################
- ### Splitter ###
- ################
-
- # IMPORTANT #
- # The order: SPITTER -> NOTEBOOK -> SNAP TOOLBAR is important and without it the GUI will not be initialized as
- # desired.
- self.splitter = QtWidgets.QSplitter()
- self.setCentralWidget(self.splitter)
-
- self.notebook = QtWidgets.QTabWidget()
- self.splitter.addWidget(self.notebook)
-
- self.splitter_left = QtWidgets.QSplitter(Qt.Vertical)
- self.splitter.addWidget(self.splitter_left)
- self.splitter_left.addWidget(self.notebook)
- self.splitter_left.setHandleWidth(0)
-
self.snap_toolbar = QtWidgets.QToolBar('Grid Toolbar')
self.snap_toolbar.setObjectName('Snap_TB')
@@ -440,8 +440,114 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
else:
self.addToolBar(self.snap_toolbar)
- # add the actions/widgets to the toolbars
- self.populate_toolbars()
+ ### File Toolbar ###
+ self.file_open_gerber_btn = self.toolbarfile.addAction(QtGui.QIcon('share/flatcam_icon32.png'),
+ "Open GERBER")
+ self.file_open_excellon_btn = self.toolbarfile.addAction(QtGui.QIcon('share/drill32.png'), "Open EXCELLON")
+ self.toolbarfile.addSeparator()
+ self.file_open_btn = self.toolbarfile.addAction(QtGui.QIcon('share/folder32.png'), "Open project")
+ self.file_save_btn = self.toolbarfile.addAction(QtGui.QIcon('share/floppy32.png'), "Save project")
+
+ ### Edit Toolbar ###
+ self.newgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_geo32_bis.png'), "New Blank Geometry")
+ self.newexc_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_exc32.png'), "New Blank Excellon")
+ self.toolbargeo.addSeparator()
+ self.editgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/edit32.png'), "Editor")
+ self.update_obj_btn = self.toolbargeo.addAction(
+ QtGui.QIcon('share/edit_ok32_bis.png'), "Save Object and close the Editor"
+ )
+
+ self.toolbargeo.addSeparator()
+ self.delete_btn = self.toolbargeo.addAction(QtGui.QIcon('share/cancel_edit32.png'), "&Delete")
+
+ ### View Toolbar ###
+ self.replot_btn = self.toolbarview.addAction(QtGui.QIcon('share/replot32.png'), "&Replot")
+ self.clear_plot_btn = self.toolbarview.addAction(QtGui.QIcon('share/clear_plot32.png'), "&Clear plot")
+ self.zoom_in_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_in32.png'), "Zoom In")
+ self.zoom_out_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_out32.png'), "Zoom Out")
+ self.zoom_fit_btn = self.toolbarview.addAction(QtGui.QIcon('share/zoom_fit32.png'), "Zoom Fit")
+
+ # self.toolbarview.setVisible(False)
+
+ ### Tools Toolbar ###
+ self.shell_btn = self.toolbartools.addAction(QtGui.QIcon('share/shell32.png'), "&Command Line")
+
+ ### Drill Editor Toolbar ###
+ self.select_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), "Select 'Esc'")
+ self.add_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/plus16.png'), 'Add Drill Hole')
+ self.add_drill_array_btn = self.exc_edit_toolbar.addAction(
+ QtGui.QIcon('share/addarray16.png'), 'Add Drill Hole Array')
+ self.resize_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/resize16.png'), 'Resize Drill')
+ 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.exc_edit_toolbar.addSeparator()
+ self.move_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), "Move Drill")
+
+ ### Geometry Editor Toolbar ###
+ self.geo_select_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), "Select 'Esc'")
+ self.geo_add_circle_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/circle32.png'), 'Add Circle')
+ self.geo_add_arc_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/arc32.png'), 'Add Arc')
+ self.geo_add_rectangle_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/rectangle32.png'),
+ 'Add Rectangle')
+
+ self.geo_edit_toolbar.addSeparator()
+ self.geo_add_path_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/path32.png'), 'Add Path')
+ self.geo_add_polygon_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/polygon32.png'), 'Add Polygon')
+ self.geo_edit_toolbar.addSeparator()
+ self.geo_add_text_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/text32.png'), 'Add Text')
+ self.geo_add_buffer_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/buffer16-2.png'), 'Add Buffer')
+ self.geo_add_paint_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/paint20_1.png'), 'Paint Shape')
+
+ self.geo_edit_toolbar.addSeparator()
+ self.geo_union_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/union32.png'), 'Polygon Union')
+ self.geo_intersection_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/intersection32.png'),
+ 'Polygon Intersection')
+ self.geo_subtract_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/subtract32.png'),
+ 'Polygon Subtraction')
+
+ 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 'c'")
+ self.geo_rotate_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/rotate.png'), "Rotate Objects 'Space'")
+ self.geo_delete_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/deleteshape32.png'),
+ "Delete Shape '-'")
+
+ self.geo_edit_toolbar.addSeparator()
+ self.geo_move_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), "Move Objects 'm'")
+
+ ### Snap Toolbar ###
+ # Snap GRID toolbar is always active to facilitate usage of measurements done on GRID
+ # self.addToolBar(self.snap_toolbar)
+
+ self.grid_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/grid32.png'), 'Snap to grid')
+ self.grid_gap_x_entry = FCEntry2()
+ self.grid_gap_x_entry.setMaximumWidth(70)
+ self.grid_gap_x_entry.setToolTip("Grid X distance")
+ self.snap_toolbar.addWidget(self.grid_gap_x_entry)
+
+ self.grid_gap_y_entry = FCEntry2()
+ self.grid_gap_y_entry.setMaximumWidth(70)
+ self.grid_gap_y_entry.setToolTip("Grid Y distance")
+ self.snap_toolbar.addWidget(self.grid_gap_y_entry)
+
+ self.grid_space_label = QtWidgets.QLabel(" ")
+ self.snap_toolbar.addWidget(self.grid_space_label)
+ self.grid_gap_link_cb = FCCheckBox()
+ self.grid_gap_link_cb.setToolTip("When active, value on Grid_X\n"
+ "is copied to the Grid_Y value.")
+ self.snap_toolbar.addWidget(self.grid_gap_link_cb)
+
+ self.ois_grid = OptionalInputSection(self.grid_gap_link_cb, [self.grid_gap_y_entry], logic=False)
+
+ self.corner_snap_btn = self.snap_toolbar.addAction(QtGui.QIcon('share/corner32.png'), 'Snap to corner')
+
+ self.snap_max_dist_entry = FCEntry()
+ self.snap_max_dist_entry.setMaximumWidth(70)
+ self.snap_max_dist_entry.setToolTip("Max. magnet distance")
+ self.snap_magnet = self.snap_toolbar.addWidget(self.snap_max_dist_entry)
################
@@ -897,6 +1003,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
# start with GRID activated
self.grid_snap_btn.trigger()
+ self.g_editor_cmenu.setEnabled(False)
+ self.e_editor_cmenu.setEnabled(False)
+
# restore the Toolbar State from file
settings = QSettings("Open Source", "FlatCAM")
if settings.contains("saved_gui_state"):
@@ -912,9 +1021,6 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.geo_edit_toolbar.setVisible(False)
self.geo_edit_toolbar.setDisabled(True)
- self.g_editor_cmenu.setEnabled(False)
- self.e_editor_cmenu.setEnabled(False)
-
self.corner_snap_btn.setVisible(False)
self.snap_magnet.setVisible(False)
elif theme == 'compact':
@@ -922,15 +1028,14 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
self.geo_edit_toolbar.setDisabled(True)
self.snap_magnet.setVisible(True)
self.corner_snap_btn.setVisible(True)
+ self.snap_magnet.setDisabled(True)
+ self.corner_snap_btn.setDisabled(True)
else:
self.exc_edit_toolbar.setVisible(False)
self.exc_edit_toolbar.setDisabled(True)
self.geo_edit_toolbar.setVisible(False)
self.geo_edit_toolbar.setDisabled(True)
- self.g_editor_cmenu.setEnabled(False)
- self.e_editor_cmenu.setEnabled(False)
-
self.corner_snap_btn.setVisible(False)
self.snap_magnet.setVisible(False)
diff --git a/ObjectCollection.py b/ObjectCollection.py
index 9d8f4b6a..5a6f9744 100644
--- a/ObjectCollection.py
+++ b/ObjectCollection.py
@@ -46,57 +46,66 @@ class KeySensitiveListView(QtWidgets.QTreeView):
event.ignore()
def dragMoveEvent(self, event):
+ self.setDropIndicatorShown(True)
if event.mimeData().hasUrls:
event.accept()
else:
event.ignore()
def dropEvent(self, event):
- if event.mimeData().hasUrls:
- event.setDropAction(QtCore.Qt.CopyAction)
+ drop_indicator = self.dropIndicatorPosition()
+
+ m = event.mimeData()
+ if m.hasUrls:
event.accept()
- for url in event.mimeData().urls():
+
+ for url in m.urls():
self.filename = str(url.toLocalFile())
- if self.filename == "":
- self.app.inform.emit("Open cancelled.")
+ # file drop from outside application
+ if drop_indicator == QtWidgets.QAbstractItemView.OnItem:
+ if self.filename == "":
+ self.app.inform.emit("Open cancelled.")
+ else:
+ if self.filename.lower().rpartition('.')[-1] in self.app.grb_list:
+ self.app.worker_task.emit({'fcn': self.app.open_gerber,
+ 'params': [self.filename]})
+ else:
+ event.ignore()
+
+ if self.filename.lower().rpartition('.')[-1] in self.app.exc_list:
+ self.app.worker_task.emit({'fcn': self.app.open_excellon,
+ 'params': [self.filename]})
+ else:
+ event.ignore()
+
+ if self.filename.lower().rpartition('.')[-1] in self.app.gcode_list:
+ self.app.worker_task.emit({'fcn': self.app.open_gcode,
+ 'params': [self.filename]})
+ else:
+ event.ignore()
+
+ if self.filename.lower().rpartition('.')[-1] in self.app.svg_list:
+ object_type = 'geometry'
+ self.app.worker_task.emit({'fcn': self.app.import_svg,
+ 'params': [self.filename, object_type, None]})
+
+ if self.filename.lower().rpartition('.')[-1] in self.app.dxf_list:
+ object_type = 'geometry'
+ self.app.worker_task.emit({'fcn': self.app.import_dxf,
+ 'params': [self.filename, object_type, None]})
+
+ if self.filename.lower().rpartition('.')[-1] in self.app.prj_list:
+ # self.app.open_project() is not Thread Safe
+ self.app.open_project(self.filename)
+ else:
+ event.ignore()
else:
- if self.filename.lower().rpartition('.')[-1] in self.app.grb_list:
- self.app.worker_task.emit({'fcn': self.app.open_gerber,
- 'params': [self.filename]})
- else:
- event.ignore()
-
- if self.filename.lower().rpartition('.')[-1] in self.app.exc_list:
- self.app.worker_task.emit({'fcn': self.app.open_excellon,
- 'params': [self.filename]})
- else:
- event.ignore()
-
- if self.filename.lower().rpartition('.')[-1] in self.app.gcode_list:
- self.app.worker_task.emit({'fcn': self.app.open_gcode,
- 'params': [self.filename]})
- else:
- event.ignore()
-
- if self.filename.lower().rpartition('.')[-1] in self.app.svg_list:
- object_type = 'geometry'
- self.app.worker_task.emit({'fcn': self.app.import_svg,
- 'params': [self.filename, object_type, None]})
-
- if self.filename.lower().rpartition('.')[-1] in self.app.dxf_list:
- object_type = 'geometry'
- self.app.worker_task.emit({'fcn': self.app.import_dxf,
- 'params': [self.filename, object_type, None]})
-
- if self.filename.lower().rpartition('.')[-1] in self.app.prj_list:
- # self.app.open_project() is not Thread Safe
- self.app.open_project(self.filename)
- else:
- event.ignore()
+ pass
else:
event.ignore()
+
class TreeItem:
"""
Item of a tree model
@@ -221,9 +230,15 @@ class ObjectCollection(QtCore.QAbstractItemModel):
### View
self.view = KeySensitiveListView(app)
- self.view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
self.view.setModel(self)
+
self.view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
+ self.view.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
+ # self.view.setDragDropMode(QtWidgets.QAbstractItemView.InternalMove)
+ # self.view.setDragEnabled(True)
+ # self.view.setAcceptDrops(True)
+ # self.view.setDropIndicatorShown(True)
+
font = QtGui.QFont()
font.setPixelSize(12)
font.setFamily("Seagoe UI")
@@ -501,13 +516,13 @@ class ObjectCollection(QtCore.QAbstractItemModel):
if not self.hasIndex(row, column, parent):
return QtCore.QModelIndex()
- if not parent.isValid():
- parent_item = self.root_item
- else:
- parent_item = parent.internalPointer()
+ # if not parent.isValid():
+ # parent_item = self.root_item
+ # else:
+ # parent_item = parent.internalPointer()
+ parent_item = parent.internalPointer() if parent.isValid() else self.root_item
child_item = parent_item.child(row)
-
if child_item:
return self.createIndex(row, column, child_item)
else:
@@ -587,39 +602,27 @@ class ObjectCollection(QtCore.QAbstractItemModel):
"setData() --> Could not remove the old object name from auto-completer model list")
obj.build_ui()
- self.app.inform.emit("Object renamed from %s to %s" % (old_name, new_name))
+ self.app.inform.emit("Object renamed from %s to %s" % (old_name, new_name))
return True
+ def supportedDropActions(self):
+ return Qt.MoveAction
+
def flags(self, index):
+ default_flags = QtCore.QAbstractItemModel.flags(self, index)
+
if not index.isValid():
- return 0
+ return Qt.ItemIsEnabled | default_flags
# Prevent groups from selection
if not index.internalPointer().obj:
return Qt.ItemIsEnabled
else:
- return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable
+ return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsEditable | \
+ Qt.ItemIsDragEnabled | Qt.ItemIsDropEnabled
- return QtWidgets.QAbstractItemModel.flags(self, index)
-
- # def data(self, index, role=Qt.Qt.DisplayRole):
- # if not index.isValid() or not 0 <= index.row() < self.rowCount():
- # return QtCore.QVariant()
- # row = index.row()
- # if role == Qt.Qt.DisplayRole:
- # return self.object_list[row].options["name"]
- # if role == Qt.Qt.DecorationRole:
- # return self.icons[self.object_list[row].kind]
- # # if role == Qt.Qt.CheckStateRole:
- # # if row in self.checked_indexes:
- # # return Qt.Qt.Checked
- # # else:
- # # return Qt.Qt.Unchecked
-
- def print_list(self):
- for obj in self.get_list():
- print(obj)
+ # return QtWidgets.QAbstractItemModel.flags(self, index)
def append(self, obj, active=False):
FlatCAMApp.App.log.debug(str(inspect.stack()[1][3]) + " --> OC.append()")
@@ -629,8 +632,8 @@ class ObjectCollection(QtCore.QAbstractItemModel):
# Check promises and clear if exists
if name in self.promises:
self.promises.remove(name)
- FlatCAMApp.App.log.debug("Promised object %s became available." % name)
- FlatCAMApp.App.log.debug("%d promised objects remaining." % len(self.promises))
+ # FlatCAMApp.App.log.debug("Promised object %s became available." % name)
+ # FlatCAMApp.App.log.debug("%d promised objects remaining." % len(self.promises))
# Prevent same name
while name in self.get_names():
## Create a new name
diff --git a/README.md b/README.md
index dc90cbcb..7731a7f9 100644
--- a/README.md
+++ b/README.md
@@ -9,6 +9,11 @@ CAD program, and create G-Code for Isolation routing.
=================================================
+2.2.2019
+
+- code cleanup in Tools
+- some GUI structure optimization's
+
1.02.2019
- fixed postprocessor files so now the bounds values are right aligned (assuming max string length of 9 chars which means 4 digits and 4 decimals)
@@ -21,7 +26,6 @@ CAD program, and create G-Code for Isolation routing.
- replaced the pop-up window for the shortcut list with a new detachable tab
- removed the pop-up messages from the rotate, skew, flip commands
-
31.01.2019
- added a parameter ('Fast plunge' in Edit -> Preferences -> Geometry Options and Excellon Options) to control if the fast move to Z_move is done or not
diff --git a/flatcamTools/ToolCalculators.py b/flatcamTools/ToolCalculators.py
index 55c2ff51..6923fb51 100644
--- a/flatcamTools/ToolCalculators.py
+++ b/flatcamTools/ToolCalculators.py
@@ -212,17 +212,16 @@ class ToolCalculator(FlatCAMTool):
self.calculate_plate_button.clicked.connect(self.on_calculate_eplate)
- self.set_ui()
def run(self):
FlatCAMTool.run(self)
- self.set_ui()
+ self.set_tool_ui()
self.app.ui.notebook.setTabText(2, "Calc. Tool")
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+C', **kwargs)
- def set_ui(self):
+ def set_tool_ui(self):
## Initialize form
self.mm_entry.set_value('0')
self.inch_entry.set_value('0')
diff --git a/flatcamTools/ToolCutout.py b/flatcamTools/ToolCutout.py
index 4d2e7dbd..9ad71bb3 100644
--- a/flatcamTools/ToolCutout.py
+++ b/flatcamTools/ToolCutout.py
@@ -7,6 +7,7 @@ from GUIElements import IntEntry, RadioSet, LengthEntry
from FlatCAMObj import FlatCAMGeometry, FlatCAMExcellon, FlatCAMGerber
+
class ToolCutout(FlatCAMTool):
toolName = "Cutout PCB"
@@ -47,7 +48,6 @@ class ToolCutout(FlatCAMTool):
self.obj_combo = QtWidgets.QComboBox()
self.obj_combo.setModel(self.app.collection)
self.obj_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
- self.obj_combo.setCurrentIndex(1)
self.object_label = QtWidgets.QLabel("Object:")
self.object_label.setToolTip(
"Object to be cutout. "
@@ -172,11 +172,11 @@ class ToolCutout(FlatCAMTool):
self.layout.addStretch()
## Init GUI
- self.dia.set_value(1)
- self.margin.set_value(0)
- self.gapsize.set_value(1)
- self.gaps.set_value(4)
- self.gaps_rect_radio.set_value("4")
+ # self.dia.set_value(1)
+ # self.margin.set_value(0)
+ # self.gapsize.set_value(1)
+ # self.gaps.set_value(4)
+ # self.gaps_rect_radio.set_value("4")
## Signals
self.ff_cutout_object_btn.clicked.connect(self.on_freeform_cutout)
@@ -191,13 +191,16 @@ class ToolCutout(FlatCAMTool):
def run(self):
FlatCAMTool.run(self)
- self.set_ui()
+ self.set_tool_ui()
self.app.ui.notebook.setTabText(2, "Cutout Tool")
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+U', **kwargs)
- def set_ui(self):
+ def set_tool_ui(self):
+ self.reset_fields()
+ self.obj_combo.setCurrentIndex(1)
+
self.dia.set_value(float(self.app.defaults["tools_cutouttooldia"]))
self.margin.set_value(float(self.app.defaults["tools_cutoutmargin"]))
self.gapsize.set_value(float(self.app.defaults["tools_cutoutgapsize"]))
diff --git a/flatcamTools/ToolDblSided.py b/flatcamTools/ToolDblSided.py
index 475c3db3..9538dbf6 100644
--- a/flatcamTools/ToolDblSided.py
+++ b/flatcamTools/ToolDblSided.py
@@ -28,7 +28,6 @@ class DblSidedTool(FlatCAMTool):
self.gerber_object_combo = QtWidgets.QComboBox()
self.gerber_object_combo.setModel(self.app.collection)
self.gerber_object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
- self.gerber_object_combo.setCurrentIndex(1)
self.botlay_label = QtWidgets.QLabel("GERBER:")
self.botlay_label.setToolTip(
@@ -52,7 +51,6 @@ class DblSidedTool(FlatCAMTool):
self.exc_object_combo = QtWidgets.QComboBox()
self.exc_object_combo.setModel(self.app.collection)
self.exc_object_combo.setRootModelIndex(self.app.collection.index(1, 0, QtCore.QModelIndex()))
- self.exc_object_combo.setCurrentIndex(1)
self.excobj_label = QtWidgets.QLabel("EXCELLON:")
self.excobj_label.setToolTip(
@@ -249,20 +247,20 @@ class DblSidedTool(FlatCAMTool):
self.drill_values = ""
- self.set_ui()
-
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+D', **kwargs)
def run(self):
FlatCAMTool.run(self)
-
+ self.set_tool_ui()
self.app.ui.notebook.setTabText(2, "2-Sided Tool")
- self.reset_fields()
- self.set_ui()
- def set_ui(self):
- ## Initialize form
+ def set_tool_ui(self):
+ self.reset_fields()
+
+ self.gerber_object_combo.setCurrentIndex(1)
+ self.exc_object_combo.setCurrentIndex(1)
+
self.point_entry.set_value("")
self.alignment_holes.set_value("")
diff --git a/flatcamTools/ToolFilm.py b/flatcamTools/ToolFilm.py
index 94638ada..358083b0 100644
--- a/flatcamTools/ToolFilm.py
+++ b/flatcamTools/ToolFilm.py
@@ -43,7 +43,6 @@ class Film(FlatCAMTool):
self.tf_object_combo = QtWidgets.QComboBox()
self.tf_object_combo.setModel(self.app.collection)
self.tf_object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
- self.tf_object_combo.setCurrentIndex(1)
self.tf_object_label = QtWidgets.QLabel("Film Object:")
self.tf_object_label.setToolTip(
"Object for which to create the film."
@@ -75,7 +74,6 @@ class Film(FlatCAMTool):
self.tf_box_combo = QtWidgets.QComboBox()
self.tf_box_combo.setModel(self.app.collection)
self.tf_box_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
- self.tf_box_combo.setCurrentIndex(1)
self.tf_box_combo_label = QtWidgets.QLabel("Box Object:")
self.tf_box_combo_label.setToolTip(
@@ -136,10 +134,6 @@ class Film(FlatCAMTool):
self.tf_type_obj_combo.currentIndexChanged.connect(self.on_type_obj_index_changed)
self.tf_type_box_combo.currentIndexChanged.connect(self.on_type_box_index_changed)
- ## Initialize form
- self.film_type.set_value('neg')
- self.boundary_entry.set_value(0.0)
-
def on_type_obj_index_changed(self, index):
obj_type = self.tf_type_obj_combo.currentIndex()
self.tf_object_combo.setRootModelIndex(self.app.collection.index(obj_type, 0, QtCore.QModelIndex()))
@@ -152,11 +146,20 @@ class Film(FlatCAMTool):
def run(self):
FlatCAMTool.run(self)
+ self.set_tool_ui()
self.app.ui.notebook.setTabText(2, "Film Tool")
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='ALT+L', **kwargs)
+ def set_tool_ui(self):
+ self.reset_fields()
+
+ self.tf_object_combo.setCurrentIndex(1)
+ self.tf_box_combo.setCurrentIndex(1)
+ self.film_type.set_value('neg')
+ self.boundary_entry.set_value(0.0)
+
def on_film_creation(self):
try:
name = self.tf_object_combo.currentText()
diff --git a/flatcamTools/ToolImage.py b/flatcamTools/ToolImage.py
index 39761080..1c495c9e 100644
--- a/flatcamTools/ToolImage.py
+++ b/flatcamTools/ToolImage.py
@@ -124,6 +124,15 @@ class ToolImage(FlatCAMTool):
## Signals
self.import_button.clicked.connect(self.on_file_importimage)
+ def run(self):
+ FlatCAMTool.run(self)
+ self.set_tool_ui()
+ self.app.ui.notebook.setTabText(2, "Image Tool")
+
+ def install(self, icon=None, separator=None, **kwargs):
+ FlatCAMTool.install(self, icon, separator, **kwargs)
+
+ def set_tool_ui(self):
## Initialize form
self.dpi_entry.set_value(96)
self.image_type.set_value('black')
@@ -132,10 +141,6 @@ class ToolImage(FlatCAMTool):
self.mask_g_entry.set_value(250)
self.mask_b_entry.set_value(250)
- def run(self):
- FlatCAMTool.run(self)
- self.app.ui.notebook.setTabText(2, "Image Tool")
-
def on_file_importimage(self):
"""
Callback for menu item File->Import IMAGE.
diff --git a/flatcamTools/ToolMeasurement.py b/flatcamTools/ToolMeasurement.py
index b786ad88..30b04d6a 100644
--- a/flatcamTools/ToolMeasurement.py
+++ b/flatcamTools/ToolMeasurement.py
@@ -154,9 +154,15 @@ class Measurement(FlatCAMTool):
def run(self):
if self.app.tool_tab_locked is True:
return
-
self.toggle()
+ self.set_tool_ui()
+ self.app.ui.notebook.setTabText(2, "Meas. Tool")
+
+ def install(self, icon=None, separator=None, **kwargs):
+ FlatCAMTool.install(self, icon, separator, shortcut='CTRL+M', **kwargs)
+
+ def set_tool_ui(self):
# Remove anything else in the GUI
self.app.ui.tool_scroll_area.takeWidget()
@@ -167,21 +173,6 @@ class Measurement(FlatCAMTool):
self.app.ui.notebook.setCurrentWidget(self.app.ui.tool_tab)
self.units = self.app.general_options_form.general_app_group.units_radio.get_value().lower()
self.show()
- self.app.ui.notebook.setTabText(2, "Meas. Tool")
-
- def install(self, icon=None, separator=None, **kwargs):
- FlatCAMTool.install(self, icon, separator, shortcut='CTRL+M', **kwargs)
-
- def on_key_release_meas(self, event):
- if event.key == 'escape':
- # abort the measurement action
- self.toggle()
- return
-
- if event.key == 'G':
- # toggle grid status
- self.app.ui.grid_snap_btn.trigger()
- return
def toggle(self):
# the self.active var is doing the 'toggle'
@@ -264,6 +255,17 @@ class Measurement(FlatCAMTool):
self.app.inform.emit("MEASURING: Click on the Start point ...")
+ def on_key_release_meas(self, event):
+ if event.key == 'escape':
+ # abort the measurement action
+ self.toggle()
+ return
+
+ if event.key == 'G':
+ # toggle grid status
+ self.app.ui.grid_snap_btn.trigger()
+ return
+
def on_click_meas(self, event):
# mouse click will be accepted only if the left button is clicked
# this is necessary because right mouse click and middle mouse click
diff --git a/flatcamTools/ToolMove.py b/flatcamTools/ToolMove.py
index b7fd1e2e..6fa74a62 100644
--- a/flatcamTools/ToolMove.py
+++ b/flatcamTools/ToolMove.py
@@ -38,6 +38,38 @@ class ToolMove(FlatCAMTool):
return
self.toggle()
+ def toggle(self):
+ if self.isVisible():
+ self.setVisible(False)
+
+ self.app.plotcanvas.vis_disconnect('mouse_move', self.on_move)
+ self.app.plotcanvas.vis_disconnect('mouse_press', self.on_left_click)
+ self.app.plotcanvas.vis_disconnect('key_release', self.on_key_press)
+ self.app.plotcanvas.vis_connect('key_press', self.app.on_key_over_plot)
+
+ self.clicked_move = 0
+
+ # signal that there is no command active
+ self.app.command_active = None
+
+ # delete the selection box
+ self.delete_shape()
+ return
+ else:
+ self.setVisible(True)
+ # signal that there is a command active and it is 'Move'
+ self.app.command_active = "Move"
+
+ if self.app.collection.get_selected():
+ self.app.inform.emit("MOVE: Click on the Start point ...")
+ # draw the selection box
+ self.draw_sel_bbox()
+ else:
+ self.setVisible(False)
+ # signal that there is no command active
+ self.app.command_active = None
+ self.app.inform.emit("[warning_notcl]MOVE action cancelled. No object(s) to move.")
+
def on_left_click(self, event):
# mouse click will be accepted only if the left button is clicked
# this is necessary because right mouse click and middle mouse click
@@ -146,38 +178,6 @@ class ToolMove(FlatCAMTool):
self.toggle()
return
- def toggle(self):
- if self.isVisible():
- self.setVisible(False)
-
- self.app.plotcanvas.vis_disconnect('mouse_move', self.on_move)
- self.app.plotcanvas.vis_disconnect('mouse_press', self.on_left_click)
- self.app.plotcanvas.vis_disconnect('key_release', self.on_key_press)
- self.app.plotcanvas.vis_connect('key_press', self.app.on_key_over_plot)
-
- self.clicked_move = 0
-
- # signal that there is no command active
- self.app.command_active = None
-
- # delete the selection box
- self.delete_shape()
- return
- else:
- self.setVisible(True)
- # signal that there is a command active and it is 'Move'
- self.app.command_active = "Move"
-
- if self.app.collection.get_selected():
- self.app.inform.emit("MOVE: Click on the Start point ...")
- # draw the selection box
- self.draw_sel_bbox()
- else:
- self.setVisible(False)
- # signal that there is no command active
- self.app.command_active = None
- self.app.inform.emit("[warning_notcl]MOVE action cancelled. No object(s) to move.")
-
def draw_sel_bbox(self):
xminlist = []
yminlist = []
diff --git a/flatcamTools/ToolNonCopperClear.py b/flatcamTools/ToolNonCopperClear.py
index 7cd4bd70..f23f8a2d 100644
--- a/flatcamTools/ToolNonCopperClear.py
+++ b/flatcamTools/ToolNonCopperClear.py
@@ -34,7 +34,6 @@ class NonCopperClear(FlatCAMTool, Gerber):
self.object_combo = QtWidgets.QComboBox()
self.object_combo.setModel(self.app.collection)
self.object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
- self.object_combo.setCurrentIndex(1)
self.object_label = QtWidgets.QLabel("Gerber:")
self.object_label.setToolTip(
"Gerber object to be cleared of excess copper. "
@@ -238,12 +237,15 @@ class NonCopperClear(FlatCAMTool, Gerber):
def run(self):
FlatCAMTool.run(self)
- self.tools_frame.show()
- self.set_ui()
+ self.set_tool_ui()
self.build_ui()
self.app.ui.notebook.setTabText(2, "NCC Tool")
- def set_ui(self):
+ def set_tool_ui(self):
+ self.tools_frame.show()
+
+ self.object_combo.setCurrentIndex(1)
+
self.ncc_overlap_entry.set_value(self.app.defaults["tools_nccoverlap"])
self.ncc_margin_entry.set_value(self.app.defaults["tools_nccmargin"])
self.ncc_method_radio.set_value(self.app.defaults["tools_nccmethod"])
@@ -882,3 +884,7 @@ class NonCopperClear(FlatCAMTool, Gerber):
# Background
self.app.worker_task.emit({'fcn': job_thread, 'params': [self.app]})
+
+ def reset_fields(self):
+ self.object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
+
diff --git a/flatcamTools/ToolPaint.py b/flatcamTools/ToolPaint.py
index 1bf3551a..fca21e4f 100644
--- a/flatcamTools/ToolPaint.py
+++ b/flatcamTools/ToolPaint.py
@@ -32,7 +32,6 @@ class ToolPaint(FlatCAMTool, Gerber):
self.object_combo = QtWidgets.QComboBox()
self.object_combo.setModel(self.app.collection)
self.object_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex()))
- self.object_combo.setCurrentIndex(1)
self.object_label = QtWidgets.QLabel("Geometry:")
self.object_label.setToolTip(
"Geometry object to be painted. "
@@ -295,8 +294,7 @@ class ToolPaint(FlatCAMTool, Gerber):
def run(self):
FlatCAMTool.run(self)
- self.tools_frame.show()
- self.set_ui()
+ self.set_tool_ui()
self.app.ui.notebook.setTabText(2, "Paint Tool")
def on_radio_selection(self):
@@ -320,7 +318,11 @@ class ToolPaint(FlatCAMTool, Gerber):
self.deltool_btn.setDisabled(False)
self.tools_table.setContextMenuPolicy(Qt.ActionsContextMenu)
- def set_ui(self):
+ def set_tool_ui(self):
+ self.tools_frame.show()
+ self.reset_fields()
+ self.object_combo.setCurrentIndex(1)
+
## Init the GUI interface
self.paintmargin_entry.set_value(self.default_data["paintmargin"])
self.paintmethod_combo.set_value(self.default_data["paintmethod"])
@@ -1125,3 +1127,6 @@ class ToolPaint(FlatCAMTool, Gerber):
# Background
self.app.worker_task.emit({'fcn': job_thread, 'params': [self.app]})
+
+ def reset_fields(self):
+ self.object_combo.setRootModelIndex(self.app.collection.index(2, 0, QtCore.QModelIndex()))
diff --git a/flatcamTools/ToolPanelize.py b/flatcamTools/ToolPanelize.py
index cdad3943..a37d75bf 100644
--- a/flatcamTools/ToolPanelize.py
+++ b/flatcamTools/ToolPanelize.py
@@ -43,7 +43,6 @@ class Panelize(FlatCAMTool):
self.object_combo = QtWidgets.QComboBox()
self.object_combo.setModel(self.app.collection)
self.object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
- self.object_combo.setCurrentIndex(1)
self.object_label = QtWidgets.QLabel("Object:")
self.object_label.setToolTip(
"Object to be panelized. This means that it will\n"
@@ -75,7 +74,6 @@ class Panelize(FlatCAMTool):
self.box_combo = QtWidgets.QComboBox()
self.box_combo.setModel(self.app.collection)
self.box_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
- self.box_combo.setCurrentIndex(1)
self.box_combo_label = QtWidgets.QLabel("Box Object:")
self.box_combo_label.setToolTip(
"The actual object that is used a container for the\n "
@@ -85,7 +83,6 @@ class Panelize(FlatCAMTool):
## Spacing Columns
self.spacing_columns = FloatEntry()
- self.spacing_columns.set_value(0.0)
self.spacing_columns_label = QtWidgets.QLabel("Spacing cols:")
self.spacing_columns_label.setToolTip(
"Spacing between columns of the desired panel.\n"
@@ -95,7 +92,6 @@ class Panelize(FlatCAMTool):
## Spacing Rows
self.spacing_rows = FloatEntry()
- self.spacing_rows.set_value(0.0)
self.spacing_rows_label = QtWidgets.QLabel("Spacing rows:")
self.spacing_rows_label.setToolTip(
"Spacing between rows of the desired panel.\n"
@@ -105,7 +101,6 @@ class Panelize(FlatCAMTool):
## Columns
self.columns = IntEntry()
- self.columns.set_value(1)
self.columns_label = QtWidgets.QLabel("Columns:")
self.columns_label.setToolTip(
"Number of columns of the desired panel"
@@ -114,7 +109,6 @@ class Panelize(FlatCAMTool):
## Rows
self.rows = IntEntry()
- self.rows.set_value(1)
self.rows_label = QtWidgets.QLabel("Rows:")
self.rows_label.setToolTip(
"Number of rows of the desired panel"
@@ -133,7 +127,6 @@ class Panelize(FlatCAMTool):
form_layout.addRow(self.constrain_cb)
self.x_width_entry = FloatEntry()
- self.x_width_entry.set_value(0.0)
self.x_width_lbl = QtWidgets.QLabel("Width (DX):")
self.x_width_lbl.setToolTip(
"The width (DX) within which the panel must fit.\n"
@@ -142,7 +135,6 @@ class Panelize(FlatCAMTool):
form_layout.addRow(self.x_width_lbl, self.x_width_entry)
self.y_height_entry = FloatEntry()
- self.y_height_entry.set_value(0.0)
self.y_height_lbl = QtWidgets.QLabel("Height (DY):")
self.y_height_lbl.setToolTip(
"The height (DY)within which the panel must fit.\n"
@@ -183,6 +175,28 @@ class Panelize(FlatCAMTool):
# flag to signal the constrain was activated
self.constrain_flag = False
+ def run(self):
+ FlatCAMTool.run(self)
+ self.set_tool_ui()
+ self.app.ui.notebook.setTabText(2, "Panel. Tool")
+
+ def install(self, icon=None, separator=None, **kwargs):
+ FlatCAMTool.install(self, icon, separator, shortcut='ALT+Z', **kwargs)
+
+ def set_tool_ui(self):
+ self.reset_fields()
+ self.object_combo.setCurrentIndex(1)
+ self.box_combo.setCurrentIndex(1)
+
+ self.spacing_columns.set_value(0.0)
+ self.spacing_rows.set_value(0.0)
+
+ self.rows.set_value(1)
+ self.columns.set_value(1)
+
+ self.x_width_entry.set_value(0.0)
+ self.y_height_entry.set_value(0.0)
+
def on_type_obj_index_changed(self):
obj_type = self.type_obj_combo.currentIndex()
self.object_combo.setRootModelIndex(self.app.collection.index(obj_type, 0, QtCore.QModelIndex()))
@@ -193,13 +207,6 @@ class Panelize(FlatCAMTool):
self.box_combo.setRootModelIndex(self.app.collection.index(obj_type, 0, QtCore.QModelIndex()))
self.box_combo.setCurrentIndex(0)
- def run(self):
- FlatCAMTool.run(self)
- self.app.ui.notebook.setTabText(2, "Panel. Tool")
-
- def install(self, icon=None, separator=None, **kwargs):
- FlatCAMTool.install(self, icon, separator, shortcut='ALT+Z', **kwargs)
-
def on_panelize(self):
name = self.object_combo.currentText()
diff --git a/flatcamTools/ToolProperties.py b/flatcamTools/ToolProperties.py
index 06222f8a..1d4f3ec8 100644
--- a/flatcamTools/ToolProperties.py
+++ b/flatcamTools/ToolProperties.py
@@ -45,17 +45,18 @@ class Properties(FlatCAMTool):
if self.app.tool_tab_locked is True:
return
-
- # this reset the TreeWidget
- self.treeWidget.clear()
- self.properties_frame.show()
-
+ self.set_tool_ui()
FlatCAMTool.run(self)
self.properties()
def install(self, icon=None, separator=None, **kwargs):
FlatCAMTool.install(self, icon, separator, shortcut='P', **kwargs)
+ def set_tool_ui(self):
+ # this reset the TreeWidget
+ self.treeWidget.clear()
+ self.properties_frame.show()
+
def properties(self):
obj_list = self.app.collection.get_selected()
if not obj_list:
diff --git a/flatcamTools/ToolTransform.py b/flatcamTools/ToolTransform.py
index 7d641494..4ef0568f 100644
--- a/flatcamTools/ToolTransform.py
+++ b/flatcamTools/ToolTransform.py
@@ -355,7 +355,15 @@ class ToolTransform(FlatCAMTool):
self.offx_entry.returnPressed.connect(self.on_offx)
self.offy_entry.returnPressed.connect(self.on_offy)
+ def run(self):
+ FlatCAMTool.run(self)
+ self.set_tool_ui()
+ self.app.ui.notebook.setTabText(2, "Transform Tool")
+ def install(self, icon=None, separator=None, **kwargs):
+ FlatCAMTool.install(self, icon, separator, shortcut='ALT+R', **kwargs)
+
+ def set_tool_ui(self):
## Initialize form
self.rotate_entry.set_value('0')
self.skewx_entry.set_value('0')
@@ -366,13 +374,6 @@ class ToolTransform(FlatCAMTool):
self.offy_entry.set_value('0')
self.flip_ref_cb.setChecked(False)
- def run(self):
- FlatCAMTool.run(self)
- self.app.ui.notebook.setTabText(2, "Transform Tool")
-
- def install(self, icon=None, separator=None, **kwargs):
- FlatCAMTool.install(self, icon, separator, shortcut='ALT+R', **kwargs)
-
def on_rotate(self):
try:
value = float(self.rotate_entry.get_value())