FCADLogger: add support for lazy string evaluation
This commit is contained in:
parent
d9bef09d1c
commit
2b206d3b0e
|
@ -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:
|
||||
|
|
30
assembly.py
30
assembly.py
|
@ -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:
|
||||
|
|
|
@ -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
17
gui.py
|
@ -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:
|
||||
|
|
13
mover.py
13
mover.py
|
@ -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
|
||||
|
|
24
proxy.py
24
proxy.py
|
@ -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):
|
||||
|
|
55
solver.py
55
solver.py
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
||||
|
|
14
utils.py
14
utils.py
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue
Block a user