From 0b96cbbac17735ffc3f67f55cee01cfc30319989 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Sat, 2 Feb 2019 18:26:01 +0200 Subject: [PATCH] - code cleanup in Tools - some GUI structure optimization's --- FlatCAMGUI.py | 157 ++++++++++++++++++++++++----- ObjectCollection.py | 139 ++++++++++++------------- README.md | 6 +- flatcamTools/ToolCalculators.py | 5 +- flatcamTools/ToolCutout.py | 19 ++-- flatcamTools/ToolDblSided.py | 16 ++- flatcamTools/ToolFilm.py | 15 +-- flatcamTools/ToolImage.py | 13 ++- flatcamTools/ToolMeasurement.py | 34 ++++--- flatcamTools/ToolMove.py | 64 ++++++------ flatcamTools/ToolNonCopperClear.py | 14 ++- flatcamTools/ToolPaint.py | 13 ++- flatcamTools/ToolPanelize.py | 37 ++++--- flatcamTools/ToolProperties.py | 11 +- flatcamTools/ToolTransform.py | 15 +-- 15 files changed, 350 insertions(+), 208 deletions(-) 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())