Explorar o código

- small GUI changes in Optimal Tool and in Film Tool
- some PEP8 corrections
- some code annotations to make it easier to navigate in the FlatCAMGUI.py
- fixed exit FullScreen with Escape key

Marius Stanciu %!s(int64=6) %!d(string=hai) anos
pai
achega
6d2ed26e0e
Modificáronse 6 ficheiros con 203 adicións e 255 borrados
  1. 10 11
      FlatCAMApp.py
  2. 15 16
      FlatCAMObj.py
  3. 5 0
      README.md
  4. 137 174
      flatcamGUI/FlatCAMGUI.py
  5. 1 0
      flatcamTools/ToolFilm.py
  6. 35 54
      flatcamTools/ToolOptimal.py

+ 10 - 11
FlatCAMApp.py

@@ -5169,7 +5169,6 @@ class App(QtCore.QObject):
         obj_name_single = str(name) if name else "Combo_SingleGeo"
         obj_name_multi = str(name) if name else "Combo_MultiGeo"
 
-        tooldias = []
         geo_type_list = set()
 
         objs = self.collection.get_selected()
@@ -5691,10 +5690,10 @@ class App(QtCore.QObject):
         self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(
             lambda: self.on_toggle_units(no_pref=False))
 
-    def on_fullscreen(self):
+    def on_fullscreen(self, disable=False):
         self.report_usage("on_fullscreen()")
 
-        if self.toggle_fscreen is False:
+        if self.toggle_fscreen is False and disable is False:
             # self.ui.showFullScreen()
             self.ui.setWindowFlags(self.ui.windowFlags() | Qt.FramelessWindowHint)
             a = self.ui.geometry()
@@ -5723,7 +5722,7 @@ class App(QtCore.QObject):
                 tb.setVisible(False)
             self.ui.splitter_left.setVisible(False)
             self.toggle_fscreen = True
-        else:
+        elif self.toggle_fscreen is True or disable is True:
             self.ui.setWindowFlags(self.ui.windowFlags() & ~Qt.FramelessWindowHint)
             self.ui.setGeometry(self.x_pos, self.y_pos, self.width, self.height)
             self.ui.showNormal()
@@ -9252,8 +9251,8 @@ class App(QtCore.QObject):
             filenames = [name]
         else:
             try:
-                filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open TCL script"),
-                                                                     directory=self.get_last_folder(), filter=_filter_)
+                filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(
+                    caption=_("Open TCL script"), directory=self.get_last_folder(), filter=_filter_)
             except TypeError:
                 filenames, _f = QtWidgets.QFileDialog.getOpenFileNames(caption=_("Open TCL script"), filter=_filter_)
 
@@ -10119,6 +10118,7 @@ class App(QtCore.QObject):
         it with shapes extracted from the SVG file.
 
         :param filename: Path to the SVG file.
+        :param geo_type: Type of FlatCAM object that will be created from SVG
         :param outname:
         :return:
         """
@@ -10162,6 +10162,7 @@ class App(QtCore.QObject):
         it with shapes extracted from the DXF file.
 
         :param filename: Path to the DXF file.
+        :param geo_type: Type of FlatCAM object that will be created from DXF
         :param outname:
         :type putname: str
         :return:
@@ -10175,8 +10176,7 @@ class App(QtCore.QObject):
             obj_type = geo_type
         else:
             self.inform.emit('[ERROR_NOTCL] %s' %
-                             _("Not supported type is picked as parameter. "
-                             "Only Geometry and Gerber are supported"))
+                             _("Not supported type is picked as parameter. Only Geometry and Gerber are supported"))
             return
 
         units = self.ui.general_defaults_form.general_app_group.units_radio.get_value().upper()
@@ -10196,8 +10196,7 @@ class App(QtCore.QObject):
             self.file_opened.emit("dxf", filename)
 
             # GUI feedback
-            self.inform.emit('[success] %s: %s' %
-                             (_("Opened"), filename))
+            self.inform.emit('[success] %s: %s' % (_("Opened"), filename))
             self.progress.emit(100)
 
     def import_image(self, filename, o_type='gerber', dpi=96, mode='black', mask=[250, 250, 250, 250], outname=None):
@@ -11749,6 +11748,6 @@ class GracefulException(Exception):
         super().__init__()
 
     def __str__(self):
-        return ('\n\n%s' % _("The user requested a graceful exit of the current task."))
+        return '\n\n%s' % _("The user requested a graceful exit of the current task.")
 
 # end of file

+ 15 - 16
FlatCAMObj.py

@@ -1546,14 +1546,14 @@ class FlatCAMGerber(FlatCAMObj, Gerber):
                     if aperture_to_plot_mark in self.apertures:
                         for elem in self.apertures[aperture_to_plot_mark]['geometry']:
                             if 'solid' in elem:
-                                    geo = elem['solid']
-                                    if type(geo) == Polygon or type(geo) == LineString:
-                                        self.add_mark_shape(apid=aperture_to_plot_mark, shape=geo, color=color,
+                                geo = elem['solid']
+                                if type(geo) == Polygon or type(geo) == LineString:
+                                    self.add_mark_shape(apid=aperture_to_plot_mark, shape=geo, color=color,
+                                                        face_color=color, visible=visibility)
+                                else:
+                                    for el in geo:
+                                        self.add_mark_shape(apid=aperture_to_plot_mark, shape=el, color=color,
                                                             face_color=color, visible=visibility)
-                                    else:
-                                        for el in geo:
-                                            self.add_mark_shape(apid=aperture_to_plot_mark, shape=el, color=color,
-                                                                face_color=color, visible=visibility)
 
                     self.mark_shapes[aperture_to_plot_mark].redraw()
 
@@ -4323,7 +4323,7 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
 
         tooldia = float(self.ui.geo_tools_table.item(row, 1).text())
         new_cutz = (tooldia - vdia) / (2 * math.tan(math.radians(half_vangle)))
-        new_cutz = float('%.*f' % (self.decimals, -new_cutz)) # this value has to be negative
+        new_cutz = float('%.*f' % (self.decimals, -new_cutz))   # this value has to be negative
         self.ui.cutz_entry.set_value(new_cutz)
 
         # store the new CutZ value into storage (self.tools)
@@ -5337,8 +5337,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
         except TypeError:
             self.app.inform.emit('[ERROR_NOTCL] %s' %
                                  _("An (x,y) pair of values are needed. "
-                                   "Probable you entered only one value in the Offset field."
-            ))
+                                   "Probable you entered only one value in the Offset field.")
+                                 )
             return
 
         self.geo_len = 0
@@ -5421,8 +5421,8 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
                 self.app.inform.emit('[ERROR] %s' %
                                      _("The Toolchange X,Y field in Edit -> Preferences "
                                        "has to be in the format (x, y)\n"
-                                       "but now there is only one value, not two."
-                ))
+                                       "but now there is only one value, not two.")
+                                     )
                 return 'fail'
             coords_xy[0] *= factor
             coords_xy[1] *= factor
@@ -5519,7 +5519,6 @@ class FlatCAMGeometry(FlatCAMObj, Geometry):
             # if self.app.is_legacy is False:
             self.add_shape(shape=element, color=color, visible=visible, layer=0)
 
-
     def plot(self, visible=None, kind=None):
         """
         Plot the object.
