FCADLogger: add support for lazy string evaluation

This commit is contained in:
Zheng, Lei 2018-10-10 19:01:25 +08:00
parent d9bef09d1c
commit 2b206d3b0e
11 changed files with 163 additions and 147 deletions

View File

@ -2,6 +2,12 @@ import os, inspect, sys
from datetime import datetime
import FreeCAD, FreeCADGui
PY3 = sys.version_info[0] == 3
if PY3:
string_type = str
else:
string_type = basestring
class FCADLogger:
def __init__(self, tag, **kargs):
self.tag = tag
@ -28,25 +34,42 @@ class FCADLogger:
level = self.levels[level]
return self._isEnabledFor(level)
def error(self,msg,frame=0):
self.log(0,msg,frame+1)
def error(self,msg,*args,**kargs):
if self._isEnabledFor(0):
frame = kargs.get('frame',0)+1
if isinstance(msg,string_type):
msg = msg.format(*args,**kargs)
self.log(0,msg,frame)
def warn(self,msg,frame=0):
self.log(1,msg,frame+1)
def warn(self,msg,*args,**kargs):
if self._isEnabledFor(1):
frame = kargs.get('frame',0)+1
if isinstance(msg,string_type):
msg = msg.format(*args,**kargs)
self.log(1,msg,frame)
def info(self,msg,frame=0):
self.log(2,msg,frame+1)
def info(self,msg,*args,**kargs):
if self._isEnabledFor(2):
frame = kargs.get('frame',0)+1
if isinstance(msg,string_type):
msg = msg.format(*args,**kargs)
self.log(2,msg,frame)
def debug(self,msg,frame=0):
self.log(3,msg,frame+1)
def debug(self,msg,*args,**kargs):
if self._isEnabledFor(3):
frame = kargs.get('frame',0)+1
if isinstance(msg,string_type):
msg = msg.format(*args,**kargs)
self.log(3,msg,frame)
def trace(self,msg,frame=0):
self.log(4,msg,frame+1)
def trace(self,msg,*args,**kargs):
if self._isEnabledFor(4):
frame = kargs.get('frame',0)+1
if isinstance(msg,string_type):
msg = msg.format(*args,**kargs)
self.log(4,msg,frame)
def log(self,level,msg,frame=0):
if not self._isEnabledFor(level):
return
prefix = ''
if self.printTag:

View File

@ -1085,10 +1085,10 @@ class AsmElementLink(AsmBase):
version = self.childVersion(linked,mat)
if not self.version.update(version):
logger.debug('skip {}, {}, {}'.format(
objName(obj),self.version.childVersion,version))
logger.debug('skip {}, {}, {}',
objName(obj),self.version.childVersion,version)
return
logger.debug('not skip {}, {}'.format(objName(obj),version))
logger.debug('not skip {}, {}',objName(obj),version)
if not info:
info = self.getInfo(True)
@ -1477,9 +1477,9 @@ class AsmConstraint(AsmGroup):
if not assembly or \
System.isConstraintSupported(assembly,Constraint.getTypeName(obj)):
return
logger.err('Constraint type "{}" is not supported by '
'solver "{}"'.format(Constraint.getTypeName(obj),
System.getTypeName(assembly)))
logger.error('Constraint type "{}" is not supported by '
'solver "{}"',Constraint.getTypeName(obj),
System.getTypeName(assembly))
Constraint.setDisable(obj)
def onChanged(self,obj,prop):
@ -1651,7 +1651,7 @@ class AsmConstraint(AsmGroup):
count -= finished
if count:
distMap.sort()
logger.debug('distance map: {}'.format(len(distMap)))
logger.debug('distance map: {}',len(distMap))
for d in distMap:
logger.debug(d)
for d,i,j in distMap:
@ -1924,7 +1924,7 @@ class AsmConstraint(AsmGroup):
return cstr
except Exception as e:
logger.debug('failed to make constraint: {}'.format(e))
logger.debug('failed to make constraint: {}',e)
if undo:
FreeCAD.closeActiveTransaction(True)
raise
@ -2366,7 +2366,7 @@ class AsmRelationGroup(AsmBase):
checkType(relation,AsmRelation)
return relation
except Exception as e:
logger.error('invalid relation of part array: '+str(e))
logger.error('invalid relation of part array: {}',e)
def update(self,cstr,oldPart,newPart,partName):
relation = self.findRelation(oldPart)
@ -2379,7 +2379,7 @@ class AsmRelationGroup(AsmBase):
pass
relation = self.findRelation(newPart)
if not relation:
logger.warn('Cannot find relation of part {}'.format(partName))
logger.warn('Cannot find relation of part {}',partName)
elif cstr not in relation.Group:
relation.Group = {-1:cstr}
@ -2798,8 +2798,8 @@ class Assembly(AsmGroup):
cls._Timer.setSingleShot(True)
cls._Timer.timeout.connect(Assembly.onSolverTimer)
cls._TransID = FreeCAD.getActiveTransaction()
logger.debug('auto solve scheduled on change of {}.{}'.format(
objName(obj),prop),frame=1)
logger.debug('auto solve scheduled on change of {}.{}',
objName(obj),prop,frame=1)
cls._Timer.start(100)
@classmethod
@ -3093,12 +3093,12 @@ class Assembly(AsmGroup):
for o in cstrGroup.Group:
checkType(o,AsmConstraint)
if Constraint.isDisabled(o):
logger.debug('skip constraint {}'.format(cstrName(o)))
logger.debug('skip constraint {}',cstrName(o))
continue
if not System.isConstraintSupported(self.Object,
Constraint.getTypeName(o)):
logger.debug('skip unsupported constraint '
'{}'.format(cstrName(o)))
'{}',cstrName(o))
continue
ret.append(o)
self.constraints = ret
@ -3572,7 +3572,7 @@ class AsmWorkPlane(object):
if undo:
FreeCAD.setActiveTransaction('Assembly create workplane')
try:
logger.debug('make {}'.format(tp))
logger.debug('make {}',tp)
if tp == 3:
obj = None
for o in info.PartGroup.Group:

