ソースを参照

- minor changes
- moved the ObjectCollection class to the flatcamObjects folder where it belongs

Marius Stanciu 5 年 前
コミット
fe2d232f60
6 ファイル変更169 行追加156 行削除
  1. 2 0
      CHANGELOG.md
  2. 155 144
      FlatCAMApp.py
  3. 7 7
      FlatCAMBookmark.py
  4. 1 1
      flatcamGUI/FlatCAMGUI.py
  5. 4 4
      flatcamGUI/PlotCanvas.py
  6. 0 0
      flatcamObjects/ObjectCollection.py

+ 2 - 0
CHANGELOG.md

@@ -22,6 +22,8 @@ CHANGELOG for FlatCAM beta
 - split the FlatCAMObj file into multiple files located in the flatcamObjects folder and renamed the contained classes with names more suggestive
 - split the FlatCAMObj file into multiple files located in the flatcamObjects folder and renamed the contained classes with names more suggestive
 - updated the Google Translation for the German language
 - updated the Google Translation for the German language
 - added support for Hungarian language - no translation for now
 - added support for Hungarian language - no translation for now
+- minor changes
+- moved the ObjectCollection class to the flatcamObjects folder where it belongs
 
 
 25.04.2020
 25.04.2020
 
 

+ 155 - 144
FlatCAMApp.py

@@ -17,6 +17,7 @@ import lzma
 import shutil
 import shutil
 import stat
 import stat
 from datetime import datetime
 from datetime import datetime
+import time
 from stat import S_IREAD, S_IRGRP, S_IROTH
 from stat import S_IREAD, S_IRGRP, S_IROTH
 import ctypes
 import ctypes
 import traceback
 import traceback
@@ -38,14 +39,20 @@ from multiprocessing.connection import Listener, Client
 from multiprocessing import Pool
 from multiprocessing import Pool
 import socket
 import socket
 
 
-# #######################################
-# #      Imports part of FlatCAM       ##
-# #######################################
+# ####################################################################################################################
+# ###################################      Imports part of FlatCAM       #############################################
+# ####################################################################################################################
+
+# Diverse
 from FlatCAMCommon import LoudDict, color_variant
 from FlatCAMCommon import LoudDict, color_variant
 from FlatCAMBookmark import BookmarkManager
 from FlatCAMBookmark import BookmarkManager
 from FlatCAMDB import ToolsDB2
 from FlatCAMDB import ToolsDB2
 
 
-from ObjectCollection import *
+from vispy.gloo.util import _screenshot
+from vispy.io import write_png
+
+# FlatCAM Objects
+from flatcamObjects.ObjectCollection import *
 from flatcamObjects.FlatCAMObj import FlatCAMObj
 from flatcamObjects.FlatCAMObj import FlatCAMObj
 from flatcamObjects.FlatCAMCNCJob import CNCJobObject
 from flatcamObjects.FlatCAMCNCJob import CNCJobObject
 from flatcamObjects.FlatCAMDocument import DocumentObject
 from flatcamObjects.FlatCAMDocument import DocumentObject
@@ -54,32 +61,35 @@ from flatcamObjects.FlatCAMGeometry import GeometryObject
 from flatcamObjects.FlatCAMGerber import GerberObject
 from flatcamObjects.FlatCAMGerber import GerberObject
 from flatcamObjects.FlatCAMScript import ScriptObject
 from flatcamObjects.FlatCAMScript import ScriptObject
 
 
+# FlatCAM Parsing files
 from flatcamParsers.ParseExcellon import Excellon
 from flatcamParsers.ParseExcellon import Excellon
 from flatcamParsers.ParseGerber import Gerber
 from flatcamParsers.ParseGerber import Gerber
 from camlib import to_dict, dict2obj, ET, ParseError, Geometry, CNCjob
 from camlib import to_dict, dict2obj, ET, ParseError, Geometry, CNCjob
 
 
+# FlatCAM GUI
 from flatcamGUI.PlotCanvas import *
 from flatcamGUI.PlotCanvas import *
 from flatcamGUI.PlotCanvasLegacy import *
 from flatcamGUI.PlotCanvasLegacy import *
 from flatcamGUI.FlatCAMGUI import *
 from flatcamGUI.FlatCAMGUI import *
 from flatcamGUI.GUIElements import FCFileSaveDialog
 from flatcamGUI.GUIElements import FCFileSaveDialog
 
 
+# FlatCAM Pre-processors
 from FlatCAMPostProc import load_preprocessors
 from FlatCAMPostProc import load_preprocessors
 
 
+# FlatCAM Editors
 from flatcamEditors.FlatCAMGeoEditor import FlatCAMGeoEditor
 from flatcamEditors.FlatCAMGeoEditor import FlatCAMGeoEditor
 from flatcamEditors.FlatCAMExcEditor import FlatCAMExcEditor
 from flatcamEditors.FlatCAMExcEditor import FlatCAMExcEditor
 from flatcamEditors.FlatCAMGrbEditor import FlatCAMGrbEditor
 from flatcamEditors.FlatCAMGrbEditor import FlatCAMGrbEditor
 from flatcamEditors.FlatCAMTextEditor import TextEditor
 from flatcamEditors.FlatCAMTextEditor import TextEditor