@@ -6242,8 +6241,8 @@ class FlatCAMCNCjob(FlatCAMObj, CNCjob):
                 m6_code = self.parse_custom_toolchange_code(self.ui.toolchange_text.get_value())
                 if m6_code is None or m6_code == '':
                     self.app.inform.emit('[ERROR_NOTCL] %s' %
-                                         _("Cancelled. The Toolchange Custom code is enabled but it's empty."
-                    ))
+                                         _("Cancelled. The Toolchange Custom code is enabled but it's empty.")
+                                         )
                     return 'fail'
 
                 g = g.replace('M6', m6_code)
@@ -6543,7 +6542,7 @@ class FlatCAMScript(FlatCAMObj):
         self.script_editor_tab.buttonRun.show()
 
         self.ui.autocomplete_cb.set_value(self.app.defaults['script_autocompleter'])
-        self.on_autocomplete_changed(state= self.app.defaults['script_autocompleter'])
+        self.on_autocomplete_changed(state=self.app.defaults['script_autocompleter'])
 
         flt = "FlatCAM Scripts (*.FlatScript);;All Files (*.*)"
         self.script_editor_tab.buttonOpen.clicked.disconnect()

+ 5 - 0
README.md

@@ -14,6 +14,11 @@ CAD program, and create G-Code for Isolation routing.
 
 - updated the Film Tool and added the ability to generate Punched Positive films (holes in the pads) when a Gerber file is the film's source. The punch holes source can be either an Excellon file or the pads center
 - optimized Rules Check Tool so it runs faster when doing Copper 2 Copper rule
+- small GUI changes in Optimal Tool and in Film Tool
+- some PEP8 corrections
+- some code annotations to make it easier to navigate in the FlatCAMGUI.py
+- fixed exit FullScreen with Escape key
+
 
 3.10.2019
 

+ 137 - 174
flatcamGUI/FlatCAMGUI.py

@@ -43,8 +43,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         # ######### ##
         self.menu = self.menuBar()
 
-        # ## File # ##
-        self.menufile = self.menu.addMenu(_('&File'))
+        # ########################################################################
+        # ########################## File # ######################################
+        # ########################################################################
+        self.menufile = self.menu.addMenu(_('File'))
         self.menufile.setToolTipsVisible(True)
 
         # New Project
@@ -242,7 +244,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         # exitAction.setStatusTip('Exit application')
         self.menufile.addAction(self.menufile_exit)
 
-        # ## Edit # ##
+        # ########################################################################
+        # ########################## Edit # ######################################
+        # ########################################################################
         self.menuedit = self.menu.addMenu(_('Edit'))
         # Separator
         self.menuedit.addSeparator()
@@ -359,7 +363,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         # Separator
         self.menuoptions.addSeparator()
 