View File

@ -53,7 +53,7 @@ def _p(solver,partInfo,subname,shape,retAll=False):
h = partInfo.EntityMap.get(key,None)
system = solver.system
if h:
system.log('cache {}: {}'.format(key,h))
system.log('cache {}: {}',key,h)
return h if retAll else h.entity
v = utils.getElementPos(shape)
@ -68,14 +68,14 @@ def _p(solver,partInfo,subname,shape,retAll=False):
system.NameTag = nameTag
e = system.addPoint3d(*params)
h = PointInfo(entity=e,params=params,vector=v)
system.log('{}: add draft point {}'.format(key,h))
system.log('{}: add draft point {}',key,h)
if system.sketchPlane and not solver.isFixedElement(part,subname):
system.NameTag = nameTag + '.i'
e2 = system.addPointInPlane(e,system.sketchPlane.entity,
group=partInfo.Group)
system.log('{}: add draft point in plane {},{}'.format(
partInfo.PartName,e2,system.sketchPlane.entity))
system.log('{}: add draft point in plane {},{}',
partInfo.PartName,e2,system.sketchPlane.entity)
elif utils.isDraftCircle(part):
requireArc = subname=='Vertex2'
@ -88,7 +88,7 @@ def _p(solver,partInfo,subname,shape,retAll=False):
else:
raise RuntimeError('Invalid draft circle subname {} of '
'{}'.format(subname,partInfo.PartName))
system.log('{}: add circle point {}'.format(key,h))
system.log('{}: add circle point {}',key,h)
else:
nameTag = partInfo.PartName + '.' + key
@ -97,7 +97,7 @@ def _p(solver,partInfo,subname,shape,retAll=False):
system.NameTag = nameTag + 't'
h = system.addTransform(e,*partInfo.Params,group=partInfo.Group)
h = PointInfo(entity=h, params=partInfo.Params,vector=v)
system.log('{}: {},{}'.format(system.NameTag,h,partInfo.Group))
system.log('{}: {},{}',system.NameTag,h,partInfo.Group)
partInfo.EntityMap[key] = h
return h if retAll else h.entity
@ -109,14 +109,14 @@ def _n(solver,partInfo,subname,shape,retAll=False):
return 'an edge or face with a planar or cylindrical surface'
if utils.isDraftWire(partInfo):
logger.warn('Use draft wire {} for normal. Draft wire placement'
' is not transformable'.format(partInfo.PartName))
' is not transformable',partInfo.PartName)
return
key = subname+'.n'
h = partInfo.EntityMap.get(key,None)
system = solver.system
if h:
system.log('cache {}: {}'.format(key,h))
system.log('cache {}: {}',key,h)
else:
if utils.isDraftCircle(partInfo.Part):
_prepareDraftCircle(solver,partInfo)
@ -150,7 +150,7 @@ def _n(solver,partInfo,subname,shape,retAll=False):
p0=p0.entity, ln=ln, p1=p1, px=px, vx=vx,
pla=partInfo.Placement)
system.log('{}: {},{}'.format(system.NameTag,h,partInfo.Group))
system.log('{}: {},{}',system.NameTag,h,partInfo.Group)
partInfo.EntityMap[key] = h
return h if retAll else h.entity
@ -177,7 +177,7 @@ def _l(solver,partInfo,subname,shape,retAll=False):
h = partInfo.EntityMap.get(key,None)
system = solver.system
if h:
system.log('cache {}: {}'.format(key,h))
system.log('cache {}: {}',key,h)
else:
nameTag = partInfo.PartName + '.' + key
if utils.isDraftWire(part):
@ -202,7 +202,7 @@ def _l(solver,partInfo,subname,shape,retAll=False):
system.NameTag = nameTag
h = system.addLineSegment(tp0,tp1,group=partInfo.Group)
h = LineInfo(entity=h,p0=tp0,p1=tp1)
system.log('{}: {},{}'.format(system.NameTag,h,partInfo.Group))
system.log('{}: {},{}',system.NameTag,h,partInfo.Group)
partInfo.EntityMap[key] = h
return h if retAll else h.entity
@ -257,14 +257,14 @@ def _w(solver,partInfo,subname,shape,retAll=False):
h = partInfo.EntityMap.get(key,None)
system = solver.system
if h:
system.log('cache {}: {}'.format(key,h))
system.log('cache {}: {}',key,h)
else:
p = _p(solver,partInfo,subname,shape,True)
n = _n(solver,partInfo,subname,shape,True)
system.NameTag = partInfo.PartName + '.' + key
w = system.addWorkplane(p.entity,n.entity,group=partInfo.Group)
h = PlaneInfo(entity=w,origin=p,normal=n)
system.log('{}: {},{}'.format(system.NameTag,h,partInfo.Group))
system.log('{}: {},{}',system.NameTag,h,partInfo.Group)
return h if retAll else h.entity
def _wa(solver,partInfo,subname,shape,retAll=False):
@ -287,7 +287,7 @@ def _c(solver,partInfo,subname,shape,requireArc=False,retAll=False):
h = partInfo.EntityMap.get(key,None)
system = solver.system
if h:
system.log('cache {}: {}'.format(key,h))
system.log('cache {}: {}',key,h)
return h if retAll else h.entity
g = partInfo.Group
@ -304,8 +304,8 @@ def _c(solver,partInfo,subname,shape,requireArc=False,retAll=False):
system.NameTag = nameTag + '.i'
e2 = system.addPointInPlane(
pln.origin.entity, system.sketchPlane.entity, group=g)
system.log('{}: fix draft circle in plane {},{}'.format(
partInfo.PartName,e1,e2))
system.log('{}: fix draft circle in plane {},{}',
partInfo.PartName,e1,e2)
if part.FirstAngle == part.LastAngle:
if requireArc:
@ -319,7 +319,7 @@ def _c(solver,partInfo,subname,shape,requireArc=False,retAll=False):
e = system.addCircle(pln.origin.entity, pln.normal.entity,
system.addDistance(r), group=g)
h = CircleInfo(entity=e,radius=r,p0=p0)
system.log('{}: add draft circle {}, {}'.format(nameTag,h,g))
system.log('{}: add draft circle {}, {}',nameTag,h,g)
else:
system.NameTag = nameTag + '.c'
center = system.addPoint2d(pln.entity,solver.v0,solver.v0,group=g)
@ -336,7 +336,7 @@ def _c(solver,partInfo,subname,shape,requireArc=False,retAll=False):
system.NameTag = nameTag
e = system.addArcOfCircle(pln.entity,center,*points,group=g)
h = ArcInfo(entity=e,p1=points[1],p0=points[0],params=params)
system.log('{}: add draft arc {}, {}'.format(nameTag,h,g))
system.log('{}: add draft arc {}, {}',nameTag,h,g)
# exhaust all possible keys from a draft circle to save
# recomputation
@ -360,7 +360,7 @@ def _c(solver,partInfo,subname,shape,requireArc=False,retAll=False):
h = system.addCircle(
pln.origin.entity, pln.normal.entity, hr, group=g)
h = CircleInfo(entity=h,radius=hr,p0=None)
system.log('{}: {},{}'.format(nameTag,h,g))
system.log('{}: {},{}',nameTag,h,g)
partInfo.EntityMap[key] = h
@ -439,7 +439,7 @@ class Constraint(ProxyType):
try:
gui.AsmCmdManager.register(ConstraintCommand(cls))
except Exception:
logger.error('failed to register {}'.format(cls.getName()))
logger.error('failed to register {}',cls.getName())
raise
@classmethod
@ -459,7 +459,7 @@ class Constraint(ProxyType):
mcs.getType(str(utils.getLabel(obj))):
obj.Label = mcs.getTypeName(obj)
except Exception as e:
logger.debug('auto constraint label failed: {}'.format(e))
logger.debug('auto constraint label failed: {}',e)
@classmethod
def isDisabled(mcs,obj):
@ -504,10 +504,10 @@ class Constraint(ProxyType):
for obj in partGroup.Group:
if not hasattr(obj,'Placement'):
ret.add(obj)
logger.debug('part without Placement {}'.format(objName(obj)))
logger.debug('part without Placement {}',objName(obj))
elif isTypeOf(obj,AsmWorkPlane) and getattr(obj,'Fixed',False):
ret.add(obj)
logger.debug('fix workplane {}'.format(objName(obj)))
logger.debug('fix workplane {}',objName(obj))
found = len(ret)
for obj in cstrs:
@ -526,7 +526,7 @@ class Constraint(ProxyType):
if cstr.hasFixedPart(obj):
found = True
for info in cstr.getFixedParts(solver,obj):
logger.debug('fixed part ' + info.PartName)
logger.debug('fixed part {}',info.PartName)
ret.add(info.Part)
if not found and not firstInfo:
@ -540,20 +540,19 @@ class Constraint(ProxyType):
return ret
if utils.isDraftObject(firstInfo.Part):
Locked.lockElement(firstInfo,solver)
logger.debug('lock first draft object {}'.format(
firstInfo.PartName))
logger.debug('lock first draft object {}',firstInfo.PartName)
solver.getPartInfo(firstInfo,True,solver.group)
else:
logger.debug('lock first part {}'.format(firstInfo.PartName))
logger.debug('lock first part {}',firstInfo.PartName)
ret.add(firstInfo.Part)
if logger.isEnabledFor('debug'):
logger.debug('found fixed parts:')
for o in ret:
if isinstance(o,tuple):
logger.debug('\t{}.{}'.format(o[0].Name,o[1]))
logger.debug('\t{}.{}',o[0].Name,o[1])
else:
logger.debug('\t{}'.format(o.Name))
logger.debug('\t{}',o.Name)
return ret
@classmethod
@ -690,8 +689,8 @@ class Base(with_metaclass(Constraint, object)):
name = getattr(cls,'_cstrFuncName','add'+cls.getName())
return getattr(solver.system,name)
except AttributeError:
logger.warn('{} not supported in solver "{}"'.format(
cstrName(obj),solver.getName()))
logger.warn('{} not supported in solver "{}"',
cstrName(obj),solver.getName())
@classmethod
def getEntityDef(cls,elements,checkCount,obj=None):
@ -751,7 +750,7 @@ class Base(with_metaclass(Constraint, object)):
'or a {} element to define a projection plane'.format(
cstrName(obj), _ordinal[len(elements)]))
solver.system.log('{} entities: {}'.format(cstrName(obj),ret))
solver.system.log('{} entities: {}',cstrName(obj),ret)
return ret
@classmethod
@ -763,7 +762,7 @@ class Base(with_metaclass(Constraint, object)):
return
params = cls.getPropertyValues(obj) + cls.getEntities(obj,solver)
ret = func(*params,group=solver.group)
solver.system.log('{}: {}'.format(cstrName(obj),ret))
solver.system.log('{}: {}',cstrName(obj),ret)
return ret
@classmethod
@ -887,8 +886,7 @@ class Locked(Base):
else:
w = 0
e = system.addPointsCoincident(e1,e2,w,group=solver.group)
system.log('{}: fix point {},{},{}'.format(
info.PartName,e,e1,e2))
system.log('{}: fix point {},{},{}',info.PartName,e,e1,e2)
else:
# The second point, so we are fixing a linear edge. We can't
# add a second coincidence constraint, which will cause
@ -901,7 +899,7 @@ class Locked(Base):
system.NameTag = nameTag
# Now, constraint the second variable point to the line
e = system.addPointOnLine(e2,l,group=solver.group)
system.log('{}: fix line {},{}'.format(info.PartName,e,l))
system.log('{}: fix line {},{}',info.PartName,e,l)
ret.append(e)
@ -970,13 +968,13 @@ class BaseMulti(Base):
if cls.canMultiply(obj):
elements = obj.Proxy.getElements()
if len(elements)<=1:
logger.warn('{} not enough elements'.format(cstrName(obj)))
logger.warn('{} not enough elements',cstrName(obj))
return
firstInfo = elements[0].Proxy.getInfo(expand=True)
count = len(firstInfo)
if not count:
logger.warn('{} no first part shape'.format(cstrName(obj)))
logger.warn('{} no first part shape',cstrName(obj))
return
dragPart = solver.getDragPart()
@ -1059,20 +1057,20 @@ class BaseMulti(Base):
for e in obj.Proxy.getElements():
info = e.Proxy.getInfo()
if info.Part in parts:
logger.warn('{} skip duplicate parts {}'.format(
cstrName(obj),info.PartName))
logger.warn('{} skip duplicate parts {}',
cstrName(obj),info.PartName)
continue
parts.add(info.Part)
if solver.isFixedPart(info.Part):
if ref:
logger.warn('{} skip more than one fixed part {},{}'.format(
cstrName(obj),info.PartName,ref.PartName))
logger.warn('{} skip more than one fixed part {},{}',
cstrName(obj),info.PartName,ref.PartName)
continue
ref = info
elements.append(e)
if len(elements)<=1:
logger.warn('{} has no effective constraint'.format(cstrName(obj)))
logger.warn('{} has no effective constraint',cstrName(obj))
return
e0 = None
e = None
@ -1134,7 +1132,7 @@ class BaseCascade(BaseMulti):
ret.append(h)
if not ret:
logger.warn('{} has no effective constraint'.format(cstrName(obj)))
logger.warn('{} has no effective constraint',cstrName(obj))
return ret
@ -1266,7 +1264,7 @@ class PointOnLine(Base):
params[1] = params[1].entity
params = cls.getPropertyValues(obj) + params
ret = func(*params,group=solver.group)
solver.system.log('{}: {}'.format(cstrName(obj),ret))
solver.system.log('{}: {}',cstrName(obj),ret)
return ret
@ -1364,7 +1362,7 @@ class Symmetric(Base):
func = cls.constraintFunc(obj,solver,'addPointsVertical')
if func:
ret.append(func(e0.px, e1.px, w.entity, group=solver.group))
solver.system.log('{}: {}'.format(cstrName(obj),ret))
solver.system.log('{}: {}',cstrName(obj),ret)
return ret
@ -1564,7 +1562,7 @@ class LineLength(BaseSketch):
_,p0,p1 = cls.getEntities(obj,solver,retAll=True)[0]
params = cls.getPropertyValues(obj) + [p0,p1]
ret = func(*params,group=solver.group)
solver.system.log('{}: {}'.format(cstrName(obj),ret))
solver.system.log('{}: {}',cstrName(obj),ret)
return ret
@ -1643,7 +1641,7 @@ class MidPoint(BaseSketch):
if len(params)==2:
params.append(0)
ret = func(*params,group=solver.group)
solver.system.log('{}: {}'.format(cstrName(obj),ret))
solver.system.log('{}: {}',cstrName(obj),ret)
return ret

