From fa25644f8fb82e1a02b0c5e4609eacb71368ce54 Mon Sep 17 00:00:00 2001 From: Marius Stanciu Date: Mon, 31 Jan 2022 01:25:30 +0200 Subject: [PATCH] - now the `verbose log` parameter from the Preferences can take 3 values (0, 1, 2). Value = 0 means that the logging is disabled (mostly), value = 1 means that the logging is only in console and value = 3 means that the logging is now displayed in the Tcl box --- CHANGELOG.md | 1 + appCommon/Common.py | 20 ++++++- appGUI/preferences/PreferencesUIManager.py | 53 +++++++++---------- .../general/GeneralAppPrefGroupUI.py | 17 ++++-- appObjects/FlatCAMGerber.py | 9 ++-- appObjects/FlatCAMObj.py | 29 +++++----- app_Main.py | 8 ++- defaults.py | 7 +-- 8 files changed, 86 insertions(+), 58 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f4a033aa..e2b52cc2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ CHANGELOG for FlatCAM beta - made sure that when drilling and milling with a `laser` preprocessor the first move is not done with the laser on - fixed a minor UI glitch in the CNCJob UI - made sure that the `drillcncjob` and `cncjob` Tcl commands will use the `-las_power` parameter to set the laser power when using a preprocessor with `laser` in its name +- now the `verbose log` parameter from the Preferences can take 3 values (0, 1, 2). Value = 0 means that the logging is disabled (mostly), value = 1 means that the logging is only in console and value = 3 means that the logging is now displayed in the Tcl box 30.01.2022 diff --git a/appCommon/Common.py b/appCommon/Common.py index 715db047..96e66574 100644 --- a/appCommon/Common.py +++ b/appCommon/Common.py @@ -904,7 +904,7 @@ class ExclusionAreas(QtCore.QObject): class AppLogging: - def __init__(self, app): + def __init__(self, app, log_level): self.app = app self._log = logging.getLogger('base') @@ -915,7 +915,19 @@ class AppLogging: handler.setFormatter(formatter) self._log.addHandler(handler) + self._log_level = log_level + + @property + def log_level(self): + return self._log_level + + @log_level.setter + def log_level(self, val): + self._log = val if val in [0, 1, 2] else 0 + def info(self, msg): + if self._log_level == 0: + return # current date now date = str(datetime.today()).rpartition('.')[0] date = ''.join(c for c in date if c not in ':-') @@ -925,6 +937,8 @@ class AppLogging: self.app.inform_shell.emit('[log]INFO %s ***\t%s' % (date, msg)) def debug(self, msg): + if self._log_level == 0: + return # current date now date = str(datetime.today()).rpartition('.')[0] date = ''.join(c for c in date if c not in ':-') @@ -934,6 +948,8 @@ class AppLogging: self.app.inform_shell.emit('[log]DEBUG %s ***\t%s' % (date, msg)) def warning(self, msg): + if self._log_level == 0: + return # current date now date = str(datetime.today()).rpartition('.')[0] date = ''.join(c for c in date if c not in ':-') @@ -943,6 +959,8 @@ class AppLogging: self.app.inform_shell.emit('[log]WARNING %s ***\t%s' % (date, msg)) def error(self, msg): + if self._log_level == 0: + return # current date now date = str(datetime.today()).rpartition('.')[0] date = ''.join(c for c in date if c not in ':-') diff --git a/appGUI/preferences/PreferencesUIManager.py b/appGUI/preferences/PreferencesUIManager.py index e88684cc..67c89f45 100644 --- a/appGUI/preferences/PreferencesUIManager.py +++ b/appGUI/preferences/PreferencesUIManager.py @@ -2,7 +2,6 @@ import os from PyQt6 import QtGui, QtCore, QtWidgets from PyQt6.QtCore import QSettings from defaults import FlatCAMDefaults -import logging from appGUI.GUIElements import FCMessageBox @@ -14,8 +13,6 @@ fcTranslate.apply_language('strings') if '_' not in builtins.__dict__: _ = gettext.gettext -log = logging.getLogger('base2') - class PreferencesUIManager: @@ -49,7 +46,7 @@ class PreferencesUIManager: "units": self.ui.general_pref_form.general_app_group.units_radio, "global_graphic_engine": self.ui.general_pref_form.general_app_group.ge_radio, "global_app_level": self.ui.general_pref_form.general_app_group.app_level_radio, - "global_log_verbose": self.ui.general_pref_form.general_app_group.verbose_cb, + "global_log_verbose": self.ui.general_pref_form.general_app_group.verbose_combo, "global_portable": self.ui.general_pref_form.general_app_group.portability_cb, "global_language_current": self.ui.general_pref_form.general_app_group.language_combo, @@ -733,7 +730,7 @@ class PreferencesUIManager: try: self.defaults[option] = self.defaults_form_fields[option].get_value() except Exception as e: - log.error("App.defaults_read_form() --> %s" % str(e)) + self.ui.app.log.error("App.defaults_read_form() --> %s" % str(e)) def defaults_write_form(self, factor=None, fl_units=None, source_dict=None): """ @@ -781,7 +778,7 @@ class PreferencesUIManager: except KeyError: pass except AttributeError: - log.debug(field) + self.ui.app.log.debug(field) def show_preferences_gui(self): """ @@ -794,7 +791,7 @@ class PreferencesUIManager: try: self.ui.general_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") self.ui.general_scroll_area.setWidget(gen_form) gen_form.show() @@ -802,7 +799,7 @@ class PreferencesUIManager: try: self.ui.gerber_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") self.ui.gerber_scroll_area.setWidget(ger_form) ger_form.show() @@ -810,7 +807,7 @@ class PreferencesUIManager: try: self.ui.excellon_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") self.ui.excellon_scroll_area.setWidget(exc_form) exc_form.show() @@ -818,7 +815,7 @@ class PreferencesUIManager: try: self.ui.geometry_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") self.ui.geometry_scroll_area.setWidget(geo_form) geo_form.show() @@ -826,7 +823,7 @@ class PreferencesUIManager: try: self.ui.cncjob_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") self.ui.cncjob_scroll_area.setWidget(cnc_form) cnc_form.show() @@ -834,7 +831,7 @@ class PreferencesUIManager: try: self.ui.plugins_engraving_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") self.ui.plugins_engraving_scroll_area.setWidget(plugins_engraving_form) plugins_engraving_form.show() @@ -842,7 +839,7 @@ class PreferencesUIManager: try: self.ui.tools_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") self.ui.tools_scroll_area.setWidget(plugins_form) plugins_form.show() @@ -850,7 +847,7 @@ class PreferencesUIManager: try: self.ui.tools2_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") self.ui.tools2_scroll_area.setWidget(plugins2_form) plugins2_form.show() @@ -858,7 +855,7 @@ class PreferencesUIManager: try: self.ui.fa_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") self.ui.fa_scroll_area.setWidget(fa_form) fa_form.show() @@ -898,47 +895,47 @@ class PreferencesUIManager: try: self.ui.general_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") try: self.ui.gerber_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") try: self.ui.excellon_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") try: self.ui.geometry_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") try: self.ui.cncjob_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") try: self.ui.plugins_engraving_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") try: self.ui.tools_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") try: self.ui.tools2_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") try: self.ui.fa_scroll_area.takeWidget() except Exception: - log.debug("Nothing to remove") + self.ui.app.log.debug("Nothing to remove") def __init_color_pickers(self): # Init Gerber Plot Colors @@ -1028,7 +1025,7 @@ class PreferencesUIManager: self.defaults['tools_qrcode_back_color']) def on_save_button(self, save_to_file=True): - log.debug("on_save_button() --> Applying preferences to file.") + self.ui.app.log.debug("on_save_button() --> Applying preferences to file.") # Preferences saved, update flag self.preferences_changed_flag = False @@ -1142,7 +1139,7 @@ class PreferencesUIManager: :return: None """ - log.debug("on_restore_defaults_preferences()") + self.ui.app.log.debug("on_restore_defaults_preferences()") self.defaults.reset_to_factory_defaults() self.defaults_write_form() self.on_preferences_edited() @@ -1162,7 +1159,7 @@ class PreferencesUIManager: :param first_time: Boolean. If True will execute some code when the app is run first time :return: None """ - log.debug("App.PreferencesUIManager.save_defaults()") + self.ui.app.log.debug("App.PreferencesUIManager.save_defaults()") if data_path is None: data_path = self.data_path @@ -1178,7 +1175,7 @@ class PreferencesUIManager: try: self.defaults.write(filename=filename) except Exception as e: - log.error("save_defaults() --> Failed to write defaults to file %s" % str(e)) + self.ui.app.log.error("save_defaults() --> Failed to write defaults to file %s" % str(e)) self.inform.emit('[ERROR_NOTCL] %s %s' % (_("Failed to write defaults to file."), str(filename))) return diff --git a/appGUI/preferences/general/GeneralAppPrefGroupUI.py b/appGUI/preferences/general/GeneralAppPrefGroupUI.py index f361e318..60d378ea 100644 --- a/appGUI/preferences/general/GeneralAppPrefGroupUI.py +++ b/appGUI/preferences/general/GeneralAppPrefGroupUI.py @@ -3,7 +3,7 @@ import sys from PyQt6.QtCore import QSettings from appGUI.GUIElements import RadioSet, FCSpinner, FCCheckBox, FCComboBox, FCButton, OptionalInputSection, \ - FCDoubleSpinner, FCLabel, FCGridLayout, RadioSetDefaults, FCFrame + FCDoubleSpinner, FCLabel, FCGridLayout, RadioSetDefaults, FCFrame, FCComboBox2 from appGUI.preferences.OptionsGroupUI import OptionsGroupUI import gettext @@ -150,11 +150,18 @@ class GeneralAppPrefGroupUI(OptionsGroupUI): grid1.addWidget(self.portability_cb, 6, 0, 1, 2) # Verbose Log - self.verbose_cb = FCCheckBox('%s' % _('Verbose log')) - self.verbose_cb.setToolTip(_("Enable log messages in the Tcl Shell.\n" - "Require restart.")) + self.verbose_label = FCLabel('%s:' % _('Verbose log')) + self.verbose_label.setToolTip(_("Set the log level.\n" + "Values:\n" + "0 -> logging is disabled\n" + "1 -> logging is done only in console\n" + "2 -> verbose logging with messages in the Tcl Shell\n" + "Require restart.")) + self.verbose_combo = FCComboBox2() + self.verbose_combo.addItems(['0','1', '2']) - grid1.addWidget(self.verbose_cb, 8, 0, 1, 2) + grid1.addWidget(self.verbose_label, 8, 0) + grid1.addWidget(self.verbose_combo, 8, 1) # ############################################################################################################# # Grid0 Frame diff --git a/appObjects/FlatCAMGerber.py b/appObjects/FlatCAMGerber.py index 02fdb50c..81bf8a23 100644 --- a/appObjects/FlatCAMGerber.py +++ b/appObjects/FlatCAMGerber.py @@ -118,7 +118,7 @@ class GerberObject(FlatCAMObj, Gerber): :return: None """ FlatCAMObj.set_ui(self, ui) - log.debug("GerberObject.set_ui()") + self.app.log.debug("GerberObject.set_ui()") self.units = self.app.app_units.upper() @@ -910,7 +910,7 @@ class GerberObject(FlatCAMObj, Gerber): :param kwargs: Color and face_color, visible :return: """ - log.debug(str(inspect.stack()[1][3]) + " --> GerberObject.plot()") + self.app.log.debug(str(inspect.stack()[1][3]) + " --> GerberObject.plot()") # Does all the required setup and returns False # if the 'ptint' option is set to False. @@ -1666,8 +1666,7 @@ class GerberObject(FlatCAMObj, Gerber): return gerber_code - @staticmethod - def merge(grb_list, grb_final): + def merge(self, grb_list, grb_final): """ Merges the geometry of objects in geo_list into the geometry of geo_final. @@ -1699,7 +1698,7 @@ class GerberObject(FlatCAMObj, Gerber): try: grb_final.options[option] = grb.options[option] except KeyError: - log.warning("Failed to copy option.", option) + self.app.log.warning("Failed to copy option.", option) try: for geos in grb.solid_geometry: diff --git a/appObjects/FlatCAMObj.py b/appObjects/FlatCAMObj.py index 0e1d44f5..442260cc 100644 --- a/appObjects/FlatCAMObj.py +++ b/appObjects/FlatCAMObj.py @@ -151,9 +151,9 @@ class FlatCAMObj(QtCore.QObject): try: setattr(self, attr, d[attr]) except KeyError: - log.debug("FlatCAMObj.from_dict() --> KeyError: %s. " - "Means that we are loading an old project that don't" - "have all attributes in the latest application version." % str(attr)) + self.app.log.debug("FlatCAMObj.from_dict() --> KeyError: %s. " + "Means that we are loading an old project that don't" + "have all attributes in the latest application version." % str(attr)) pass def on_options_change(self, key): @@ -220,7 +220,7 @@ class FlatCAMObj(QtCore.QObject): @visible.setter def visible(self, value, threaded=True): - log.debug("FlatCAMObj.visible()") + self.app.log.debug("FlatCAMObj.visible()") # self.shapes.enabled = not self.shapes.enabled @@ -300,7 +300,7 @@ class FlatCAMObj(QtCore.QObject): """ self.muted_ui = True - log.debug(str(inspect.stack()[1][3]) + "--> FlatCAMObj.build_ui()") + self.app.log.debug(str(inspect.stack()[1][3]) + "--> FlatCAMObj.build_ui()") try: # HACK: disconnect the scale entry signal since on focus out event will trigger an undesired scale() @@ -336,7 +336,8 @@ class FlatCAMObj(QtCore.QObject): self.app.shell._edit.set_model_data(self.app.myKeywords) self.app.ui.code_editor.set_model_data(self.app.myKeywords) except Exception: - log.debug("on_name_activate() --> Could not remove the old object name from auto-completer model list") + self.app.log.debug( + "on_name_activate() --> Could not remove the old object name from auto-completer model list") self.options["name"] = self.ui.name_entry.get_value() self.default_data["name"] = self.ui.name_entry.get_value() @@ -369,7 +370,7 @@ class FlatCAMObj(QtCore.QObject): factor = float(self.ui.scale_entry.get_value()) except Exception as e: self.app.inform.emit('[ERROR_NOTCL] %s' % _("Scaling could not be executed.")) - log.error("FlatCAMObj.on_scale_button_click() -- %s" % str(e)) + self.app.log.error("FlatCAMObj.on_scale_button_click() -- %s" % str(e)) return if type(factor) != float: @@ -380,7 +381,7 @@ class FlatCAMObj(QtCore.QObject): self.app.inform.emit('[success] %s' % _("Scale done.")) return - log.debug("FlatCAMObj.on_scale_button_click()") + self.app.log.debug("FlatCAMObj.on_scale_button_click()") def worker_task(): with self.app.proc_container.new(_("Scaling...")): @@ -416,7 +417,7 @@ class FlatCAMObj(QtCore.QObject): :return: None """ - log.debug(str(inspect.stack()[1][3]) + " --> FlatCAMObj.to_form()") + self.app.log.debug(str(inspect.stack()[1][3]) + " --> FlatCAMObj.to_form()") for option in self.options: try: self.set_form_item(option) @@ -430,7 +431,7 @@ class FlatCAMObj(QtCore.QObject): :return: None :rtype: None """ - log.debug(str(inspect.stack()[1][3]) + "--> FlatCAMObj.read_form()") + self.app.log.debug(str(inspect.stack()[1][3]) + "--> FlatCAMObj.read_form()") for option in self.options: try: self.read_form_item(option) @@ -579,7 +580,7 @@ class FlatCAMObj(QtCore.QObject): length = abs(xmax - xmin) width = abs(ymax - ymin) except Exception as ee: - log.error("FlatCAMObj.add_properties_items() -> calculate dimensions --> %s" % str(ee)) + self.app.log.error("FlatCAMObj.add_properties_items() -> calculate dimensions --> %s" % str(ee)) # calculate box area if self.app.app_units.lower() == 'mm': @@ -611,7 +612,7 @@ class FlatCAMObj(QtCore.QObject): xmax.append(x1) ymax.append(y1) except Exception as ee: - log.error("FlatCAMObj.add_properties_items() cncjob --> %s" % str(ee)) + self.app.log.error("FlatCAMObj.add_properties_items() cncjob --> %s" % str(ee)) else: try: if obj_prop.tools: @@ -626,7 +627,7 @@ class FlatCAMObj(QtCore.QObject): xmax.append(x1) ymax.append(y1) except Exception as ee: - log.error("FlatCAMObj.add_properties_items() not cncjob tools --> %s" % str(ee)) + self.app.log.error("FlatCAMObj.add_properties_items() not cncjob tools --> %s" % str(ee)) if xmin and ymin and xmax and ymax: xmin = min(xmin) @@ -687,7 +688,7 @@ class FlatCAMObj(QtCore.QObject): area_chull = max(area_chull_list) except Exception as er: area_chull = None - log.error("FlatCAMObj.add_properties_items() area chull--> %s" % str(er)) + self.app.log.error("FlatCAMObj.add_properties_items() area chull--> %s" % str(er)) if self.app.app_units.lower() == 'mm' and area_chull: area_chull = area_chull / 100 diff --git a/app_Main.py b/app_Main.py index 26899f64..cb9069db 100644 --- a/app_Main.py +++ b/app_Main.py @@ -868,9 +868,13 @@ class App(QtCore.QObject): # ############################################################################################################ # ################################### Set LOG verbosity ###################################################### # ############################################################################################################ - if self.defaults["global_log_verbose"] is True: + + if self.defaults["global_log_verbose"] == 2: self.log.handlers.pop() - self.log = AppLogging(app=self) + self.log = AppLogging(app=self, log_level=2) + if self.defaults["global_log_verbose"] == 0: + self.log.handlers.pop() + self.log = AppLogging(app=self, log_level=0) # ########################################################################################################### # #################################### SETUP OBJECT CLASSES ################################################# diff --git a/defaults.py b/defaults.py index 34d8081e..f98d20fe 100644 --- a/defaults.py +++ b/defaults.py @@ -84,7 +84,7 @@ class FlatCAMDefaults: "global_graphic_engine": '3D', "global_app_level": 'b', - "global_log_verbose": True, + "global_log_verbose": 2, "global_portable": False, "global_languages": ['English', 'Romanian'], @@ -1001,7 +1001,7 @@ class FlatCAMDefaults: an alternative to project options but allows the use of values invisible to the user. """ - log.debug("propagate_defaults()") + # log.debug("propagate_defaults()") # Which objects to update the given parameters. routes = { @@ -1020,7 +1020,8 @@ class FlatCAMDefaults: try: routes[param].defaults[param] = self.defaults[param] except KeyError: - log.error("FlatCAMApp.propagate_defaults() --> ERROR: " + param + " not in defaults.") + # log.error("FlatCAMApp.propagate_defaults() --> ERROR: " + param + " not in defaults.") + pass else: # Try extracting the name: # classname_param here is param in the object