-        # ## View # ##
+        # ########################################################################
+        # ########################## View # ######################################
+        # ########################################################################
         self.menuview = self.menu.addMenu(_('&View'))
         self.menuviewenable = self.menuview.addAction(QtGui.QIcon('share/replot16.png'), _('Enable all plots\tALT+1'))
         self.menuviewdisableall = self.menuview.addAction(QtGui.QIcon('share/clear_plot16.png'),
@@ -395,12 +401,21 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.menuview_toggle_workspace = self.menuview.addAction(QtGui.QIcon('share/workspace24.png'),
                                                                  _("Toggle Workspace\tSHIFT+W"))
 
-        # ## Tool ###
+        # ########################################################################
+        # ########################## Objects # ###################################
+        # ########################################################################
+        self.menufile = self.menu.addMenu(_('Objects'))
+
+        # ########################################################################
+        # ########################## Tool # ######################################
+        # ########################################################################
         self.menutool = QtWidgets.QMenu(_('&Tool'))
         self.menutoolaction = self.menu.addMenu(self.menutool)
         self.menutoolshell = self.menutool.addAction(QtGui.QIcon('share/shell16.png'), _('&Command Line\tS'))
 
-        # ## Help ###
+        # ########################################################################
+        # ########################## Help # ######################################
+        # ########################################################################
         self.menuhelp = self.menu.addMenu(_('&Help'))
         self.menuhelp_manual = self.menuhelp.addAction(QtGui.QIcon('share/globe16.png'), _('Online Help\tF1'))
         self.menuhelp_home = self.menuhelp.addAction(QtGui.QIcon('share/home16.png'), _('FlatCAM.org'))
@@ -420,7 +435,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                                                           )
         self.menuhelp_about = self.menuhelp.addAction(QtGui.QIcon('share/about32.png'), _('About FlatCAM'))
 
-        # ## FlatCAM Editor menu ###
+        # ########################################################################
+        # ########################## GEOMETRY EDITOR # ###########################
+        # ########################################################################
         self.geo_editor_menu = QtWidgets.QMenu(">Geo Editor<")
         self.menu.addMenu(self.geo_editor_menu)
 
@@ -470,6 +487,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
             QtGui.QIcon('share/corner32.png'), _("Toggle Corner Snap\tK")
         )
 
+        # ########################################################################
+        # ########################## EXCELLON Editor # ###########################
+        # ########################################################################
         self.exc_editor_menu = QtWidgets.QMenu(_(">Excellon Editor<"))
         self.menu.addMenu(self.exc_editor_menu)
 
@@ -497,7 +517,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.exc_move_drill_menuitem = self.exc_editor_menu.addAction(QtGui.QIcon('share/move32.png'),
                                                                       _('Move Drill(s)\tM'))
 
-        # ## APPLICATION GERBER EDITOR MENU ###
+        # ########################################################################
+        # ########################## GERBER Editor # #############################
+        # ########################################################################
         self.grb_editor_menu = QtWidgets.QMenu(_(">Gerber Editor<"))
         self.menu.addMenu(self.grb_editor_menu)
 
@@ -543,10 +565,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.exc_editor_menu.menuAction().setVisible(False)
         self.exc_editor_menu.setDisabled(True)
 
-        # ################################
-        # ### Project Tab Context menu ###
-        # ################################
-
+        # ########################################################################
+        # ########################## Project Tab Context Menu # ##################
+        # ########################################################################
         self.menuproject = QtWidgets.QMenu()
         self.menuprojectenable = self.menuproject.addAction(QtGui.QIcon('share/replot32.png'), _('Enable Plot'))
         self.menuprojectdisable = self.menuproject.addAction(QtGui.QIcon('share/clear_plot32.png'), _('Disable Plot'))
@@ -562,9 +583,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
 
         self.menuprojectproperties = self.menuproject.addAction(QtGui.QIcon('share/properties32.png'), _('Properties'))
 
-        # ################
-        # ### Splitter ###
-        # ################
+        # ########################################################################
+        # ####################### Central Widget -> Splitter # ##################
+        # ########################################################################
 
         # IMPORTANT #
         # The order: SPITTER -> NOTEBOOK -> SNAP TOOLBAR is important and without it the GUI will not be initialized as
@@ -584,9 +605,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.splitter_left.addWidget(self.notebook)
         self.splitter_left.setHandleWidth(0)
 
-        # ##############
-        # ## Toolbar ###
-        # ##############
+        # ########################################################################
+        # ########################## ToolBAR # ###################################
+        # ########################################################################
 
         # ## TOOLBAR INSTALLATION ###
         self.toolbarfile = QtWidgets.QToolBar(_('File Toolbar'))
@@ -637,7 +658,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                 self.snap_toolbar.setMaximumHeight(30)
                 self.splitter_left.addWidget(self.snap_toolbar)
 
-        # ## File Toolbar ###
+        # ########################################################################
+        # ########################## 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"))
@@ -645,7 +668,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         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 ###
+        # ########################################################################
+        # ########################## Edit Toolbar# ###############################
+        # ########################################################################
         self.newgeo_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_geo32_bis.png'), _("New Blank Geometry"))
         self.newgrb_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_geo32.png'), _("New Blank Gerber"))
         self.newexc_btn = self.toolbargeo.addAction(QtGui.QIcon('share/new_exc32.png'), _("New Blank Excellon"))
@@ -658,7 +683,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.toolbargeo.addSeparator()
         self.delete_btn = self.toolbargeo.addAction(QtGui.QIcon('share/cancel_edit32.png'), _("&Delete"))
 
-        # ## View Toolbar # ##
+        # ########################################################################
+        # ########################## 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"))
@@ -667,13 +694,17 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
 
         # self.toolbarview.setVisible(False)
 
-        # ## Shell Toolbar ##
+        # ########################################################################
+        # ########################## Shell Toolbar# ##############################
+        # ########################################################################
         self.shell_btn = self.toolbarshell.addAction(QtGui.QIcon('share/shell32.png'), _("&Command Line"))
         self.new_script_btn = self.toolbarshell.addAction(QtGui.QIcon('share/script_new24.png'), _('New Script ...'))
         self.open_script_btn = self.toolbarshell.addAction(QtGui.QIcon('share/open_script32.png'), _('Open Script ...'))
         self.run_script_btn = self.toolbarshell.addAction(QtGui.QIcon('share/script16.png'), _('Run Script ...'))
 