-
 from flatcamParsers.ParseHPGL2 import HPGL2
 from flatcamParsers.ParseHPGL2 import HPGL2
 
 
+# FlatCAM Workers
 from FlatCAMProcess import *
 from FlatCAMProcess import *
 from FlatCAMWorkerStack import WorkerStack
 from FlatCAMWorkerStack import WorkerStack
-# from flatcamGUI.VisPyVisuals import Color
-from vispy.gloo.util import _screenshot
-from vispy.io import write_png
 
 
+# FlatCAM Tools
 from flatcamTools import *
 from flatcamTools import *
 
 
+# FlatCAM Translation
 import gettext
 import gettext
 import FlatCAMTranslation as fcTranslate
 import FlatCAMTranslation as fcTranslate
 import builtins
 import builtins
@@ -301,9 +311,9 @@ class App(QtCore.QObject):
             else:
             else:
                 App.log.debug("Win64!")
                 App.log.debug("Win64!")
 
 
-            # #########################################################################
-            # ####### CONFIG FILE WITH PARAMETERS REGARDING PORTABILITY ###############
-            # #########################################################################
+            # #######################################################################################################
+            # ####### CONFIG FILE WITH PARAMETERS REGARDING PORTABILITY #############################################
+            # #######################################################################################################
             config_file = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + '\\config\\configuration.txt'
             config_file = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) + '\\config\\configuration.txt'
             try:
             try:
                 with open(config_file, 'r'):
                 with open(config_file, 'r'):
@@ -919,9 +929,9 @@ class App(QtCore.QObject):
             # Distance Tool
             # Distance Tool
             "tools_dist_snap_center": False,
             "tools_dist_snap_center": False,
 
 
-            # ###################################################################################
-            # ################################ TOOLS 2 ##########################################
-            # ###################################################################################
+            # ########################################################################################################
+            # ################################ TOOLS 2 ###############################################################
+            # ########################################################################################################
 
 
             # Optimal Tool
             # Optimal Tool
             "tools_opt_precision": 4,
             "tools_opt_precision": 4,
@@ -1071,9 +1081,9 @@ class App(QtCore.QObject):
             "document_tab_size": 80,
             "document_tab_size": 80,
         })
         })
 
 
-        # ############################################################
-        # ############### Load defaults from file ####################
-        # ############################################################
+        # ###########################################################################################################
+        # ################################# Load defaults from file #################################################
+        # ###########################################################################################################
         self.old_defaults_found = False
         self.old_defaults_found = False
 
 
         if user_defaults:
         if user_defaults:
@@ -1095,19 +1105,19 @@ class App(QtCore.QObject):
         self.current_defaults = {}
         self.current_defaults = {}
         self.current_defaults.update(self.defaults)
         self.current_defaults.update(self.defaults)
 
 
-        # ##########################################################################
-        # ##################### SETUP OBJECT CLASSES ###############################
-        # ##########################################################################
+        # ###########################################################################################################
+        # #################################### SETUP OBJECT CLASSES #################################################
+        # ###########################################################################################################
         self.setup_obj_classes()
         self.setup_obj_classes()
 
 
-        # ##########################################################################
-        # ##################### CREATE MULTIPROCESSING POOL ########################
-        # ##########################################################################
+        # ###########################################################################################################
+        # ###################################### CREATE MULTIPROCESSING POOL #######################################
+        # ###########################################################################################################
         self.pool = Pool()
         self.pool = Pool()
 
 
-        # ##########################################################################
-        # ################## Setting the Splash Screen #############################
-        # ##########################################################################
+        # ###########################################################################################################
+        # ###################################### Setting the Splash Screen ##########################################
+        # ###########################################################################################################
 
 
         splash_settings = QSettings("Open Source", "FlatCAM")
         splash_settings = QSettings("Open Source", "FlatCAM")
         if splash_settings.contains("splash_screen"):
         if splash_settings.contains("splash_screen"):
@@ -1137,9 +1147,9 @@ class App(QtCore.QObject):
         else:
         else:
             show_splash = 0
             show_splash = 0
 
 
-        # #############################################################################
-        # ##################### Initialize GUI ########################################
-        # #############################################################################
+        # ###########################################################################################################
+        # ######################################### Initialize GUI ##################################################
+        # ###########################################################################################################
 
 
         # FlatCAM colors used in plotting
         # FlatCAM colors used in plotting
         self.FC_light_green = '#BBF268BF'
         self.FC_light_green = '#BBF268BF'
@@ -1178,18 +1188,18 @@ class App(QtCore.QObject):
         # set FlatCAM units in the Status bar
         # set FlatCAM units in the Status bar
         self.set_screen_units(self.defaults['units'])
         self.set_screen_units(self.defaults['units'])
 
 
-        # #############################################################################
-        # ################################ AUTOSAVE SETUP #############################
-        # #############################################################################
+        # ###########################################################################################################
+        # ########################################### AUTOSAVE SETUP ################################################
+        # ###########################################################################################################
 
 
         self.block_autosave = False
         self.block_autosave = False
         self.autosave_timer = QtCore.QTimer(self)
         self.autosave_timer = QtCore.QTimer(self)
         self.save_project_auto_update()
         self.save_project_auto_update()
         self.autosave_timer.timeout.connect(self.save_project_auto)
         self.autosave_timer.timeout.connect(self.save_project_auto)
 
 