17
gui.py
View File

@ -120,13 +120,13 @@ class SelectionObserver:
self.resetElementVisible()
def attach(self):
logger.trace('attach selection aboserver {}'.format(self._attached))
logger.trace('attach selection aboserver {}',self._attached)
if not self._attached:
FreeCADGui.Selection.addObserver(self,False)
self._attached = True
def detach(self):
logger.trace('detach selection aboserver {}'.format(self._attached))
logger.trace('detach selection aboserver {}',self._attached)
if self._attached:
FreeCADGui.Selection.removeObserver(self)
self._attached = False
@ -165,7 +165,7 @@ class AsmCmdManager(ProxyType):
hgrp.SetBool(toolbar,show)
tb = mw.findChild(QtGui.QToolBar,toolbar)
if not tb:
logger.error('cannot find toolbar "{}"'.format(toolbar))
logger.error('cannot find toolbar "{}"',toolbar)
tb.setVisible(show)
@classmethod
@ -494,8 +494,7 @@ class AsmCmdTrace(AsmCmdCheckable):
if len(subs)==1:
cls._object = sel[0].Object
cls._subname = subs[0]
logger.info('trace {}.{}'.format(
cls._object.Name,cls._subname))
logger.info('trace {}.{}',cls._object.Name,cls._subname)
return
logger.info('trace moving element')
@ -690,8 +689,8 @@ class AsmCmdGotoLinked(AsmCmdBase):
subname = '.'.join(subname+linkSub.split('.'))
sobj = sels[0].Object.getSubObject(subname,retType=1)
if not sobj:
logger.error('Cannot find sub object {}.{}'.format(
objName(sels[0].Object),subname))
logger.error('Cannot find sub object {}.{}',
objName(sels[0].Object),subname)
return
FreeCADGui.Selection.pushSelStack()
FreeCADGui.Selection.clearSelection()
@ -738,8 +737,8 @@ class AsmCmdUp(AsmCmdBase):
j = len(children)-1
elif j>=len(children):
j = 0
logger.debug('move {}:{} -> {}:{}'.format(
i,objName(obj),j,objName(children[j])))
logger.debug('move {}:{} -> {}:{}',
i,objName(obj),j,objName(children[j]))
FreeCAD.setActiveTransaction(cls._menuText)
readonly = 'Immutable' in parent.getPropertyStatus('Group')
if readonly:

View File

@ -41,8 +41,7 @@ class AsmMovingPart(object):
if bbox.isValid():
self.bbox = bbox
else:
logger.warn('empty bounding box of part {}'.format(
info.PartName))
logger.warn('empty bounding box of part {}',info.PartName)
self.bbox = FreeCAD.BoundBox(0,0,0,5,5,5)
hasBound = False
@ -84,7 +83,7 @@ class AsmMovingPart(object):
pla = info.Placement.multiply(FreeCAD.Placement(pos,rot))
else:
pla = info.Placement.multiply(self.offset)
logger.trace('part move update {}: {}'.format(objName(info.Parent),pla))
logger.trace('part move update {}: {}',objName(info.Parent),pla)
self.draggerPlacement = pla
return pla
@ -115,15 +114,15 @@ class AsmMovingPart(object):
if info.Subname.startswith('Vertex'):
idx = utils.draftWireVertex2PointIndex(part,info.Subname)
if idx is None:
logger.error('Invalid draft wire vertex {} {}'.format(
info.Subname, info.PartName))
logger.error('Invalid draft wire vertex {} {}',
info.Subname, info.PartName)
return
change = [idx]
else:
change = utils.edge2VertexIndex(part,info.Subname,True)
if change[0] is None or change[1] is None:
logger.error('Invalid draft wire edge {} {}'.format(
info.Subname, info.PartName))
logger.error('Invalid draft wire edge {} {}',
info.Subname, info.PartName)
return
movement = self.Movement