-        # ## Tools Toolbar ##
+        # ########################################################################
+        # ########################## Tools Toolbar# ##############################
+        # ########################################################################
         self.dblsided_btn = self.toolbartools.addAction(QtGui.QIcon('share/doubleside32.png'), _("2Sided Tool"))
         self.cutout_btn = self.toolbartools.addAction(QtGui.QIcon('share/cut16_bis.png'), _("&Cutout Tool"))
         self.ncc_btn = self.toolbartools.addAction(QtGui.QIcon('share/ncc16.png'), _("NCC Tool"))
@@ -692,7 +723,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.calculators_btn = self.toolbartools.addAction(QtGui.QIcon('share/calculator24.png'), _("Calculators Tool"))
         self.transform_btn = self.toolbartools.addAction(QtGui.QIcon('share/transform.png'), _("Transform Tool"))
 
-        # ## Drill Editor Toolbar ###
+        # ########################################################################
+        # ########################## Excellon Editor Toolbar# ####################
+        # ########################################################################
         self.select_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select"))
         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(
@@ -709,7 +742,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.exc_edit_toolbar.addSeparator()
         self.move_drill_btn = self.exc_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move Drill"))
 
-        # ## Geometry Editor Toolbar ###
+        # ########################################################################
+        # ########################## Geometry Editor Toolbar# ####################
+        # ########################################################################
         self.geo_select_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select"))
         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'))
@@ -743,7 +778,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.geo_edit_toolbar.addSeparator()
         self.geo_move_btn = self.geo_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move Objects "))
 
-        # ## Gerber Editor Toolbar # ##
+        # ########################################################################
+        # ########################## Gerber Editor Toolbar# ######################
+        # ########################################################################
         self.grb_select_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/pointer32.png'), _("Select"))
         self.grb_add_pad_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/aperture32.png'), _("Add Pad"))
         self.add_pad_ar_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/padarray32.png'), _('Add Pad Array'))
@@ -772,10 +809,11 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.grb_edit_toolbar.addSeparator()
         self.aperture_move_btn = self.grb_edit_toolbar.addAction(QtGui.QIcon('share/move32.png'), _("Move"))
 
-        # # ## Snap Toolbar # ##
-        # Snap GRID toolbar is always active to facilitate usage of measurements done on GRID
-        # self.addToolBar(self.snap_toolbar)
+        # ########################################################################
+        # ########################## Snap Toolbar# ###############################
+        # ########################################################################
 
+        # Snap GRID toolbar is always active to facilitate usage of measurements done on GRID
         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)
@@ -803,18 +841,13 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.snap_max_dist_entry.setToolTip(_("Max. magnet distance"))
         self.snap_magnet = self.snap_toolbar.addWidget(self.snap_max_dist_entry)
 
-        # ############# ##
-        # ## Notebook # ##
-        # ############# ##
-
-        # ## Project # ##
-        # self.project_tab = QtWidgets.QWidget()
-        # self.project_tab.setObjectName("project_tab")
-        # # project_tab.setMinimumWidth(250)  # Hack
-        # self.project_tab_layout = QtWidgets.QVBoxLayout(self.project_tab)
-        # self.project_tab_layout.setContentsMargins(2, 2, 2, 2)
-        # self.notebook.addTab(self.project_tab,_( "Project"))
+        # ########################################################################
+        # ########################## Notebook # ##################################
+        # ########################################################################
 
+        # ########################################################################
+        # ########################## PROJECT Tab # ###############################
+        # ########################################################################
         self.project_tab = QtWidgets.QWidget()
         self.project_tab.setObjectName("project_tab")
 
@@ -830,7 +863,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.notebook.addTab(self.project_tab, _("Project"))
         self.project_frame.setDisabled(False)
 
-        # ## Selected # ##
+        # ########################################################################
+        # ########################## SELECTED Tab # ##############################
+        # ########################################################################
         self.selected_tab = QtWidgets.QWidget()
         self.selected_tab.setObjectName("selected_tab")
         self.selected_tab_layout = QtWidgets.QVBoxLayout(self.selected_tab)
@@ -839,7 +874,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.selected_tab_layout.addWidget(self.selected_scroll_area)
         self.notebook.addTab(self.selected_tab, _("Selected"))
 
-        # ## Tool # ##
+        # ########################################################################
+        # ########################## TOOL Tab # ##################################
+        # ########################################################################
         self.tool_tab = QtWidgets.QWidget()
         self.tool_tab.setObjectName("tool_tab")
         self.tool_tab_layout = QtWidgets.QVBoxLayout(self.tool_tab)
@@ -848,6 +885,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.tool_scroll_area = VerticalScrollArea()
         self.tool_tab_layout.addWidget(self.tool_scroll_area)
 
+        # ########################################################################
+        # ########################## RIGHT Widget # ##############################
+        # ########################################################################
         self.right_widget = QtWidgets.QWidget()
         self.right_widget.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored)
         self.splitter.addWidget(self.right_widget)
@@ -855,7 +895,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.right_lay = QtWidgets.QVBoxLayout()
         self.right_lay.setContentsMargins(0, 0, 0, 0)
         self.right_widget.setLayout(self.right_lay)