-        # #############################################################################
-        # ######################## UPDATE PREFERENCES GUI FORMS #######################
-        # #############################################################################
+        # ###########################################################################################################
+        # ##################################### UPDATE PREFERENCES GUI FORMS ########################################
+        # ###########################################################################################################
 
 
         # when adding entries here read the comments in the  method found bellow named:
         # when adding entries here read the comments in the  method found bellow named:
         # def new_object(self, kind, name, initialize, active=True, fit=True, plot=True)
         # def new_object(self, kind, name, initialize, active=True, fit=True, plot=True)
@@ -1612,9 +1622,9 @@ class App(QtCore.QObject):
             "tools_solderpaste_pp": self.ui.tools_defaults_form.tools_solderpaste_group.pp_combo,
             "tools_solderpaste_pp": self.ui.tools_defaults_form.tools_solderpaste_group.pp_combo,
             "tools_sub_close_paths": self.ui.tools_defaults_form.tools_sub_group.close_paths_cb,
             "tools_sub_close_paths": self.ui.tools_defaults_form.tools_sub_group.close_paths_cb,
 
 
-            # ###################################################################################
-            # ################################ TOOLS 2 ##########################################
-            # ###################################################################################
+            # #######################################################################################################
+            # ########################################## TOOLS 2 ####################################################
+            # #######################################################################################################
 
 
             # Optimal Tool
             # Optimal Tool
             "tools_opt_precision": self.ui.tools2_defaults_form.tools2_optimal_group.precision_sp,
             "tools_opt_precision": self.ui.tools2_defaults_form.tools2_optimal_group.precision_sp,
@@ -1738,10 +1748,10 @@ class App(QtCore.QObject):
         # When the self.defaults dictionary changes will update the Preferences GUI forms
         # When the self.defaults dictionary changes will update the Preferences GUI forms
         self.defaults.set_change_callback(self.on_defaults_dict_change)
         self.defaults.set_change_callback(self.on_defaults_dict_change)
 
 
-        # ##############################################################################
-        # ########################## FIRST RUN SECTION #################################
-        # ##################### It's done only once after install   ####################
-        # ##############################################################################
+        # ###########################################################################################################
+        # ##################################### FIRST RUN SECTION ###################################################
+        # ################################ It's done only once after install   #####################################
+        # ###########################################################################################################
 
 
         if self.defaults["first_run"] is True:
         if self.defaults["first_run"] is True:
             self.save_factory_defaults(silent_message=False)
             self.save_factory_defaults(silent_message=False)
@@ -1761,9 +1771,9 @@ class App(QtCore.QObject):
             self.defaults["first_run"] = False
             self.defaults["first_run"] = False
             self.save_defaults(silent=True)
             self.save_defaults(silent=True)
 
 
-        # #############################################################################
-        # ############################## Data #########################################
-        # #############################################################################
+        # ###########################################################################################################
+        # ############################################ Data #########################################################
+        # ###########################################################################################################
 
 
         self.recent = []
         self.recent = []
         self.recent_projects = []
         self.recent_projects = []
@@ -1773,9 +1783,9 @@ class App(QtCore.QObject):
         self.project_filename = None
         self.project_filename = None
         self.toggle_units_ignore = False
         self.toggle_units_ignore = False
 
 
-        # #############################################################################
-        # ########################## LOAD PREPROCESSORS ###############################
-        # #############################################################################
+        # ###########################################################################################################
+        # #################################### LOAD PREPROCESSORS ###################################################
+        # ###########################################################################################################
 
 
         # a dictionary that have as keys the name of the preprocessor files and the value is the class from
         # a dictionary that have as keys the name of the preprocessor files and the value is the class from
         # the preprocessor file
         # the preprocessor file
@@ -1809,32 +1819,31 @@ class App(QtCore.QObject):
 
 
             self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb.addItem(name)
             self.ui.excellon_defaults_form.excellon_opt_group.pp_excellon_name_cb.addItem(name)
 
 
-        # #############################################################################
-        # ########################## LOAD LANGUAGES  ##################################
-        # #############################################################################
+        # ###########################################################################################################
+        # ########################################## LOAD LANGUAGES  ################################################
+        # ###########################################################################################################
 
 
         self.languages = fcTranslate.load_languages()
         self.languages = fcTranslate.load_languages()
         for name in sorted(self.languages.values()):
         for name in sorted(self.languages.values()):
             self.ui.general_defaults_form.general_app_group.language_cb.addItem(name)
             self.ui.general_defaults_form.general_app_group.language_cb.addItem(name)
 
 
-        # #############################################################################
-        # ############################ APPLY APP LANGUAGE #############################
-        # #############################################################################
+        # ###########################################################################################################
+        # ####################################### APPLY APP LANGUAGE ################################################
+        # ###########################################################################################################
 
 
         ret_val = fcTranslate.apply_language('strings')
         ret_val = fcTranslate.apply_language('strings')
 
 
         if ret_val == "no language":
         if ret_val == "no language":
