FCADLogger: add hierarchy log level support

Each module now has their own logger, and can be controlled separately
This commit is contained in:
Zheng, Lei 2017-10-30 03:52:54 +08:00
parent fbbb1ab567
commit cc16b178bb
9 changed files with 76 additions and 29 deletions

View File

@ -14,14 +14,19 @@ class FCADLogger:
FreeCAD.Console.PrintLog, FreeCAD.Console.PrintLog,
FreeCAD.Console.PrintLog ] FreeCAD.Console.PrintLog ]
self.laststamp = datetime.now() self.laststamp = datetime.now()
for key in ('printTag','noUpdateUI','timing','lineno'): for key,default in (('printTag',True),('noUpdateUI',True),
setattr(self,key,kargs.get(key,True)) ('timing',True),('lineno',True),('parent',None)):
setattr(self,key,kargs.get(key,default))
def _isEnabledFor(self,level): def _isEnabledFor(self,level):
if self.parent and not self.parent._isEnabledFor(level):
return False
return FreeCAD.getLogLevel(self.tag) >= level return FreeCAD.getLogLevel(self.tag) >= level
def isEnabledFor(self,level): def isEnabledFor(self,level):
self._isEnabledOf(self.levels[level]) if not isinstance(level,int):
level = self.levels[level]
return self._isEnabledFor(level)
def error(self,msg,frame=0): def error(self,msg,frame=0):
self.log(0,msg,frame+1) self.log(0,msg,frame+1)
@ -68,3 +73,41 @@ class FCADLogger:
FreeCADGui.updateGui() FreeCADGui.updateGui()
except Exception: except Exception:
pass pass
def _catch(self,level,msg,func,args=None,kargs=None):
try:
if not args:
args = []
if not kargs:
kargs = {}
return func(*args,**kargs)
except Exception:
if self._isEnabledFor(level):
import traceback
self.log(level,msg+'\n'+traceback.format_exc(),frame=2)
def catch(self,msg,func,*args,**kargs):
return self._catch(0,msg,func,args,kargs)
def catchWarn(self,msg,func,*args,**kargs):
return self._catch(1,msg,func,args,kargs)
def catchInfo(self,msg,func,*args,**kargs):
return self._catch(2,msg,func,args,kargs)
def catchDebug(self,msg,func,*args,**kargs):
return self._catch(3,msg,func,args,kargs)
def catchTrace(self,msg,func,*args,**kargs):
return self._catch(4,msg,func,args,kargs)
def report(self,msg,func,*args,**kargs):
try:
return func(*args,**kargs)
except Exception as e:
import traceback
self.error(msg+'\n'+traceback.format_exc(),frame=1)
import PySide
PySide.QtGui.QMessageBox.critical(
FreeCADGui.getMainWindow(),'Assembly',e.message)

View File

@ -1,9 +1,9 @@
from future.utils import with_metaclass from future.utils import with_metaclass
from collections import namedtuple from collections import namedtuple
import FreeCAD, FreeCADGui import FreeCAD, FreeCADGui
import asm3
import asm3.utils as utils import asm3.utils as utils
from asm3.gui import AsmCmdManager from asm3.utils import objName,cstrlogger as logger, guilogger
from asm3.utils import logger, objName
from asm3.proxy import ProxyType, PropertyInfo, propGet, propGetValue from asm3.proxy import ProxyType, PropertyInfo, propGet, propGetValue
import os import os
@ -153,6 +153,7 @@ class ConstraintCommand:
def __init__(self,tp): def __init__(self,tp):
self.tp = tp self.tp = tp
self._id = 100 + tp._id self._id = 100 + tp._id
self._active = False
def workbenchActivated(self): def workbenchActivated(self):
pass pass
@ -170,25 +171,20 @@ class ConstraintCommand:
return self.tp.GetResources() return self.tp.GetResources()
def Activated(self): def Activated(self):
from asm3.assembly import AsmConstraint guilogger.report('constraint "{}" command exception'.format(
AsmConstraint.make(self.tp._id) self.tp.getName()), asm3.assembly.AsmConstraint.make,self.tp._id)
def IsActive(self): def IsActive(self):
return FreeCADGui.ActiveDocument and self.tp._active return FreeCADGui.ActiveDocument and self._active
def checkActive(self): def checkActive(self):
from asm3.assembly import AsmConstraint from asm3.assembly import AsmConstraint
try: if guilogger.catchTrace('selection "{}" exception'.format(
AsmConstraint.getSelection(self.tp._id) self.tp.getName()), AsmConstraint.getSelection, self.tp._id):
except Exception as e: self._active = True
logger.trace('selection "{}" exception: {}'.format(
self.tp.getName(),e.message),frame=1)
self.tp._active = False
else:
self.tp._active = True
def onClearSelection(self): def onClearSelection(self):
self.tp._active = False self._active = False
class Constraint(ProxyType): class Constraint(ProxyType):
'constraint meta class' 'constraint meta class'
@ -200,8 +196,8 @@ class Constraint(ProxyType):
@classmethod @classmethod
def register(mcs,cls): def register(mcs,cls):
super(Constraint,mcs).register(cls) super(Constraint,mcs).register(cls)
if cls._menuItem: if cls._id>=0 and cls._menuItem:
AsmCmdManager.register(ConstraintCommand(cls)) asm3.gui.AsmCmdManager.register(ConstraintCommand(cls))
@classmethod @classmethod
def attach(mcs,obj,checkType=True): def attach(mcs,obj,checkType=True):
@ -271,7 +267,6 @@ class Base(with_metaclass(Constraint,object)):
_iconName = 'Assembly_ConstraintGeneral.svg' _iconName = 'Assembly_ConstraintGeneral.svg'
_menuText = 'Create "{}" constraint' _menuText = 'Create "{}" constraint'
_active = False
_menuItem = False _menuItem = False
def __init__(self,_obj): def __init__(self,_obj):