View File

@ -92,8 +92,8 @@ class ProxyType(type):
cls = mcs.getType(mcs.getTypeName(obj))
proxy = mcs.getProxy(obj)
if type(proxy) is not cls:
logger.debug('attaching {}, {} -> {}'.format(
objName(obj),type(proxy).__name__,cls.__name__),frame=1)
logger.debug('attaching {}, {} -> {}',
objName(obj),type(proxy).__name__,cls.__name__,frame=1)
if proxy:
mcs.detach(obj)
if mcs.getTypeID(obj) != cls._id:
@ -131,8 +131,8 @@ class ProxyType(type):
def detach(mcs,obj,detachAll=False):
proxy = mcs.getProxy(obj)
if proxy:
logger.debug('detaching {}<{}>'.format(objName(obj),
proxy.__class__.__name__))
logger.debug('detaching {}<{}>',objName(obj),
proxy.__class__.__name__)
for key in proxy.getPropertyInfoList():
prop = mcs.getPropertyInfo(key)
obj.removeProperty(prop.Name)
@ -156,8 +156,8 @@ class ProxyType(type):
def attach(mcs,obj,checkType=True):
info = mcs.getInfo()
if not info.TypeNames:
logger.error('"{}" has no registered types'.format(
mcs.getMetaName()))
logger.error('"{}" has no registered types',
mcs.getMetaName())
return
if checkType:
@ -167,8 +167,8 @@ class ProxyType(type):
mcs.setDefaultTypeID(obj)
if mcs._typeEnum not in obj.PropertiesList:
logger.debug('type enum {}, {}'.format(mcs._typeEnum,
mcs._propGroup))
logger.debug('type enum {}, {}',mcs._typeEnum,
mcs._propGroup)
obj.addProperty("App::PropertyEnumeration",
mcs._typeEnum,mcs._propGroup,'',2)
mcs.setTypeName(obj,info.TypeNames)
@ -177,8 +177,8 @@ class ProxyType(type):
try:
idx = mcs.getType(obj)._idx
except KeyError:
logger.warn('{} has unknown {} type {}'.format(
objName(obj),mcs.getMetaName(),mcs.getTypeID(obj)))
logger.warn('{} has unknown {} type {}',
objName(obj),mcs.getMetaName(),mcs.getTypeID(obj))
mcs.setTypeName(obj,idx)
return mcs.setProxy(obj)
@ -226,8 +226,8 @@ class ProxyType(type):
info.TypeNameMap[cls.getName()] = cls
info.TypeNames.append(cls.getName())
cls._idx = len(info.TypeNames)-1
logger.trace('register {} "{}":{},{}'.format(
mcs.getMetaName(),cls.getName(),cls._id,cls._idx))
logger.trace('register {} "{}":{},{}',
mcs.getMetaName(),cls.getName(),cls._id,cls._idx)
@classmethod
def addPropertyInfo(mcs,info,duplicate):