-            self.inform.emit('[ERROR] %s' %
-                             _("Could not find the Language files. The App strings are missing."))
+            self.inform.emit('[ERROR] %s' % _("Could not find the Language files. The App strings are missing."))
             log.debug("Could not find the Language files. The App strings are missing.")
             log.debug("Could not find the Language files. The App strings are missing.")
         else:
         else:
             # make the current language the current selection on the language combobox
             # make the current language the current selection on the language combobox
             self.ui.general_defaults_form.general_app_group.language_cb.setCurrentText(ret_val)
             self.ui.general_defaults_form.general_app_group.language_cb.setCurrentText(ret_val)
             log.debug("App.__init__() --> Applied %s language." % str(ret_val).capitalize())
             log.debug("App.__init__() --> Applied %s language." % str(ret_val).capitalize())
 
 
-        # #############################################################################
-        # ########################### CREATE UNIQUE SERIAL NUMBER #####################
-        # #############################################################################
+        # ###########################################################################################################
+        # ###################################### CREATE UNIQUE SERIAL NUMBER ########################################
+        # ###########################################################################################################
 
 
         chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
         chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
         if self.defaults['global_serial'] == 0 or len(str(self.defaults['global_serial'])) < 10:
         if self.defaults['global_serial'] == 0 or len(str(self.defaults['global_serial'])) < 10:
@@ -1854,15 +1863,15 @@ class App(QtCore.QObject):
         # if user_defaults:
         # if user_defaults:
         #     QtCore.QTimer.singleShot(self.defaults["global_defaults_save_period_ms"], auto_save_defaults)
         #     QtCore.QTimer.singleShot(self.defaults["global_defaults_save_period_ms"], auto_save_defaults)
 
 
-        # #############################################################################
-        # ########################### UPDATE THE OPTIONS ##############################
-        # #############################################################################
+        # ###########################################################################################################
+        # ######################################## UPDATE THE OPTIONS ###############################################
+        # ###########################################################################################################
 
 
         self.options = LoudDict()
         self.options = LoudDict()
-        # ----------------------------------------------------------------------------------------------------
+        # -----------------------------------------------------------------------------------------------------------
         #   Update the self.options from the self.defaults
         #   Update the self.options from the self.defaults
         #   The self.defaults holds the application defaults while the self.options holds the object defaults
         #   The self.defaults holds the application defaults while the self.options holds the object defaults
-        # -----------------------------------------------------------------------------------------------------
+        # -----------------------------------------------------------------------------------------------------------
         # Copy app defaults to project options
         # Copy app defaults to project options
         for def_key, def_val in self.defaults.items():
         for def_key, def_val in self.defaults.items():
             self.options[def_key] = deepcopy(def_val)
             self.options[def_key] = deepcopy(def_val)
@@ -1884,9 +1893,9 @@ class App(QtCore.QObject):
 
 
         # ### End of Data ####
         # ### End of Data ####
 
 
-        # #############################################################################
-        # ######################## SETUP OBJECT COLLECTION ############################
-        # #############################################################################
+        # ###########################################################################################################
+        # #################################### SETUP OBJECT COLLECTION ##############################################
+        # ###########################################################################################################
 
 
         self.collection = ObjectCollection(self)
         self.collection = ObjectCollection(self)
         self.ui.project_tab_layout.addWidget(self.collection.view)
         self.ui.project_tab_layout.addWidget(self.collection.view)
@@ -1897,9 +1906,9 @@ class App(QtCore.QObject):
         self.collection.view.setMinimumWidth(290)
         self.collection.view.setMinimumWidth(290)
         self.log.debug("Finished creating Object Collection.")
         self.log.debug("Finished creating Object Collection.")
 
 
-        # #############################################################################
-        # ############################## SETUP Plot Area ##############################
-        # #############################################################################
+        # ###########################################################################################################
+        # ######################################## SETUP Plot Area ##################################################
+        # ###########################################################################################################
 
 
         # determine if the Legacy Graphic Engine is to be used or the OpenGL one
         # determine if the Legacy Graphic Engine is to be used or the OpenGL one
         if self.defaults["global_graphic_engine"] == '3D':
         if self.defaults["global_graphic_engine"] == '3D':
@@ -1946,9 +1955,9 @@ class App(QtCore.QObject):
                                     color=QtGui.QColor("gray"))
                                     color=QtGui.QColor("gray"))
         self.ui.splitter.setStretchFactor(1, 2)
         self.ui.splitter.setStretchFactor(1, 2)
 
 
-        # #############################################################################
-        # ################################### SYS TRAY ################################
-        # #############################################################################
+        # ###########################################################################################################
+        # ############################################### SYS TRAY ##################################################
+        # ###########################################################################################################
         if self.defaults["global_systray_icon"]:
         if self.defaults["global_systray_icon"]:
             self.parent_w = QtWidgets.QWidget()
             self.parent_w = QtWidgets.QWidget()
 
 
@@ -1964,9 +1973,9 @@ class App(QtCore.QObject):
                                                                    '/flatcam_icon32_green.png'),
                                                                    '/flatcam_icon32_green.png'),
                                                   parent=self.parent_w)
                                                   parent=self.parent_w)
 
 
-        # #############################################################################
-        # ################################## Worker SETUP #############################
-        # #############################################################################
+        # ###########################################################################################################
+        # ############################################### Worker SETUP ##############################################
+        # ###########################################################################################################
         if self.defaults["global_worker_number"]:
         if self.defaults["global_worker_number"]:
             self.workers = WorkerStack(workers_number=int(self.defaults["global_worker_number"]))
             self.workers = WorkerStack(workers_number=int(self.defaults["global_worker_number"]))
         else:
         else:
