diff --git a/FlatCAMApp.py b/FlatCAMApp.py index 7d7087d4..36d219b8 100644 --- a/FlatCAMApp.py +++ b/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 diff --git a/FlatCAMObj.py b/FlatCAMObj.py index 429216b1..2027aebc 100644 --- a/FlatCAMObj.py +++ b/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() diff --git a/README.md b/README.md index 271e7dc8..abf4203d 100644 --- a/README.md +++ b/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 diff --git a/flatcamGUI/FlatCAMGUI.py b/flatcamGUI/FlatCAMGUI.py index 9b5dbc78..29024d6b 100644 --- a/flatcamGUI/FlatCAMGUI.py +++ b/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) diff --git a/flatcamTools/ToolFilm.py b/flatcamTools/ToolFilm.py index 0fe96c19..d0eec5d5 100644 --- a/flatcamTools/ToolFilm.py +++ b/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() diff --git a/flatcamTools/ToolOptimal.py b/flatcamTools/ToolOptimal.py index 794156dc..34db1ef2 100644 --- a/flatcamTools/ToolOptimal.py +++ b/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('%s' % _("Minimum distance between copper features")) + self.title_res_label = QtWidgets.QLabel('%s:' % _("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("%s:" % _('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)