View File

@ -34,8 +34,8 @@ class Solver(object):
self.system = System.getSystem(assembly)
cstrs = assembly.Proxy.getConstraints()
if not cstrs:
logger.debug('skip assembly {} with no constraint'.format(
objName(assembly)))
logger.debug('skip assembly {} with no constraint',
objName(assembly))
return
self._fixedGroup = 2
@ -69,7 +69,7 @@ class Solver(object):
self._fixedElements.add((part,None))
for cstr in cstrs:
self.system.log('preparing {}'.format(cstrName(cstr)))
self.system.log('preparing {}',cstrName(cstr))
self.system.GroupHandle += 1
ret = Constraint.prepare(cstr,self)
if ret:
@ -87,13 +87,12 @@ class Solver(object):
info = self._partMap.get(dragPart,None)
if info and info.Workplane:
# add dragging point
self.system.log('add drag point '
'{}'.format(info.Workplane[1]))
self.system.log('add drag point {}',info.Workplane[1])
# TODO: slvs addWhereDragged doesn't work as expected, need
# to investigate more
# addDragPoint(info.Workplane[1],group=self.group)
self.system.log('solving {}'.format(objName(assembly)))
self.system.log('solving {}',objName(assembly))
try:
self.system.solve(group=self.group,reportFailed=reportFailed)
except RuntimeError as e:
@ -109,13 +108,12 @@ class Solver(object):
try:
c = self.system.getConstraint(h)
except Exception as e2:
logger.error('cannot find constraint '
'{}: {}'.format(h,e2))
logger.error('cannot find constraint {}: {}',h,e2)
continue
if c.group <= self._fixedGroup or \
c.group-self._fixedGroup >= len(cstrs):
logger.error('failed constraint in unexpected group'
' {}'.format(c.group))
' {}',c.group)
continue
cstr = cstrs[c.group-self._fixedGroup]
msg += '\n{}, handle: {}'.format(cstrName(cstr),h)
@ -143,12 +141,12 @@ class Solver(object):
v = partInfo.Placement.inverse().multVec(v)
idx = utils.draftWireVertex2PointIndex(part,key[:-2])
if utils.isSamePos(points[idx],v):
self.system.log('not moving {} point {}'.format(
partInfo.PartName,idx))
self.system.log('not moving {} point {}',
partInfo.PartName,idx)
else:
changed = True
self.system.log('moving {} point{} from {}->{}'.format(
partInfo.PartName,idx,points[idx],v))
self.system.log('moving {} point{} from {}->{}',
partInfo.PartName,idx,points[idx],v)
if rollback is not None:
rollback.append((partInfo.PartName,
part,
@ -163,11 +161,11 @@ class Solver(object):
q = (params[4],params[5],params[6],params[3])
pla = FreeCAD.Placement(FreeCAD.Vector(*p),FreeCAD.Rotation(*q))
if isSamePlacement(partInfo.Placement,pla):
self.system.log('not moving {}'.format(partInfo.PartName))
self.system.log('not moving {}',partInfo.PartName)
else:
touched = True
self.system.log('moving {} {} {} {}'.format(
partInfo.PartName,partInfo.Params,params,pla))
self.system.log('moving {} {} {} {}',
partInfo.PartName,partInfo.Params,params,pla)
if rollback is not None:
rollback.append((partInfo.PartName,
part,
@ -196,12 +194,12 @@ class Solver(object):
math.degrees(p0.getAngle(p2)))
if utils.isSameValue(v0,v):
self.system.log('not change draft circle {}'.format(
partInfo.PartName))
self.system.log('not change draft circle {}',
partInfo.PartName)
else:
touched = True
self.system.log('change draft circle {} {}->{}'.format(
partInfo.PartName,v0,v))
self.system.log('change draft circle {} {}->{}',
partInfo.PartName,v0,v)
if rollback is not None:
rollback.append((partInfo.PartName, part, v0))
part.Radius = v[0]
@ -221,10 +219,9 @@ class Solver(object):
pla = partInfo0.Placement.copy()
pla.Base += pos-refPos
if isSamePlacement(info0.Placement,pla):
self.system.log('not moving {}'.format(info0.PartName))
self.system.log('not moving {}',info0.PartName)
else:
self.system.log('moving {} {}'.format(
partInfo.PartName,pla))
self.system.log('moving {} {}',partInfo.PartName,pla)
touched = True
if rollback is not None:
rollback.append((info0.PartName,
@ -307,7 +304,7 @@ class Solver(object):
CstrMap = {},
Update = [])
self.system.log('{}, {}'.format(partInfo,g))
self.system.log('{}, {}',partInfo,g)
self._partMap[info.Part] = partInfo
return partInfo
@ -332,9 +329,9 @@ def _solve(objs=None,recursive=None,reportFailed=False,
if not isTypeOf(obj,Assembly):
continue
if System.isDisabled(obj) or obj.Freeze:
logger.debug('bypass disabled assembly {}'.format(objName(obj)))
logger.debug('bypass disabled assembly {}',objName(obj))
continue
logger.debug('adding assembly {}'.format(objName(obj)))
logger.debug('adding assembly {}',objName(obj))
assemblies.append(obj)
if not assemblies:
@ -354,9 +351,9 @@ def _solve(objs=None,recursive=None,reportFailed=False,
if not isTypeOf(obj,Assembly):
continue
if System.isDisabled(obj) or obj.Freeze:
logger.debug('skip disabled assembly {}'.format(objName(obj)))
logger.debug('skip disabled assembly {}',objName(obj))
continue
logger.debug('adding assembly {}'.format(objName(obj)))
logger.debug('adding assembly {}',objName(obj))
assemblies.append(obj)
if not assemblies:
@ -375,7 +372,7 @@ def _solve(objs=None,recursive=None,reportFailed=False,
except Exception:
if rollback is not None:
for name,part,v in reversed(rollback):
logger.debug('roll back {} to {}'.format(name,v))
logger.debug('roll back {} to {}',name,v)
if isinstance(v,FreeCAD.Placement):
setPlacement(part,v)
elif utils.isDraftWire(part):

View File

@ -51,5 +51,5 @@ class _SystemSlvs(SystemExtension,slvs.System):
reason = 'unknown failure'
if reason:
raise RuntimeError(reason)
logger.info('dof remaining: {}'.format(self.Dof))
logger.info('dof remaining: {}',self.Dof)

View File

@ -306,7 +306,7 @@ class _MetaType(type):
def __init__(cls, name, bases, attrs):
super(_MetaType,cls).__init__(name,bases,attrs)
if len(cls._args):
logger.trace('registing sympy ' + cls.__name__)
logger.trace('registing sympy {}', cls.__name__)
mcs = cls.__class__
mcs._types.append(cls)
mcs._typeMap[cls.__name__[1:]] = cls
@ -689,7 +689,7 @@ class _Translate(_Vector):
elif isinstance(e,CoordSystem):
# This means src is a normal, and we don't translate normal in order
# to be compatibable with solvespace
logger.warn('{} translating normal has no effect'.format(self.Name))
logger.warn('{} translating normal has no effect',self.Name)
return e
else:
raise ValueError('unsupported transformation {} of '
@ -1183,7 +1183,7 @@ class _SystemSymPy(SystemExtension):
if not ret.success:
msg = getattr(ret,'message',None)
logger.warn('failed to solve {}: '
'{}'.format(o.Name,msg if msg else ret))
'{}',o.Name,msg if msg else ret)
else:
self.log('single solve done: '
'{}'.format(ret.x[0]))
@ -1216,7 +1216,7 @@ class _SystemSymPy(SystemExtension):
continue
except Exception as excp:
logger.warn('simple solve exception: '
'{}'.format(excp.message))
'{}',excp.message)
if not restart:
if len(active_params)!=len(params):

View File

@ -148,9 +148,9 @@ class SystemExtension(object):
msg = '{} between {} and {}'.format(cstrName(self.cstrObj),
self.firstInfo.PartName, self.secondInfo.PartName)
if warn:
logger.warn('skip redundant ' + msg, frame=1)
logger.warn('skip redundant {}', msg, frame=1)
else:
logger.debug('auto relax ' + msg, frame=1)
logger.debug('auto relax {}', msg, frame=1)
def _countConstraints(self,increment,limit,*names):
first,second = self.firstInfo,self.secondInfo

View File

@ -89,11 +89,11 @@ def getElementShape(obj,tp=None,transform=False,noElementMap=True):
needSubElement=True,retType=2,
transform=transform,noElementMap=noElementMap)
if not sobj:
logger.trace('no sub object {}'.format(obj))
logger.trace('no sub object {}',obj)
return
if sobj.isDerivedFrom('App::Line'):
if tp not in (None,Part.Shape,Part.Edge):
logger.trace('wrong type of shape {}'.format(obj))
logger.trace('wrong type of shape {}',obj)
return
size = sobj.ViewObject.Size
shape = Part.makeLine(FreeCAD.Vector(-size,0,0),
@ -102,7 +102,7 @@ def getElementShape(obj,tp=None,transform=False,noElementMap=True):
return shape
elif sobj.isDerivedFrom('App::Plane'):
if tp not in (None, Part.Shape, Part.Face):
logger.trace('wrong type of shape {}'.format(obj))
logger.trace('wrong type of shape {}',obj)
return
size = sobj.ViewObject.Size
shape = Part.makePlane(size*2,size*2,
@ -110,17 +110,17 @@ def getElementShape(obj,tp=None,transform=False,noElementMap=True):
shape.transformShape(mat,False,True)
return shape
elif shape.isNull():
logger.trace('no shape {}'.format(obj))
logger.trace('no shape {}',obj)
return
if not isinstance(shape,Part.Shape) or shape.isNull():
logger.trace('null shape {}'.format(obj))
logger.trace('null shape {}',obj)
return
if not tp or isinstance(shape,tp):
return shape
elif isinstance(shape,(Part.Vertex,Part.Edge,Part.Face)):
logger.trace('wrong shape type {}'.format(obj))
logger.trace('wrong shape type {}',obj)
return
elif tp is Part.Vertex:
if shape.countElement('Edge'):
@ -136,7 +136,7 @@ def getElementShape(obj,tp=None,transform=False,noElementMap=True):
if shape.countElement('Face')==1:
return shape.Face1
else:
logger.trace('wrong shape type {}'.format(obj))
logger.trace('wrong shape type {}',obj)
def isDraftWire(obj):
proxy = getattr(obj,'Proxy',None)