@@ -1974,18 +1983,18 @@ class App(QtCore.QObject):
         self.worker_task.connect(self.workers.add_task)
         self.worker_task.connect(self.workers.add_task)
         self.log.debug("Finished creating Workers crew.")
         self.log.debug("Finished creating Workers crew.")
 
 
-        # #############################################################################
-        # ################################# Activity Monitor ##########################
-        # #############################################################################
+        # ###########################################################################################################
+        # ############################################# Activity Monitor ###########################################
+        # ###########################################################################################################
         self.activity_view = FlatCAMActivityView(app=self)
         self.activity_view = FlatCAMActivityView(app=self)
         self.ui.infobar.addWidget(self.activity_view)
         self.ui.infobar.addWidget(self.activity_view)
         self.proc_container = FCVisibleProcessContainer(self.activity_view)
         self.proc_container = FCVisibleProcessContainer(self.activity_view)
 
 
-        # #############################################################################
-        # ################################## Signal handling ##########################
-        # #############################################################################
+        # ###########################################################################################################
+        # ############################################# Signal handling #############################################
+        # ###########################################################################################################
 
 
-        # ################################# Custom signals  ###########################
+        # ########################################## Custom signals  ################################################
         # signal for displaying messages in status bar
         # signal for displaying messages in status bar
         self.inform.connect(self.info)
         self.inform.connect(self.info)
         # signal to be called when the app is quiting
         # signal to be called when the app is quiting
@@ -2004,7 +2013,7 @@ class App(QtCore.QObject):
         self.file_opened.connect(lambda kind, filename: self.register_folder(filename))
         self.file_opened.connect(lambda kind, filename: self.register_folder(filename))
         self.file_saved.connect(lambda kind, filename: self.register_save_folder(filename))
         self.file_saved.connect(lambda kind, filename: self.register_save_folder(filename))
 
 
-        # ############# Standard signals ###################
+        # ########################################## Standard signals ###############################################
         # ### Menu
         # ### Menu
         self.ui.menufilenewproject.triggered.connect(self.on_file_new_click)
         self.ui.menufilenewproject.triggered.connect(self.on_file_new_click)
         self.ui.menufilenewgeo.triggered.connect(self.new_geometry_object)
         self.ui.menufilenewgeo.triggered.connect(self.new_geometry_object)
@@ -2175,14 +2184,14 @@ class App(QtCore.QObject):
 
 
         self.ui.pref_defaults_button.clicked.connect(self.on_restore_defaults_preferences)
         self.ui.pref_defaults_button.clicked.connect(self.on_restore_defaults_preferences)
 
 
-        # #############################################################################
-        # ######################### GUI PREFERENCES SIGNALS ###########################
-        # #############################################################################
+        # ###########################################################################################################
+        # #################################### GUI PREFERENCES SIGNALS ##############################################
+        # ###########################################################################################################
 
 
         self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(
         self.ui.general_defaults_form.general_app_group.units_radio.activated_custom.connect(
             lambda: self.on_toggle_units(no_pref=False))
             lambda: self.on_toggle_units(no_pref=False))
 
 