-        # self.plot_tab_area = FCTab()
+
+        # ########################################################################
+        # ########################## PLOT AREA Tab # #############################
+        # ########################################################################
         self.plot_tab_area = FCDetachableTab2(protect=False, protect_by_name=[_('Plot Area')])
         self.plot_tab_area.useOldIndex(True)
 
@@ -874,9 +917,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         # remove the close button from the Plot Area tab (first tab index = 0) as this one will always be ON
         self.plot_tab_area.protectTab(0)
 
-        # ##################################### ##
-        # ## HERE WE BUILD THE PREF. TAB AREA # ##
-        # ##################################### ##
+        # ########################################################################
+        # ########################## PREFERENCES AREA Tab # ######################
+        # ########################################################################
         self.preferences_tab = QtWidgets.QWidget()
         self.pref_tab_layout = QtWidgets.QVBoxLayout(self.preferences_tab)
         self.pref_tab_layout.setContentsMargins(2, 2, 2, 2)
@@ -1014,9 +1057,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
               "which is the file storing the working default preferences."))
         self.pref_tab_bottom_layout_2.addWidget(self.pref_save_button)
 
-        # #################################################
-        # ## HERE WE BUILD THE SHORTCUTS LIST. TAB AREA ###
-        # #################################################
+        # ########################################################################
+        # #################### SHORTCUT LIST AREA Tab # ##########################
+        # ########################################################################
         self.shortcuts_tab = QtWidgets.QWidget()
         self.sh_tab_layout = QtWidgets.QVBoxLayout()
         self.sh_tab_layout.setContentsMargins(2, 2, 2, 2)
@@ -1750,9 +1793,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.sh_editor.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
         self.sh_hlay.addWidget(self.sh_editor)
 
-        # ########################################################### ##
-        # # ## HERE WE BUILD THE CONTEXT MENU FOR RMB CLICK ON CANVAS # ##
-        # ########################################################### ##
+        # ########################################################################
+        # ########################## PLOT AREA CONTEXT MENU  # ###################
+        # ########################################################################
         self.popMenu = FCMenu()
 
         self.popmenu_disable = self.popMenu.addAction(QtGui.QIcon('share/disable32.png'), _("Toggle Visibility"))
@@ -1841,106 +1884,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.popmenu_move = self.popMenu.addAction(QtGui.QIcon('share/move32.png'), _("Move"))
         self.popmenu_properties = self.popMenu.addAction(QtGui.QIcon('share/properties32.png'), _("Properties"))
 