10
gui.py
View File

@ -2,8 +2,9 @@ from future.utils import with_metaclass
from collections import OrderedDict from collections import OrderedDict
import FreeCAD, FreeCADGui import FreeCAD, FreeCADGui
import asm3 import asm3
from asm3.utils import logger,objName,addIconToFCAD from asm3.utils import objName,addIconToFCAD,guilogger as logger
from asm3.proxy import ProxyType from asm3.proxy import ProxyType
from asm3.FCADLogger import FCADLogger
class SelectionObserver: class SelectionObserver:
def __init__(self, cmds): def __init__(self, cmds):
@ -28,12 +29,14 @@ class SelectionObserver:
cmd.onClearSelection() cmd.onClearSelection()
def attach(self): def attach(self):
logger.trace('attach selection aboserver {}'.format(self._attached))
if not self._attached: if not self._attached:
FreeCADGui.Selection.addObserver(self) FreeCADGui.Selection.addObserver(self)
self._attached = True self._attached = True
self.onChanged() self.onChanged()
def detach(self): def detach(self):
logger.trace('detach selection aboserver {}'.format(self._attached))
if self._attached: if self._attached:
FreeCADGui.Selection.removeObserver(self) FreeCADGui.Selection.removeObserver(self)
self._attached = False self._attached = False
@ -128,8 +131,9 @@ class AsmCmdSolve(AsmCmdBase):
@classmethod @classmethod
def Activated(cls): def Activated(cls):
import asm3.solver as solver logger.report('command "{}" exception'.format(cls.getName()),
solver.solve() asm3.solver.solve)
class AsmCmdMove(AsmCmdBase): class AsmCmdMove(AsmCmdBase):
_id = 2 _id = 2

View File

@ -1,6 +1,6 @@
import past.builtins as pb import past.builtins as pb
from collections import namedtuple from collections import namedtuple
from asm3.utils import logger, objName from asm3.utils import proxylogger as logger, objName
def propGet(self,obj): def propGet(self,obj):
return getattr(obj,self.Name) return getattr(obj,self.Name)

View File

@ -2,7 +2,7 @@ import random
from collections import namedtuple from collections import namedtuple
import FreeCAD, FreeCADGui import FreeCAD, FreeCADGui
import asm3.assembly as asm import asm3.assembly as asm
from asm3.utils import logger, objName, isSamePlacement from asm3.utils import syslogger as logger, objName, isSamePlacement
from asm3.constraint import Constraint, cstrName from asm3.constraint import Constraint, cstrName
from asm3.system import System from asm3.system import System

View File

@ -1,6 +1,6 @@
from future.utils import with_metaclass from future.utils import with_metaclass
from asm3.system import System, SystemBase, SystemExtension from asm3.system import System, SystemBase, SystemExtension
from asm3.utils import logger, objName from asm3.utils import syslogger as logger, objName
import asm3.py_slvs.slvs as slvs import asm3.py_slvs.slvs as slvs
class SystemSlvs(with_metaclass(System,SystemBase)): class SystemSlvs(with_metaclass(System,SystemBase)):

View File

@ -3,7 +3,7 @@ from future.utils import with_metaclass, iteritems
import pprint import pprint
from asm3.proxy import ProxyType, PropertyInfo from asm3.proxy import ProxyType, PropertyInfo
from asm3.system import System, SystemBase, SystemExtension from asm3.system import System, SystemBase, SystemExtension
from asm3.utils import logger, objName from asm3.utils import syslogger as logger, objName
import sympy as sp import sympy as sp
import sympy.vector as spv import sympy.vector as spv
import scipy.optimize as sopt import scipy.optimize as sopt

View File

@ -1,7 +1,7 @@
import os import os
from future.utils import with_metaclass from future.utils import with_metaclass
import asm3.utils as utils import asm3.utils as utils
from asm3.utils import logger, objName from asm3.utils import syslogger as logger, objName
from asm3.proxy import ProxyType, PropertyInfo from asm3.proxy import ProxyType, PropertyInfo
class System(ProxyType): class System(ProxyType):

View File

@ -8,7 +8,12 @@ assembly2
import FreeCAD, FreeCADGui, Part import FreeCAD, FreeCADGui, Part
import numpy as np import numpy as np
from asm3.FCADLogger import FCADLogger from asm3.FCADLogger import FCADLogger
logger = FCADLogger('asm3') rootlogger = FCADLogger('asm3')
logger = FCADLogger('asm3.main',parent=rootlogger)
guilogger = FCADLogger('asm3.gui',parent=rootlogger)
cstrlogger = FCADLogger('asm3.cstr',parent=rootlogger)
syslogger = FCADLogger('asm3.sys',parent=rootlogger)
proxylogger = FCADLogger('asm3.proxy',parent=rootlogger)
import sys, os import sys, os
modulePath = os.path.dirname(os.path.realpath(__file__)) modulePath = os.path.dirname(os.path.realpath(__file__))