-        # ############################# Workspace Setting Signals #####################
+        # ##################################### Workspace Setting Signals ###########################################
         self.ui.general_defaults_form.general_app_set_group.wk_cb.currentIndexChanged.connect(
         self.ui.general_defaults_form.general_app_set_group.wk_cb.currentIndexChanged.connect(
             self.on_workspace_modified)
             self.on_workspace_modified)
         self.ui.general_defaults_form.general_app_set_group.wk_orientation_radio.activated_custom.connect(
         self.ui.general_defaults_form.general_app_set_group.wk_orientation_radio.activated_custom.connect(
@@ -2191,13 +2200,13 @@ class App(QtCore.QObject):
 
 
         self.ui.general_defaults_form.general_app_set_group.workspace_cb.stateChanged.connect(self.on_workspace)
         self.ui.general_defaults_form.general_app_set_group.workspace_cb.stateChanged.connect(self.on_workspace)
 
 
-        # #############################################################################
-        # ############################# GUI SETTINGS SIGNALS ##########################
-        # #############################################################################
+        # ###########################################################################################################
+        # ######################################## GUI SETTINGS SIGNALS #############################################
+        # ###########################################################################################################
         self.ui.general_defaults_form.general_app_group.ge_radio.activated_custom.connect(self.on_app_restart)
         self.ui.general_defaults_form.general_app_group.ge_radio.activated_custom.connect(self.on_app_restart)
         self.ui.general_defaults_form.general_app_set_group.cursor_radio.activated_custom.connect(self.on_cursor_type)
         self.ui.general_defaults_form.general_app_set_group.cursor_radio.activated_custom.connect(self.on_cursor_type)
 
 
-        # ########## Tools related signals #############
+        # ######################################## Tools related signals ############################################
         # Film Tool
         # Film Tool
         self.ui.tools_defaults_form.tools_film_group.film_color_entry.editingFinished.connect(
         self.ui.tools_defaults_form.tools_film_group.film_color_entry.editingFinished.connect(
             self.on_film_color_entry)
             self.on_film_color_entry)
@@ -2235,9 +2244,9 @@ class App(QtCore.QObject):
         # when there are arguments at application startup this get launched
         # when there are arguments at application startup this get launched
         self.args_at_startup[list].connect(self.on_startup_args)
         self.args_at_startup[list].connect(self.on_startup_args)
 
 
-        # #############################################################################
-        # ########################## FILE ASSOCIATIONS SIGNALS ########################
-        # #############################################################################
+        # ###########################################################################################################
+        # ####################################### FILE ASSOCIATIONS SIGNALS #########################################
+        # ###########################################################################################################
 
 
         self.ui.util_defaults_form.fa_excellon_group.restore_btn.clicked.connect(
         self.ui.util_defaults_form.fa_excellon_group.restore_btn.clicked.connect(
             lambda: self.restore_extensions(ext_type='excellon'))
             lambda: self.restore_extensions(ext_type='excellon'))
@@ -2275,9 +2284,9 @@ class App(QtCore.QObject):
         self.ui.util_defaults_form.fa_gerber_group.grb_list_btn.clicked.connect(
         self.ui.util_defaults_form.fa_gerber_group.grb_list_btn.clicked.connect(
             lambda: self.on_register_files(obj_type='gerber'))
             lambda: self.on_register_files(obj_type='gerber'))
 
 
-        # #############################################################################
-        # ################################ KEYWORDS SIGNALS ###########################
-        # #############################################################################
+        # ###########################################################################################################
+        # ########################################### KEYWORDS SIGNALS ##############################################
+        # ###########################################################################################################
         self.ui.util_defaults_form.kw_group.restore_btn.clicked.connect(
         self.ui.util_defaults_form.kw_group.restore_btn.clicked.connect(
             lambda: self.restore_extensions(ext_type='keyword'))
             lambda: self.restore_extensions(ext_type='keyword'))
         self.ui.util_defaults_form.kw_group.del_all_btn.clicked.connect(
         self.ui.util_defaults_form.kw_group.del_all_btn.clicked.connect(
@@ -2298,14 +2307,16 @@ class App(QtCore.QObject):
 
 
         # signal to close the application
         # signal to close the application
         self.close_app_signal.connect(self.kill_app)
         self.close_app_signal.connect(self.kill_app)
-        # #####################################################################################
-        # ########### FINISHED CONNECTING SIGNALS #############################################
-        # #####################################################################################
+        # ################################# FINISHED CONNECTING SIGNALS #############################################
+        # ###########################################################################################################
+        # ###########################################################################################################
+        # ###########################################################################################################
+
         self.log.debug("Finished connecting Signals.")
         self.log.debug("Finished connecting Signals.")
 
 
-        # #####################################################################################
-        # ########################## Other setups #############################################
-        # #####################################################################################
+        # ###########################################################################################################
+        # ########################################## Other setups ###################################################
+        # ###########################################################################################################
 
 
         # to use for tools like Distance tool who depends on the event sources who are changed inside the Editors
         # to use for tools like Distance tool who depends on the event sources who are changed inside the Editors
         # depending on from where those tools are called different actions can be done
         # depending on from where those tools are called different actions can be done
@@ -2323,9 +2334,9 @@ class App(QtCore.QObject):
         # Sets up FlatCAMObj, FCProcess and FCProcessContainer.
         # Sets up FlatCAMObj, FCProcess and FCProcessContainer.
         self.setup_component_editor()
         self.setup_component_editor()
 
 
-        # #####################################################################################
-        # ######################### Auto-complete KEYWORDS ####################################
-        # #####################################################################################
+        # ###########################################################################################################
+        # ####################################### Auto-complete KEYWORDS ############################################
+        # ###########################################################################################################
         self.tcl_commands_list = ['add_circle', 'add_poly', 'add_polygon', 'add_polyline', 'add_rectangle',
         self.tcl_commands_list = ['add_circle', 'add_poly', 'add_polygon', 'add_polyline', 'add_rectangle',
                                   'aligndrill', 'aligndrillgrid', 'bbox', 'clear', 'cncjob', 'cutout',
                                   'aligndrill', 'aligndrillgrid', 'bbox', 'clear', 'cncjob', 'cutout',
                                   'del', 'drillcncjob', 'export_dxf', 'edxf', 'export_excellon',
                                   'del', 'drillcncjob', 'export_dxf', 'edxf', 'export_excellon',
@@ -2555,9 +2566,9 @@ class App(QtCore.QObject):
         self.autocomplete_kw_list = self.defaults['util_autocomplete_keywords'].replace(' ', '').split(',')
         self.autocomplete_kw_list = self.defaults['util_autocomplete_keywords'].replace(' ', '').split(',')
         self.myKeywords = self.tcl_commands_list + self.autocomplete_kw_list + self.tcl_keywords
         self.myKeywords = self.tcl_commands_list + self.autocomplete_kw_list + self.tcl_keywords
 
 
-        # ####################################################################################
-        # ####################### Shell SETUP ################################################
-        # ####################################################################################
+        # ###########################################################################################################
+        # ############################################## Shell SETUP ################################################
+        # ###########################################################################################################
 
 
         self.shell = FCShell(app=self, version=self.version)
         self.shell = FCShell(app=self, version=self.version)
 
 
@@ -2570,9 +2581,9 @@ class App(QtCore.QObject):
         else:
         else:
             self.ui.shell_dock.hide()
             self.ui.shell_dock.hide()
 
 
-        # ##################################################################################
-        # ###################### Tools and Plugins #########################################
-        # ##################################################################################
+        # ###########################################################################################################
+        # ########################################## Tools and Plugins ##############################################
+        # ###########################################################################################################
 
 
         self.dblsidedtool = None
         self.dblsidedtool = None
         self.distance_tool = None
         self.distance_tool = None
@@ -2608,22 +2619,22 @@ class App(QtCore.QObject):
         except AttributeError as e:
         except AttributeError as e:
             log.debug("App.__init__() install tools() --> %s" % str(e))
             log.debug("App.__init__() install tools() --> %s" % str(e))
 
 
-        # ##################################################################################
-        # ########################### SETUP RECENT ITEMS ###################################
-        # ##################################################################################
+        # ###########################################################################################################
+        # ############################################ SETUP RECENT ITEMS ###########################################
+        # ###########################################################################################################
         self.setup_recent_items()
         self.setup_recent_items()
 
 
-        # ##################################################################################
-        # ########################### BookMarks Manager ####################################
-        # ##################################################################################
+        # ###########################################################################################################
+        # ######################################### BookMarks Manager ###############################################
+        # ###########################################################################################################
 
 
         # install Bookmark Manager and populate bookmarks in the Help -> Bookmarks
         # install Bookmark Manager and populate bookmarks in the Help -> Bookmarks
         self.install_bookmarks()
         self.install_bookmarks()
         self.book_dialog_tab = BookmarkManager(app=self, storage=self.defaults["global_bookmarks"])
         self.book_dialog_tab = BookmarkManager(app=self, storage=self.defaults["global_bookmarks"])
 
 
-        # ##################################################################################
-        # ############################## Tools Database ####################################
-        # ##################################################################################
+        # ###########################################################################################################
+        # ########################################### Tools Database ################################################
+        # ###########################################################################################################
 
 
         self.tools_db_tab = None
         self.tools_db_tab = None
 
 
@@ -2631,9 +2642,9 @@ class App(QtCore.QObject):
         # self.f_parse = ParseFont(self)
         # self.f_parse = ParseFont(self)
         # self.parse_system_fonts()
         # self.parse_system_fonts()
 
 
-        # #####################################################################################
-        # ######################## Check for updates ##########################################
-        # #####################################################################################
+        # ###########################################################################################################
+        # ######################################### Check for updates ###############################################
+        # ###########################################################################################################
 
 
         # Separate thread (Not worker)
         # Separate thread (Not worker)
         # Check for updates on startup but only if the user consent and the app is not in Beta version
         # Check for updates on startup but only if the user consent and the app is not in Beta version
@@ -2646,16 +2657,16 @@ class App(QtCore.QObject):
                                    'params': []})
                                    'params': []})
             self.thr2.start(QtCore.QThread.LowPriority)
             self.thr2.start(QtCore.QThread.LowPriority)
 
 
-        # #####################################################################################
-        # ######################### Register files with FlatCAM;  #############################
-        # ######################### It works only for Windows for now  ########################
-        # #####################################################################################
+        # ###########################################################################################################
+        # ##################################### Register files with FlatCAM;  #######################################
+        # ################################### It works only for Windows for now  ####################################
+        # ###########################################################################################################
         if sys.platform == 'win32' and self.defaults["first_run"] is True:
         if sys.platform == 'win32' and self.defaults["first_run"] is True:
             self.on_register_files()
             self.on_register_files()
 
 
-        # #####################################################################################
-        # ###################### Variables for global usage ###################################
-        # #####################################################################################
+        # ###########################################################################################################
+        # ######################################## Variables for global usage #######################################
+        # ###########################################################################################################
 
 
         # hold the App units
         # hold the App units
         self.units = 'MM'
         self.units = 'MM'
@@ -2790,9 +2801,9 @@ class App(QtCore.QObject):
         # used in the delayed shutdown self.start_delayed_quit() method
         # used in the delayed shutdown self.start_delayed_quit() method
         self.save_timer = None
         self.save_timer = None
 
 
-        # ###############################################################################
-        # ################# ADDING FlatCAM EDITORS section ##############################
-        # ###############################################################################
+        # ###########################################################################################################
+        # ################################## ADDING FlatCAM EDITORS section #########################################
+        # ###########################################################################################################
 
 
         # watch out for the position of the editors instantiation ... if it is done before a save of the default values
         # watch out for the position of the editors instantiation ... if it is done before a save of the default values
         # at the first launch of the App , the editors will not be functional.
         # at the first launch of the App , the editors will not be functional.
@@ -2820,14 +2831,14 @@ class App(QtCore.QObject):
             self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio.set_value('T')
             self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio.set_value('T')
             self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio.setDisabled(True)
             self.ui.excellon_defaults_form.excellon_gen_group.excellon_optimization_radio.setDisabled(True)
 
 
-        # ###############################################################################
-        # ####################### Finished the CONSTRUCTOR ##############################
-        # ###############################################################################
+        # ###########################################################################################################
+        # ##################################### Finished the CONSTRUCTOR ############################################
+        # ###########################################################################################################
         App.log.debug("END of constructor. Releasing control.")
         App.log.debug("END of constructor. Releasing control.")
 
 
-        # #####################################################################################
-        # ########################## SHOW GUI #################################################
-        # #####################################################################################
+        # ###########################################################################################################
+        # ########################################## SHOW GUI #######################################################
+        # ###########################################################################################################
 
 
         # if the app is not started as headless, show it
         # if the app is not started as headless, show it
         if self.cmd_line_headless != 1:
         if self.cmd_line_headless != 1:
@@ -2850,9 +2861,9 @@ class App(QtCore.QObject):
         else:
         else:
             log.warning("*******************  RUNNING HEADLESS  *******************")
             log.warning("*******************  RUNNING HEADLESS  *******************")
 
 
-        # #####################################################################################
-        # ########################## START-UP ARGUMENTS #######################################
-        # #####################################################################################
+        # ###########################################################################################################
+        # ######################################## START-UP ARGUMENTS ###############################################
+        # ###########################################################################################################
 
 
         # test if the program was started with a script as parameter
         # test if the program was started with a script as parameter
         if self.cmd_line_shellvar:
         if self.cmd_line_shellvar:

+ 7 - 7
FlatCAMBookmark.py

@@ -278,12 +278,12 @@ class BookmarkManager(QtWidgets.QWidget):
         date = date.replace(' ', '_')
         date = date.replace(' ', '_')
 
 
         filter__ = "Text File (*.TXT);;All Files (*.*)"
         filter__ = "Text File (*.TXT);;All Files (*.*)"
-        filename, _f = FCFileSaveDialog.get_saved_filename( caption=_("Export FlatCAM Bookmarks"),
-                                                             directory='{l_save}/FlatCAM_{n}_{date}'.format(
-                                                                 l_save=str(self.app.get_last_save_folder()),
-                                                                 n=_("Bookmarks"),
-                                                                 date=date),
-                                                             filter=filter__)
+        filename, _f = FCFileSaveDialog.get_saved_filename(caption=_("Export FlatCAM Bookmarks"),
+                                                           directory='{l_save}/FlatCAM_{n}_{date}'.format(
+                                                                l_save=str(self.app.get_last_save_folder()),
+                                                                n=_("Bookmarks"),
+                                                                date=date),
+                                                           filter=filter__)
 
 
         filename = str(filename)
         filename = str(filename)
 
 
@@ -378,4 +378,4 @@ class BookmarkManager(QtWidgets.QWidget):
 
 
     def closeEvent(self, QCloseEvent):
     def closeEvent(self, QCloseEvent):
         self.rebuild_actions()
         self.rebuild_actions()
-        super().closeEvent(QCloseEvent)
+        super().closeEvent(QCloseEvent)

+ 1 - 1
flatcamGUI/FlatCAMGUI.py

@@ -16,7 +16,7 @@ from flatcamEditors.FlatCAMGeoEditor import FCShapeTool
 from matplotlib.backend_bases import KeyEvent as mpl_key_event
 from matplotlib.backend_bases import KeyEvent as mpl_key_event
 
 
 import webbrowser
 import webbrowser
-from ObjectCollection import KeySensitiveListView
+from flatcamObjects.ObjectCollection import KeySensitiveListView
 
 
 import subprocess
 import subprocess
 import os
 import os

+ 4 - 4
flatcamGUI/PlotCanvas.py

@@ -8,7 +8,7 @@
 from PyQt5 import QtCore
 from PyQt5 import QtCore
 
 
 import logging
 import logging
-from flatcamGUI.VisPyCanvas import VisPyCanvas, time, Color
+from flatcamGUI.VisPyCanvas import VisPyCanvas, Color
 from flatcamGUI.VisPyVisuals import ShapeGroup, ShapeCollection, TextCollection, TextGroup, Cursor
 from flatcamGUI.VisPyVisuals import ShapeGroup, ShapeCollection, TextCollection, TextGroup, Cursor
 from vispy.scene.visuals import InfiniteLine, Line
 from vispy.scene.visuals import InfiniteLine, Line
 
 
@@ -244,7 +244,7 @@ class PlotCanvas(QtCore.QObject, VisPyCanvas):
         """
         """
         if big is True:
         if big is True:
             self.big_cursor = True
             self.big_cursor = True
-            self.c = CursorBig()
+            self.c = CursorBig(app=self.fcapp)
 
 
             # in case there are multiple new_cursor calls, best to disconnect first the signals
             # in case there are multiple new_cursor calls, best to disconnect first the signals
             try:
             try:
@@ -410,9 +410,9 @@ class CursorBig(QtCore.QObject):
     mouse_state_updated = QtCore.pyqtSignal(bool)
     mouse_state_updated = QtCore.pyqtSignal(bool)
     mouse_position_updated = QtCore.pyqtSignal(list)
     mouse_position_updated = QtCore.pyqtSignal(list)
 
 
-    def __init__(self):
+    def __init__(self, app):
         super().__init__()
         super().__init__()
-
+        self.app = app
         self._enabled = None
         self._enabled = None
 
 
     @property
     @property

+ 0 - 0
ObjectCollection.py → flatcamObjects/ObjectCollection.py