-        # ###################################
-        # ## Here we build the CNCJob Tab ###
-        # ###################################
-        # self.cncjob_tab = QtWidgets.QWidget()
-        # self.cncjob_tab_layout = QtWidgets.QGridLayout(self.cncjob_tab)
-        # self.cncjob_tab_layout.setContentsMargins(2, 2, 2, 2)
-        # self.cncjob_tab.setLayout(self.cncjob_tab_layout)
-
-        # self.cncjob_tab = QtWidgets.QWidget()
-        #
-        # self.c_temp_layout = QtWidgets.QVBoxLayout(self.cncjob_tab)
-        # self.c_temp_layout.setContentsMargins(0, 0, 0, 0)
-        #
-        # self.cncjob_frame = QtWidgets.QFrame()
-        # self.cncjob_frame.setContentsMargins(0, 0, 0, 0)
-        # self.c_temp_layout.addWidget(self.cncjob_frame)
-        #
-        # self.cncjob_tab_layout = QtWidgets.QGridLayout(self.cncjob_frame)
-        # self.cncjob_tab_layout.setContentsMargins(2, 2, 2, 2)
-        # self.cncjob_frame.setLayout(self.cncjob_tab_layout)
-        #
-        # self.code_editor = FCTextAreaExtended()
-        # stylesheet = """
-        #                 QTextEdit { selection-background-color:yellow;
-        #                             selection-color:black;
-        #                 }
-        #              """
-        #
-        # self.code_editor.setStyleSheet(stylesheet)
-        #
-        # self.buttonPreview = QtWidgets.QPushButton(_('Print Preview'))
-        # self.buttonPreview.setToolTip(_("Open a OS standard Preview Print window."))
-        # self.buttonPrint = QtWidgets.QPushButton(_('Print Code'))
-        # self.buttonPrint.setToolTip(_("Open a OS standard Print window."))
-        #
-        # self.buttonFind = QtWidgets.QPushButton(_('Find in Code'))
-        # self.buttonFind.setToolTip(_("Will search and highlight in yellow the string in the Find box."))
-        # self.buttonFind.setMinimumWidth(100)
-        #
-        # self.buttonPreview.setMinimumWidth(100)
-        #
-        # self.entryFind = FCEntry()
-        # self.entryFind.setToolTip(_("Find box. Enter here the strings to be searched in the text."))
-        #
-        # self.buttonReplace = QtWidgets.QPushButton(_('Replace With'))
-        # self.buttonReplace.setToolTip(_("Will replace the string from the Find box with the one in the Replace box."))
-        #
-        # self.buttonReplace.setMinimumWidth(100)
-        #
-        # self.entryReplace = FCEntry()
-        # self.entryReplace.setToolTip(_("String to replace the one in the Find box throughout the text."))
-        #
-        # self.sel_all_cb = QtWidgets.QCheckBox(_('All'))
-        # self.sel_all_cb.setToolTip(_("When checked it will replace all instances in the 'Find' box\n"
-        #                              "with the text in the 'Replace' box.."))
-        #
-        # self.button_copy_all = QtWidgets.QPushButton(_('Copy All'))
-        # self.button_copy_all.setToolTip(_("Will copy all the text in the Code Editor to the clipboard."))
-        #
-        # self.button_copy_all.setMinimumWidth(100)
-        #
-        # self.buttonOpen = QtWidgets.QPushButton(_('Open Code'))
-        # self.buttonOpen.setToolTip(_("Will open a text file in the editor."))
-        #
-        # self.buttonSave = QtWidgets.QPushButton(_('Save Code'))
-        # self.buttonSave.setToolTip(_("Will save the text in the editor into a file."))
-        #
-        # self.buttonRun = QtWidgets.QPushButton(_('Run Code'))
-        # self.buttonRun.setToolTip(_("Will run the TCL commands found in the text file, one by one."))
-        #
-        # self.buttonRun.hide()
-        # self.cncjob_tab_layout.addWidget(self.code_editor, 0, 0, 1, 5)
-        #
-        # cnc_tab_lay_1 = QtWidgets.QHBoxLayout()
-        # # cnc_tab_lay_1.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
-        # cnc_tab_lay_1.addWidget(self.buttonFind)
-        # cnc_tab_lay_1.addWidget(self.entryFind)
-        # cnc_tab_lay_1.addWidget(self.buttonReplace)
-        # cnc_tab_lay_1.addWidget(self.entryReplace)
-        # cnc_tab_lay_1.addWidget(self.sel_all_cb)
-        # cnc_tab_lay_1.addWidget(self.button_copy_all)
-        # self.cncjob_tab_layout.addLayout(cnc_tab_lay_1, 1, 0, 1, 5)
-        #
-        # cnc_tab_lay_3 = QtWidgets.QHBoxLayout()
-        # cnc_tab_lay_3.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter)
-        # cnc_tab_lay_3.addWidget(self.buttonPreview)
-        # cnc_tab_lay_3.addWidget(self.buttonPrint)
-        # self.cncjob_tab_layout.addLayout(cnc_tab_lay_3, 2, 0, 1, 1, QtCore.Qt.AlignLeft)
-        #
-        # cnc_tab_lay_4 = QtWidgets.QHBoxLayout()
-        # cnc_tab_lay_4.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignVCenter)
-        # cnc_tab_lay_4.addWidget(self.buttonOpen)
-        # cnc_tab_lay_4.addWidget(self.buttonSave)
-        # cnc_tab_lay_4.addWidget(self.buttonRun)
-        #
-        # self.cncjob_tab_layout.addLayout(cnc_tab_lay_4, 2, 4, 1, 1)
-
-        # #################################
-        # ## Build InfoBar is done here ###
-        # #################################
+        # ########################################################################
+        # ########################## INFO BAR # ##################################
+        # ########################################################################
         self.infobar = self.statusBar()
         self.fcinfo = FlatCAMInfoBar()
         self.infobar.addWidget(self.fcinfo, stretch=1)
@@ -1967,10 +1913,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.progress_bar.setMaximum(100)
         # infobar.addWidget(self.progress_bar)
 
-        # ###########################################################################
-        # ####### Set the APP ICON and the WINDOW TITLE and GEOMETRY ################
-        # ###########################################################################
-
+        # ########################################################################
+        # ########################## SET GUI Elements # ##########################
+        # ########################################################################
         self.app_icon = QtGui.QIcon()
         self.app_icon.addFile('share/flatcam_icon16.png', QtCore.QSize(16, 16))
         self.app_icon.addFile('share/flatcam_icon24.png', QtCore.QSize(24, 24))
@@ -1991,19 +1936,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.units = ""
         self.setAcceptDrops(True)
 
-        # # restore the Toolbar State from file
-        # try:
-        #     with open(self.app.data_path + '\gui_state.config', 'rb') as stream:
-        #         self.restoreState(QtCore.QByteArray(stream.read()))
-        #     log.debug("FlatCAMGUI.__init__() --> UI state restored.")
-        # except IOError:
-        #     log.debug("FlatCAMGUI.__init__() --> UI state not restored. IOError")
-        #     pass
-
-        # ################### ##
-        # ## INITIALIZE GUI # ##
-        # ################### ##
-
+        # ########################################################################
+        # ########################## Build GUI # #################################
+        # ########################################################################
         self.grid_snap_btn.setCheckable(True)
         self.corner_snap_btn.setCheckable(True)
         self.update_obj_btn.setEnabled(False)
@@ -2103,8 +2038,18 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         self.lock_toolbar(lock=lock_state)
         self.lock_action.triggered[bool].connect(self.lock_toolbar)
 
+        # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        # %%%%%%%%%%%%%%%%% GUI Building FINISHED %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+        # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
     def eventFilter(self, obj, event):
-        # filter the ToolTips display based on a Preferences setting
+        """
+        Filter the ToolTips display based on a Preferences setting
+
+        :param obj:
+        :param event: QT event to filter
+        :return:
+        """
         if self.general_defaults_form.general_gui_set_group.toggle_tooltips_cb.get_value() is False:
             if event.type() == QtCore.QEvent.ToolTip:
                 return True
@@ -2114,6 +2059,10 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
         return False
 
     def populate_toolbars(self):
