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 ]
self.laststamp = datetime.now()
for key in ('printTag','noUpdateUI','timing','lineno'):
setattr(self,key,kargs.get(key,True))
for key,default in (('printTag',True),('noUpdateUI',True),
('timing',True),('lineno',True),('parent',None)):
setattr(self,key,kargs.get(key,default))
def _isEnabledFor(self,level):
if self.parent and not self.parent._isEnabledFor(level):
return False
return FreeCAD.getLogLevel(self.tag) >= 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):
self.log(0,msg,frame+1)
@ -68,3 +73,41 @@ class FCADLogger:
FreeCADGui.updateGui()
except Exception:
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 collections import namedtuple
import FreeCAD, FreeCADGui
import asm3
import asm3.utils as utils
from asm3.gui import AsmCmdManager
from asm3.utils import logger, objName
from asm3.utils import objName,cstrlogger as logger, guilogger
from asm3.proxy import ProxyType, PropertyInfo, propGet, propGetValue
import os
@ -153,6 +153,7 @@ class ConstraintCommand:
def __init__(self,tp):
self.tp = tp
self._id = 100 + tp._id
self._active = False
def workbenchActivated(self):
pass
@ -170,25 +171,20 @@ class ConstraintCommand:
return self.tp.GetResources()
def Activated(self):
from asm3.assembly import AsmConstraint
AsmConstraint.make(self.tp._id)
guilogger.report('constraint "{}" command exception'.format(
self.tp.getName()), asm3.assembly.AsmConstraint.make,self.tp._id)
def IsActive(self):
return FreeCADGui.ActiveDocument and self.tp._active
return FreeCADGui.ActiveDocument and self._active
def checkActive(self):
from asm3.assembly import AsmConstraint
try:
AsmConstraint.getSelection(self.tp._id)
except Exception as e:
logger.trace('selection "{}" exception: {}'.format(
self.tp.getName(),e.message),frame=1)
self.tp._active = False
else:
self.tp._active = True
if guilogger.catchTrace('selection "{}" exception'.format(
self.tp.getName()), AsmConstraint.getSelection, self.tp._id):
self._active = True
def onClearSelection(self):
self.tp._active = False
self._active = False
class Constraint(ProxyType):
'constraint meta class'
@ -200,8 +196,8 @@ class Constraint(ProxyType):
@classmethod
def register(mcs,cls):
super(Constraint,mcs).register(cls)
if cls._menuItem:
AsmCmdManager.register(ConstraintCommand(cls))
if cls._id>=0 and cls._menuItem:
asm3.gui.AsmCmdManager.register(ConstraintCommand(cls))
@classmethod
def attach(mcs,obj,checkType=True):
@ -271,7 +267,6 @@ class Base(with_metaclass(Constraint,object)):
_iconName = 'Assembly_ConstraintGeneral.svg'
_menuText = 'Create "{}" constraint'
_active = False
_menuItem = False
def __init__(self,_obj):

10
gui.py
View File

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

View File

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

View File

@ -2,7 +2,7 @@ import random
from collections import namedtuple
import FreeCAD, FreeCADGui
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.system import System

View File

@ -1,6 +1,6 @@
from future.utils import with_metaclass
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
class SystemSlvs(with_metaclass(System,SystemBase)):

View File

@ -3,7 +3,7 @@ from future.utils import with_metaclass, iteritems
import pprint
from asm3.proxy import ProxyType, PropertyInfo
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.vector as spv
import scipy.optimize as sopt

View File

@ -1,7 +1,7 @@
import os
from future.utils import with_metaclass
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
class System(ProxyType):

View File

@ -8,7 +8,12 @@ assembly2
import FreeCAD, FreeCADGui, Part
import numpy as np
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
modulePath = os.path.dirname(os.path.realpath(__file__))