+        """
+        Will populate the App Toolbars with theie actions
+        :return: None
+        """
 
         # ## File Toolbar # ##
         self.file_open_gerber_btn = self.toolbarfile.addAction(QtGui.QIcon('share/flatcam_icon32.png'),
@@ -2314,6 +2263,13 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                 self.snap_magnet.setDisabled(True)
 
     def keyPressEvent(self, event):
+        """
+        Key event handler for the entire app.
+        Some of the key events are also treated locally in the FlatCAM editors
+
+        :param event: QT event
+        :return:
+        """
         modifiers = QtWidgets.QApplication.keyboardModifiers()
         active = self.app.collection.get_active()
         selected = self.app.collection.get_selected()
@@ -2568,10 +2524,8 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
                     self.app.on_deselect_all()
 
                     # if in full screen, exit to normal view
-                    self.showNormal()
-                    self.app.restore_toolbar_view()
-                    self.splitter_left.setVisible(True)
-                    self.app.toggle_fscreen = False
+                    if self.app.toggle_fscreen is True:
+                        self.app.on_fullscreen(disable=True)
 
                     # try to disconnect the slot from Set Origin
                     try:
@@ -3538,6 +3492,9 @@ class FlatCAMGUI(QtWidgets.QMainWindow):
 
 
 class FlatCAMActivityView(QtWidgets.QWidget):
+    """
+    This class create and control the activity icon displayed in the App status bar
+    """
 
     def __init__(self, movie="share/active.gif", icon='share/active_static.png', parent=None):
         super().__init__(parent=parent)
@@ -3577,6 +3534,9 @@ class FlatCAMActivityView(QtWidgets.QWidget):
 
 
 class FlatCAMInfoBar(QtWidgets.QWidget):
+    """
+    This class create a place to display the App messages in the Status Bar
+    """
 
     def __init__(self, parent=None):
         super(FlatCAMInfoBar, self).__init__(parent=parent)
@@ -3625,6 +3585,9 @@ class FlatCAMInfoBar(QtWidgets.QWidget):
 
 
 class FlatCAMSystemTray(QtWidgets.QSystemTrayIcon):
+    """
+    This class create the Sys Tray icon for the app
+    """
 
     def __init__(self, app, icon, headless=None, parent=None):
         # QtWidgets.QSystemTrayIcon.__init__(self, icon, parent)

+ 1 - 0
flatcamTools/ToolFilm.py

@@ -315,6 +315,7 @@ class Film(FlatCAMTool):
         if type_of_film == 'neg':
             self.boundary_label.show()
             self.boundary_entry.show()
+            self.punch_cb.set_value(False)  # required so the self.punch_frame it's hidden also by the signal emitted
             self.punch_cb.hide()
         else:
             self.boundary_label.hide()

+ 35 - 54
flatcamTools/ToolOptimal.py

@@ -59,15 +59,19 @@ class ToolOptimal(FlatCAMTool):
             "Gerber object for which to find the minimum distance between copper features."
         )
 
-        self.title_res_label = QtWidgets.QLabel('<b>%s</b>' % _("Minimum distance between copper features"))
+        self.title_res_label = QtWidgets.QLabel('<b>%s:</b>' % _("Minimum distance"))
+        self.title_res_label.setToolTip(_("Display minimum distance between copper features."))
         self.result_label = QtWidgets.QLabel('%s:' % _("Determined"))
-        self.show_res = QtWidgets.QLabel('%s' % '')
+        self.result_entry = FCEntry()
+        self.result_entry.setReadOnly(True)
 
-        self.units_lbl = QtWidgets.QLabel(self.units)
+        self.units_lbl = QtWidgets.QLabel(self.units.lower())
+        self.units_lbl.setDisabled(True)
 
         self.freq_label = QtWidgets.QLabel('%s:' % _("Occurring"))
         self.freq_label.setToolTip(_("How many times this minimum is found."))
-        self.freq_res = QtWidgets.QLabel('%s' % '')
+        self.freq_entry = FCEntry()
+        self.freq_entry.setReadOnly(True)
 
         self.precision_label = QtWidgets.QLabel('%s:' % _("Precision"))
         self.precision_label.setToolTip(_("Number of decimals kept for found distances."))
@@ -76,12 +80,12 @@ class ToolOptimal(FlatCAMTool):
         self.precision_spinner.set_range(2, 10)
         self.precision_spinner.setWrapping(True)
 
-        self.locations_cb = FCCheckBox(_("Locations"))
-        self.locations_cb.setToolTip(_("Locations where minimum distance was found."))
+        self.locations_cb = FCCheckBox(_("Minimum points coordinates"))
+        self.locations_cb.setToolTip(_("Coordinates for points where minimum distance was found."))
 
         self.locations_textb = FCTextArea(parent=self)
         self.locations_textb.setReadOnly(True)
-        self.locations_textb.setToolTip(_("Locations where minimum distance was found."))
+        self.locations_textb.setToolTip(_("Coordinates for points where minimum distance was found."))
         stylesheet = """
                         QTextEdit { selection-background-color:yellow;
                                     selection-color:black;
@@ -90,10 +94,18 @@ class ToolOptimal(FlatCAMTool):
 
         self.locations_textb.setStyleSheet(stylesheet)
 
+        self.locate_button = QtWidgets.QPushButton(_("Jump to selected position"))
+        self.locate_button.setToolTip(
+            _("Select a position in the Locations text box and then\n"
+              "click this button.")
+        )
+        self.locate_button.setMinimumWidth(60)
+        self.locate_button.setDisabled(True)
+
         hlay = QtWidgets.QHBoxLayout()
 
-        hlay.addWidget(self.show_res)
-        hlay.addStretch()
+        hlay.addWidget(self.result_entry)
+        # hlay.addStretch()
         hlay.addWidget(self.units_lbl)
 
         form_lay.addRow(QtWidgets.QLabel(""))
@@ -103,11 +115,14 @@ class ToolOptimal(FlatCAMTool):
         form_lay.addRow(QtWidgets.QLabel(""))
         form_lay.addRow(self.title_res_label)
         form_lay.addRow(self.result_label, hlay)
-        form_lay.addRow(self.freq_label, self.freq_res)
+        form_lay.addRow(self.freq_label, self.freq_entry)
         form_lay.addRow(self.locations_cb)
         form_lay.addRow(self.locations_textb)
+        form_lay.addRow(self.locate_button)
 
-        self.calculate_button = QtWidgets.QPushButton(_("Find Distance"))
+        self.loc_ois = OptionalHideInputSection(self.locations_cb, [self.locations_textb, self.locate_button])
+        
+        self.calculate_button = QtWidgets.QPushButton(_("Find Minimum"))
         self.calculate_button.setToolTip(
             _("Calculate the minimum distance between copper features,\n"
               "this will allow the determination of the right tool to\n"
@@ -116,45 +131,17 @@ class ToolOptimal(FlatCAMTool):
         self.calculate_button.setMinimumWidth(60)
         self.layout.addWidget(self.calculate_button)
 
-        self.locate_button = QtWidgets.QPushButton(_("Locate position"))
-        self.locate_button.setToolTip(
-            _("Select a position in the Locations text box and then\n"
-              "click this button.")
-        )
-        self.locate_button.setMinimumWidth(60)
-        self.layout.addWidget(self.locate_button)
-        self.locate_button.setDisabled(True)
-
         self.decimals = 4
 
         self.selected_text = ''
-        # self.dt_label = QtWidgets.QLabel("<b>%s:</b>" % _('Alignment Drill Diameter'))
-        # self.dt_label.setToolTip(
-        #     _("Diameter of the drill for the "
-        #       "alignment holes.")
-        # )
-        # self.layout.addWidget(self.dt_label)
-        #
-        # hlay = QtWidgets.QHBoxLayout()
-        # self.layout.addLayout(hlay)
-        #
-        # self.drill_dia = FCEntry()
-        # self.dd_label = QtWidgets.QLabel('%s:' % _("Drill dia"))
-        # self.dd_label.setToolTip(
-        #     _("Diameter of the drill for the "
-        #       "alignment holes.")
-        # )
-        # hlay.addWidget(self.dd_label)
-        # hlay.addWidget(self.drill_dia)
 
+        # ## Signals
         self.calculate_button.clicked.connect(self.find_minimum_distance)
         self.locate_button.clicked.connect(self.on_locate_position)
         self.update_text.connect(self.on_update_text)
         self.locations_textb.cursorPositionChanged.connect(self.on_textbox_clicked)
-        self.locations_cb.stateChanged.connect(self.on_location_cb)
-        self.layout.addStretch()
 
-        # ## Signals
+        self.layout.addStretch()
 
     def install(self, icon=None, separator=None, **kwargs):
         FlatCAMTool.install(self, icon, separator, shortcut='ALT+O', **kwargs)
@@ -162,7 +149,9 @@ class ToolOptimal(FlatCAMTool):
     def run(self, toggle=True):
         self.app.report_usage("ToolOptimal()")
 
-        self.show_res.setText('')
+        self.result_entry.set_value(0.0)
+        self.freq_entry.set_value('0')
+
         if toggle:
             # if the splitter is hidden, display it, else hide it but only if the current widget is the same
             if self.app.ui.splitter.sizes()[0] == 0:
@@ -202,8 +191,8 @@ class ToolOptimal(FlatCAMTool):
         self.locations_textb.setVisible(False)
         self.locate_button.setVisible(False)
 
-        self.show_res.setText('')
-        self.freq_res.setText('')
+        self.result_entry.set_value(0.0)
+        self.freq_entry.set_value('0')
         self.reset_fields()
 
     def find_minimum_distance(self):
@@ -296,11 +285,11 @@ class ToolOptimal(FlatCAMTool):
                 min_list = list(min_dict.keys())
                 min_dist = min(min_list)
                 min_dist_string = '%.*f' % (self.decimals, float(min_dist))
-                self.show_res.setText(min_dist_string)
+                self.result_entry.set_Value(min_dist_string)
 
                 freq = len(min_dict[min_dist])
                 freq = '%d' % int(freq)
-                self.freq_res.setText(freq)
+                self.freq_entry.set_value(freq)
 
                 self.update_text.emit(min_dict[min_dist])
 
@@ -350,14 +339,6 @@ class ToolOptimal(FlatCAMTool):
 
         self.selected_text = cursor.selectedText()
 
-    def on_location_cb(self, state):
-        if state:
-            self.locations_textb.setVisible(True)
-            self.locate_button.setVisible(True)
-        else:
-            self.locations_textb.setVisible(False)
-            self.locate_button.setVisible(False)
-
     def reset_fields(self):
         self.gerber_object_combo.setRootModelIndex(self.app.collection.index(0, 0, QtCore.QModelIndex()))
         self.gerber_object_combo.setCurrentIndex(0)