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
|
from datetime import datetime
|
||||||
import FreeCAD, FreeCADGui
|
import FreeCAD, FreeCADGui
|
||||||
|
|
||||||
|
PY3 = sys.version_info[0] == 3
|
||||||
|
if PY3:
|
||||||
|
string_type = str
|
||||||
|
else:
|
||||||
|
string_type = basestring
|
||||||
|
|
||||||
class FCADLogger:
|
class FCADLogger:
|
||||||
def __init__(self, tag, **kargs):
|
def __init__(self, tag, **kargs):
|
||||||
self.tag = tag
|
self.tag = tag
|
||||||
|
@ -28,25 +34,42 @@ class FCADLogger:
|
||||||
level = self.levels[level]
|
level = self.levels[level]
|
||||||
return self._isEnabledFor(level)
|
return self._isEnabledFor(level)
|
||||||
|
|
||||||
def error(self,msg,frame=0):
|
def error(self,msg,*args,**kargs):
|
||||||
self.log(0,msg,frame+1)
|
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):
|
def warn(self,msg,*args,**kargs):
|
||||||
self.log(1,msg,frame+1)
|
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):
|
def info(self,msg,*args,**kargs):
|
||||||
self.log(2,msg,frame+1)
|
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):
|
def debug(self,msg,*args,**kargs):
|
||||||
self.log(3,msg,frame+1)
|
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):
|
def trace(self,msg,*args,**kargs):
|
||||||
self.log(4,msg,frame+1)
|
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):
|
def log(self,level,msg,frame=0):
|
||||||
if not self._isEnabledFor(level):
|
|
||||||
return
|
|
||||||
|
|
||||||
prefix = ''
|
prefix = ''
|
||||||
|
|
||||||
if self.printTag:
|
if self.printTag:
|
||||||
|
|
30
assembly.py
30
assembly.py
|
@ -1085,10 +1085,10 @@ class AsmElementLink(AsmBase):
|
||||||
|
|
||||||
version = self.childVersion(linked,mat)
|
version = self.childVersion(linked,mat)
|
||||||
if not self.version.update(version):
|
if not self.version.update(version):
|
||||||
logger.debug('skip {}, {}, {}'.format(
|
logger.debug('skip {}, {}, {}',
|
||||||
objName(obj),self.version.childVersion,version))
|
objName(obj),self.version.childVersion,version)
|
||||||
return
|
return
|
||||||
logger.debug('not skip {}, {}'.format(objName(obj),version))
|
logger.debug('not skip {}, {}',objName(obj),version)
|
||||||
|
|
||||||
if not info:
|
if not info:
|
||||||
info = self.getInfo(True)
|
info = self.getInfo(True)
|
||||||
|
@ -1477,9 +1477,9 @@ class AsmConstraint(AsmGroup):
|
||||||
if not assembly or \
|
if not assembly or \
|
||||||
System.isConstraintSupported(assembly,Constraint.getTypeName(obj)):
|
System.isConstraintSupported(assembly,Constraint.getTypeName(obj)):
|
||||||
return
|
return
|
||||||
logger.err('Constraint type "{}" is not supported by '
|
logger.error('Constraint type "{}" is not supported by '
|
||||||
'solver "{}"'.format(Constraint.getTypeName(obj),
|
'solver "{}"',Constraint.getTypeName(obj),
|
||||||
System.getTypeName(assembly)))
|
System.getTypeName(assembly))
|
||||||
Constraint.setDisable(obj)
|
Constraint.setDisable(obj)
|
||||||
|
|
||||||
def onChanged(self,obj,prop):
|
def onChanged(self,obj,prop):
|
||||||
|
@ -1651,7 +1651,7 @@ class AsmConstraint(AsmGroup):
|
||||||
count -= finished
|
count -= finished
|
||||||
if count:
|
if count:
|
||||||
distMap.sort()
|
distMap.sort()
|
||||||
logger.debug('distance map: {}'.format(len(distMap)))
|
logger.debug('distance map: {}',len(distMap))
|
||||||
for d in distMap:
|
for d in distMap:
|
||||||
logger.debug(d)
|
logger.debug(d)
|
||||||
for d,i,j in distMap:
|
for d,i,j in distMap:
|
||||||
|
@ -1924,7 +1924,7 @@ class AsmConstraint(AsmGroup):
|
||||||
return cstr
|
return cstr
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.debug('failed to make constraint: {}'.format(e))
|
logger.debug('failed to make constraint: {}',e)
|
||||||
if undo:
|
if undo:
|
||||||
FreeCAD.closeActiveTransaction(True)
|
FreeCAD.closeActiveTransaction(True)
|
||||||
raise
|
raise
|
||||||
|
@ -2366,7 +2366,7 @@ class AsmRelationGroup(AsmBase):
|
||||||
checkType(relation,AsmRelation)
|
checkType(relation,AsmRelation)
|
||||||
return relation
|
return relation
|
||||||
except Exception as e:
|
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):
|
def update(self,cstr,oldPart,newPart,partName):
|
||||||
relation = self.findRelation(oldPart)
|
relation = self.findRelation(oldPart)
|
||||||
|
@ -2379,7 +2379,7 @@ class AsmRelationGroup(AsmBase):
|
||||||
pass
|
pass
|
||||||
relation = self.findRelation(newPart)
|
relation = self.findRelation(newPart)
|
||||||
if not relation:
|
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:
|
elif cstr not in relation.Group:
|
||||||
relation.Group = {-1:cstr}
|
relation.Group = {-1:cstr}
|
||||||
|
|
||||||
|
@ -2798,8 +2798,8 @@ class Assembly(AsmGroup):
|
||||||
cls._Timer.setSingleShot(True)
|
cls._Timer.setSingleShot(True)
|
||||||
cls._Timer.timeout.connect(Assembly.onSolverTimer)
|
cls._Timer.timeout.connect(Assembly.onSolverTimer)
|
||||||
cls._TransID = FreeCAD.getActiveTransaction()
|
cls._TransID = FreeCAD.getActiveTransaction()
|
||||||
logger.debug('auto solve scheduled on change of {}.{}'.format(
|
logger.debug('auto solve scheduled on change of {}.{}',
|
||||||
objName(obj),prop),frame=1)
|
objName(obj),prop,frame=1)
|
||||||
cls._Timer.start(100)
|
cls._Timer.start(100)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -3093,12 +3093,12 @@ class Assembly(AsmGroup):
|
||||||
for o in cstrGroup.Group:
|
for o in cstrGroup.Group:
|
||||||
checkType(o,AsmConstraint)
|
checkType(o,AsmConstraint)
|
||||||
if Constraint.isDisabled(o):
|
if Constraint.isDisabled(o):
|
||||||
logger.debug('skip constraint {}'.format(cstrName(o)))
|
logger.debug('skip constraint {}',cstrName(o))
|
||||||
continue
|
continue
|
||||||
if not System.isConstraintSupported(self.Object,
|
if not System.isConstraintSupported(self.Object,
|
||||||
Constraint.getTypeName(o)):
|
Constraint.getTypeName(o)):
|
||||||
logger.debug('skip unsupported constraint '
|
logger.debug('skip unsupported constraint '
|
||||||
'{}'.format(cstrName(o)))
|
'{}',cstrName(o))
|
||||||
continue
|
continue
|
||||||
ret.append(o)
|
ret.append(o)
|
||||||
self.constraints = ret
|
self.constraints = ret
|
||||||
|
@ -3572,7 +3572,7 @@ class AsmWorkPlane(object):
|
||||||
if undo:
|
if undo:
|
||||||
FreeCAD.setActiveTransaction('Assembly create workplane')
|
FreeCAD.setActiveTransaction('Assembly create workplane')
|
||||||
try:
|
try:
|
||||||
logger.debug('make {}'.format(tp))
|
logger.debug('make {}',tp)
|
||||||
if tp == 3:
|
if tp == 3:
|
||||||
obj = None
|
obj = None
|
||||||
for o in info.PartGroup.Group:
|
for o in info.PartGroup.Group:
|
||||||
|
|
|
@ -53,7 +53,7 @@ def _p(solver,partInfo,subname,shape,retAll=False):
|
||||||
h = partInfo.EntityMap.get(key,None)
|
h = partInfo.EntityMap.get(key,None)
|
||||||
system = solver.system
|
system = solver.system
|
||||||
if h:
|
if h:
|
||||||
system.log('cache {}: {}'.format(key,h))
|
system.log('cache {}: {}',key,h)
|
||||||
return h if retAll else h.entity
|
return h if retAll else h.entity
|
||||||
|
|
||||||
v = utils.getElementPos(shape)
|
v = utils.getElementPos(shape)
|
||||||
|
@ -68,14 +68,14 @@ def _p(solver,partInfo,subname,shape,retAll=False):
|
||||||
system.NameTag = nameTag
|
system.NameTag = nameTag
|
||||||
e = system.addPoint3d(*params)
|
e = system.addPoint3d(*params)
|
||||||
h = PointInfo(entity=e,params=params,vector=v)
|
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):
|
if system.sketchPlane and not solver.isFixedElement(part,subname):
|
||||||
system.NameTag = nameTag + '.i'
|
system.NameTag = nameTag + '.i'
|
||||||
e2 = system.addPointInPlane(e,system.sketchPlane.entity,
|
e2 = system.addPointInPlane(e,system.sketchPlane.entity,
|
||||||
group=partInfo.Group)
|
group=partInfo.Group)
|
||||||
system.log('{}: add draft point in plane {},{}'.format(
|
system.log('{}: add draft point in plane {},{}',
|
||||||
partInfo.PartName,e2,system.sketchPlane.entity))
|
partInfo.PartName,e2,system.sketchPlane.entity)
|
||||||
|
|
||||||
elif utils.isDraftCircle(part):
|
elif utils.isDraftCircle(part):
|
||||||
requireArc = subname=='Vertex2'
|
requireArc = subname=='Vertex2'
|
||||||
|
@ -88,7 +88,7 @@ def _p(solver,partInfo,subname,shape,retAll=False):
|
||||||
else:
|
else:
|
||||||
raise RuntimeError('Invalid draft circle subname {} of '
|
raise RuntimeError('Invalid draft circle subname {} of '
|
||||||
'{}'.format(subname,partInfo.PartName))
|
'{}'.format(subname,partInfo.PartName))
|
||||||
system.log('{}: add circle point {}'.format(key,h))
|
system.log('{}: add circle point {}',key,h)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
nameTag = partInfo.PartName + '.' + key
|
nameTag = partInfo.PartName + '.' + key
|
||||||
|
@ -97,7 +97,7 @@ def _p(solver,partInfo,subname,shape,retAll=False):
|
||||||
system.NameTag = nameTag + 't'
|
system.NameTag = nameTag + 't'
|
||||||
h = system.addTransform(e,*partInfo.Params,group=partInfo.Group)
|
h = system.addTransform(e,*partInfo.Params,group=partInfo.Group)
|
||||||
h = PointInfo(entity=h, params=partInfo.Params,vector=v)
|
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
|
partInfo.EntityMap[key] = h
|
||||||
return h if retAll else h.entity
|
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'
|
return 'an edge or face with a planar or cylindrical surface'
|
||||||
if utils.isDraftWire(partInfo):
|
if utils.isDraftWire(partInfo):
|
||||||
logger.warn('Use draft wire {} for normal. Draft wire placement'
|
logger.warn('Use draft wire {} for normal. Draft wire placement'
|
||||||
' is not transformable'.format(partInfo.PartName))
|
' is not transformable',partInfo.PartName)
|
||||||
return
|
return
|
||||||
|
|
||||||
key = subname+'.n'
|
key = subname+'.n'
|
||||||
h = partInfo.EntityMap.get(key,None)
|
h = partInfo.EntityMap.get(key,None)
|
||||||
system = solver.system
|
system = solver.system
|
||||||
if h:
|
if h:
|
||||||
system.log('cache {}: {}'.format(key,h))
|
system.log('cache {}: {}',key,h)
|
||||||
else:
|
else:
|
||||||
if utils.isDraftCircle(partInfo.Part):
|
if utils.isDraftCircle(partInfo.Part):
|
||||||
_prepareDraftCircle(solver,partInfo)
|
_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,
|
p0=p0.entity, ln=ln, p1=p1, px=px, vx=vx,
|
||||||
pla=partInfo.Placement)
|
pla=partInfo.Placement)
|
||||||
|
|
||||||
system.log('{}: {},{}'.format(system.NameTag,h,partInfo.Group))
|
system.log('{}: {},{}',system.NameTag,h,partInfo.Group)
|
||||||
partInfo.EntityMap[key] = h
|
partInfo.EntityMap[key] = h
|
||||||
return h if retAll else h.entity
|
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)
|
h = partInfo.EntityMap.get(key,None)
|
||||||
system = solver.system
|
system = solver.system
|
||||||
if h:
|
if h:
|
||||||
system.log('cache {}: {}'.format(key,h))
|
system.log('cache {}: {}',key,h)
|
||||||
else:
|
else:
|
||||||
nameTag = partInfo.PartName + '.' + key
|
nameTag = partInfo.PartName + '.' + key
|
||||||
if utils.isDraftWire(part):
|
if utils.isDraftWire(part):
|
||||||
|
@ -202,7 +202,7 @@ def _l(solver,partInfo,subname,shape,retAll=False):
|
||||||
system.NameTag = nameTag
|
system.NameTag = nameTag
|
||||||
h = system.addLineSegment(tp0,tp1,group=partInfo.Group)
|
h = system.addLineSegment(tp0,tp1,group=partInfo.Group)
|
||||||
h = LineInfo(entity=h,p0=tp0,p1=tp1)
|
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
|
partInfo.EntityMap[key] = h
|
||||||
|
|
||||||
return h if retAll else h.entity
|
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)
|
h = partInfo.EntityMap.get(key,None)
|
||||||
system = solver.system
|
system = solver.system
|
||||||
if h:
|
if h:
|
||||||
system.log('cache {}: {}'.format(key,h))
|
system.log('cache {}: {}',key,h)
|
||||||
else:
|
else:
|
||||||
p = _p(solver,partInfo,subname,shape,True)
|
p = _p(solver,partInfo,subname,shape,True)
|
||||||
n = _n(solver,partInfo,subname,shape,True)
|
n = _n(solver,partInfo,subname,shape,True)
|
||||||
system.NameTag = partInfo.PartName + '.' + key
|
system.NameTag = partInfo.PartName + '.' + key
|
||||||
w = system.addWorkplane(p.entity,n.entity,group=partInfo.Group)
|
w = system.addWorkplane(p.entity,n.entity,group=partInfo.Group)
|
||||||
h = PlaneInfo(entity=w,origin=p,normal=n)
|
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
|
return h if retAll else h.entity
|
||||||
|
|
||||||
def _wa(solver,partInfo,subname,shape,retAll=False):
|
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)
|
h = partInfo.EntityMap.get(key,None)
|
||||||
system = solver.system
|
system = solver.system
|
||||||
if h:
|
if h:
|
||||||
system.log('cache {}: {}'.format(key,h))
|
system.log('cache {}: {}',key,h)
|
||||||
return h if retAll else h.entity
|
return h if retAll else h.entity
|
||||||
|
|
||||||
g = partInfo.Group
|
g = partInfo.Group
|
||||||
|
@ -304,8 +304,8 @@ def _c(solver,partInfo,subname,shape,requireArc=False,retAll=False):
|
||||||
system.NameTag = nameTag + '.i'
|
system.NameTag = nameTag + '.i'
|
||||||
e2 = system.addPointInPlane(
|
e2 = system.addPointInPlane(
|
||||||
pln.origin.entity, system.sketchPlane.entity, group=g)
|
pln.origin.entity, system.sketchPlane.entity, group=g)
|
||||||
system.log('{}: fix draft circle in plane {},{}'.format(
|
system.log('{}: fix draft circle in plane {},{}',
|
||||||
partInfo.PartName,e1,e2))
|
partInfo.PartName,e1,e2)
|
||||||
|
|
||||||
if part.FirstAngle == part.LastAngle:
|
if part.FirstAngle == part.LastAngle:
|
||||||
if requireArc:
|
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,
|
e = system.addCircle(pln.origin.entity, pln.normal.entity,
|
||||||
system.addDistance(r), group=g)
|
system.addDistance(r), group=g)
|
||||||
h = CircleInfo(entity=e,radius=r,p0=p0)
|
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:
|
else:
|
||||||
system.NameTag = nameTag + '.c'
|
system.NameTag = nameTag + '.c'
|
||||||
center = system.addPoint2d(pln.entity,solver.v0,solver.v0,group=g)
|
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
|
system.NameTag = nameTag
|
||||||
e = system.addArcOfCircle(pln.entity,center,*points,group=g)
|
e = system.addArcOfCircle(pln.entity,center,*points,group=g)
|
||||||
h = ArcInfo(entity=e,p1=points[1],p0=points[0],params=params)
|
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
|
# exhaust all possible keys from a draft circle to save
|
||||||
# recomputation
|
# recomputation
|
||||||
|
@ -360,7 +360,7 @@ def _c(solver,partInfo,subname,shape,requireArc=False,retAll=False):
|
||||||
h = system.addCircle(
|
h = system.addCircle(
|
||||||
pln.origin.entity, pln.normal.entity, hr, group=g)
|
pln.origin.entity, pln.normal.entity, hr, group=g)
|
||||||
h = CircleInfo(entity=h,radius=hr,p0=None)
|
h = CircleInfo(entity=h,radius=hr,p0=None)
|
||||||
system.log('{}: {},{}'.format(nameTag,h,g))
|
system.log('{}: {},{}',nameTag,h,g)
|
||||||
|
|
||||||
partInfo.EntityMap[key] = h
|
partInfo.EntityMap[key] = h
|
||||||
|
|
||||||
|
@ -439,7 +439,7 @@ class Constraint(ProxyType):
|
||||||
try:
|
try:
|
||||||
gui.AsmCmdManager.register(ConstraintCommand(cls))
|
gui.AsmCmdManager.register(ConstraintCommand(cls))
|
||||||
except Exception:
|
except Exception:
|
||||||
logger.error('failed to register {}'.format(cls.getName()))
|
logger.error('failed to register {}',cls.getName())
|
||||||
raise
|
raise
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -459,7 +459,7 @@ class Constraint(ProxyType):
|
||||||
mcs.getType(str(utils.getLabel(obj))):
|
mcs.getType(str(utils.getLabel(obj))):
|
||||||
obj.Label = mcs.getTypeName(obj)
|
obj.Label = mcs.getTypeName(obj)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.debug('auto constraint label failed: {}'.format(e))
|
logger.debug('auto constraint label failed: {}',e)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def isDisabled(mcs,obj):
|
def isDisabled(mcs,obj):
|
||||||
|
@ -504,10 +504,10 @@ class Constraint(ProxyType):
|
||||||
for obj in partGroup.Group:
|
for obj in partGroup.Group:
|
||||||
if not hasattr(obj,'Placement'):
|
if not hasattr(obj,'Placement'):
|
||||||
ret.add(obj)
|
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):
|
elif isTypeOf(obj,AsmWorkPlane) and getattr(obj,'Fixed',False):
|
||||||
ret.add(obj)
|
ret.add(obj)
|
||||||
logger.debug('fix workplane {}'.format(objName(obj)))
|
logger.debug('fix workplane {}',objName(obj))
|
||||||
found = len(ret)
|
found = len(ret)
|
||||||
|
|
||||||
for obj in cstrs:
|
for obj in cstrs:
|
||||||
|
@ -526,7 +526,7 @@ class Constraint(ProxyType):
|
||||||
if cstr.hasFixedPart(obj):
|
if cstr.hasFixedPart(obj):
|
||||||
found = True
|
found = True
|
||||||
for info in cstr.getFixedParts(solver,obj):
|
for info in cstr.getFixedParts(solver,obj):
|
||||||
logger.debug('fixed part ' + info.PartName)
|
logger.debug('fixed part {}',info.PartName)
|
||||||
ret.add(info.Part)
|
ret.add(info.Part)
|
||||||
|
|
||||||
if not found and not firstInfo:
|
if not found and not firstInfo:
|
||||||
|
@ -540,20 +540,19 @@ class Constraint(ProxyType):
|
||||||
return ret
|
return ret
|
||||||
if utils.isDraftObject(firstInfo.Part):
|
if utils.isDraftObject(firstInfo.Part):
|
||||||
Locked.lockElement(firstInfo,solver)
|
Locked.lockElement(firstInfo,solver)
|
||||||
logger.debug('lock first draft object {}'.format(
|
logger.debug('lock first draft object {}',firstInfo.PartName)
|
||||||
firstInfo.PartName))
|
|
||||||
solver.getPartInfo(firstInfo,True,solver.group)
|
solver.getPartInfo(firstInfo,True,solver.group)
|
||||||
else:
|
else:
|
||||||
logger.debug('lock first part {}'.format(firstInfo.PartName))
|
logger.debug('lock first part {}',firstInfo.PartName)
|
||||||
ret.add(firstInfo.Part)
|
ret.add(firstInfo.Part)
|
||||||
|
|
||||||
if logger.isEnabledFor('debug'):
|
if logger.isEnabledFor('debug'):
|
||||||
logger.debug('found fixed parts:')
|
logger.debug('found fixed parts:')
|
||||||
for o in ret:
|
for o in ret:
|
||||||
if isinstance(o,tuple):
|
if isinstance(o,tuple):
|
||||||
logger.debug('\t{}.{}'.format(o[0].Name,o[1]))
|
logger.debug('\t{}.{}',o[0].Name,o[1])
|
||||||
else:
|
else:
|
||||||
logger.debug('\t{}'.format(o.Name))
|
logger.debug('\t{}',o.Name)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -690,8 +689,8 @@ class Base(with_metaclass(Constraint, object)):
|
||||||
name = getattr(cls,'_cstrFuncName','add'+cls.getName())
|
name = getattr(cls,'_cstrFuncName','add'+cls.getName())
|
||||||
return getattr(solver.system,name)
|
return getattr(solver.system,name)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
logger.warn('{} not supported in solver "{}"'.format(
|
logger.warn('{} not supported in solver "{}"',
|
||||||
cstrName(obj),solver.getName()))
|
cstrName(obj),solver.getName())
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def getEntityDef(cls,elements,checkCount,obj=None):
|
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(
|
'or a {} element to define a projection plane'.format(
|
||||||
cstrName(obj), _ordinal[len(elements)]))
|
cstrName(obj), _ordinal[len(elements)]))
|
||||||
|
|
||||||
solver.system.log('{} entities: {}'.format(cstrName(obj),ret))
|
solver.system.log('{} entities: {}',cstrName(obj),ret)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -763,7 +762,7 @@ class Base(with_metaclass(Constraint, object)):
|
||||||
return
|
return
|
||||||
params = cls.getPropertyValues(obj) + cls.getEntities(obj,solver)
|
params = cls.getPropertyValues(obj) + cls.getEntities(obj,solver)
|
||||||
ret = func(*params,group=solver.group)
|
ret = func(*params,group=solver.group)
|
||||||
solver.system.log('{}: {}'.format(cstrName(obj),ret))
|
solver.system.log('{}: {}',cstrName(obj),ret)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -887,8 +886,7 @@ class Locked(Base):
|
||||||
else:
|
else:
|
||||||
w = 0
|
w = 0
|
||||||
e = system.addPointsCoincident(e1,e2,w,group=solver.group)
|
e = system.addPointsCoincident(e1,e2,w,group=solver.group)
|
||||||
system.log('{}: fix point {},{},{}'.format(
|
system.log('{}: fix point {},{},{}',info.PartName,e,e1,e2)
|
||||||
info.PartName,e,e1,e2))
|
|
||||||
else:
|
else:
|
||||||
# The second point, so we are fixing a linear edge. We can't
|
# The second point, so we are fixing a linear edge. We can't
|
||||||
# add a second coincidence constraint, which will cause
|
# add a second coincidence constraint, which will cause
|
||||||
|
@ -901,7 +899,7 @@ class Locked(Base):
|
||||||
system.NameTag = nameTag
|
system.NameTag = nameTag
|
||||||
# Now, constraint the second variable point to the line
|
# Now, constraint the second variable point to the line
|
||||||
e = system.addPointOnLine(e2,l,group=solver.group)
|
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)
|
ret.append(e)
|
||||||
|
|
||||||
|
@ -970,13 +968,13 @@ class BaseMulti(Base):
|
||||||
if cls.canMultiply(obj):
|
if cls.canMultiply(obj):
|
||||||
elements = obj.Proxy.getElements()
|
elements = obj.Proxy.getElements()
|
||||||
if len(elements)<=1:
|
if len(elements)<=1:
|
||||||
logger.warn('{} not enough elements'.format(cstrName(obj)))
|
logger.warn('{} not enough elements',cstrName(obj))
|
||||||
return
|
return
|
||||||
|
|
||||||
firstInfo = elements[0].Proxy.getInfo(expand=True)
|
firstInfo = elements[0].Proxy.getInfo(expand=True)
|
||||||
count = len(firstInfo)
|
count = len(firstInfo)
|
||||||
if not count:
|
if not count:
|
||||||
logger.warn('{} no first part shape'.format(cstrName(obj)))
|
logger.warn('{} no first part shape',cstrName(obj))
|
||||||
return
|
return
|
||||||
|
|
||||||
dragPart = solver.getDragPart()
|
dragPart = solver.getDragPart()
|
||||||
|
@ -1059,20 +1057,20 @@ class BaseMulti(Base):
|
||||||
for e in obj.Proxy.getElements():
|
for e in obj.Proxy.getElements():
|
||||||
info = e.Proxy.getInfo()
|
info = e.Proxy.getInfo()
|
||||||
if info.Part in parts:
|
if info.Part in parts:
|
||||||
logger.warn('{} skip duplicate parts {}'.format(
|
logger.warn('{} skip duplicate parts {}',
|
||||||
cstrName(obj),info.PartName))
|
cstrName(obj),info.PartName)
|
||||||
continue
|
continue
|
||||||
parts.add(info.Part)
|
parts.add(info.Part)
|
||||||
if solver.isFixedPart(info.Part):
|
if solver.isFixedPart(info.Part):
|
||||||
if ref:
|
if ref:
|
||||||
logger.warn('{} skip more than one fixed part {},{}'.format(
|
logger.warn('{} skip more than one fixed part {},{}',
|
||||||
cstrName(obj),info.PartName,ref.PartName))
|
cstrName(obj),info.PartName,ref.PartName)
|
||||||
continue
|
continue
|
||||||
ref = info
|
ref = info
|
||||||
elements.append(e)
|
elements.append(e)
|
||||||
|
|
||||||
if len(elements)<=1:
|
if len(elements)<=1:
|
||||||
logger.warn('{} has no effective constraint'.format(cstrName(obj)))
|
logger.warn('{} has no effective constraint',cstrName(obj))
|
||||||
return
|
return
|
||||||
e0 = None
|
e0 = None
|
||||||
e = None
|
e = None
|
||||||
|
@ -1134,7 +1132,7 @@ class BaseCascade(BaseMulti):
|
||||||
ret.append(h)
|
ret.append(h)
|
||||||
|
|
||||||
if not ret:
|
if not ret:
|
||||||
logger.warn('{} has no effective constraint'.format(cstrName(obj)))
|
logger.warn('{} has no effective constraint',cstrName(obj))
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
@ -1266,7 +1264,7 @@ class PointOnLine(Base):
|
||||||
params[1] = params[1].entity
|
params[1] = params[1].entity
|
||||||
params = cls.getPropertyValues(obj) + params
|
params = cls.getPropertyValues(obj) + params
|
||||||
ret = func(*params,group=solver.group)
|
ret = func(*params,group=solver.group)
|
||||||
solver.system.log('{}: {}'.format(cstrName(obj),ret))
|
solver.system.log('{}: {}',cstrName(obj),ret)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
@ -1364,7 +1362,7 @@ class Symmetric(Base):
|
||||||
func = cls.constraintFunc(obj,solver,'addPointsVertical')
|
func = cls.constraintFunc(obj,solver,'addPointsVertical')
|
||||||
if func:
|
if func:
|
||||||
ret.append(func(e0.px, e1.px, w.entity, group=solver.group))
|
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
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
@ -1564,7 +1562,7 @@ class LineLength(BaseSketch):
|
||||||
_,p0,p1 = cls.getEntities(obj,solver,retAll=True)[0]
|
_,p0,p1 = cls.getEntities(obj,solver,retAll=True)[0]
|
||||||
params = cls.getPropertyValues(obj) + [p0,p1]
|
params = cls.getPropertyValues(obj) + [p0,p1]
|
||||||
ret = func(*params,group=solver.group)
|
ret = func(*params,group=solver.group)
|
||||||
solver.system.log('{}: {}'.format(cstrName(obj),ret))
|
solver.system.log('{}: {}',cstrName(obj),ret)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
@ -1643,7 +1641,7 @@ class MidPoint(BaseSketch):
|
||||||
if len(params)==2:
|
if len(params)==2:
|
||||||
params.append(0)
|
params.append(0)
|
||||||
ret = func(*params,group=solver.group)
|
ret = func(*params,group=solver.group)
|
||||||
solver.system.log('{}: {}'.format(cstrName(obj),ret))
|
solver.system.log('{}: {}',cstrName(obj),ret)
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
|
17
gui.py
17
gui.py
|
@ -120,13 +120,13 @@ class SelectionObserver:
|
||||||
self.resetElementVisible()
|
self.resetElementVisible()
|
||||||
|
|
||||||
def attach(self):
|
def attach(self):
|
||||||
logger.trace('attach selection aboserver {}'.format(self._attached))
|
logger.trace('attach selection aboserver {}',self._attached)
|
||||||
if not self._attached:
|
if not self._attached:
|
||||||
FreeCADGui.Selection.addObserver(self,False)
|
FreeCADGui.Selection.addObserver(self,False)
|
||||||
self._attached = True
|
self._attached = True
|
||||||
|
|
||||||
def detach(self):
|
def detach(self):
|
||||||
logger.trace('detach selection aboserver {}'.format(self._attached))
|
logger.trace('detach selection aboserver {}',self._attached)
|
||||||
if self._attached:
|
if self._attached:
|
||||||
FreeCADGui.Selection.removeObserver(self)
|
FreeCADGui.Selection.removeObserver(self)
|
||||||
self._attached = False
|
self._attached = False
|
||||||
|
@ -165,7 +165,7 @@ class AsmCmdManager(ProxyType):
|
||||||
hgrp.SetBool(toolbar,show)
|
hgrp.SetBool(toolbar,show)
|
||||||
tb = mw.findChild(QtGui.QToolBar,toolbar)
|
tb = mw.findChild(QtGui.QToolBar,toolbar)
|
||||||
if not tb:
|
if not tb:
|
||||||
logger.error('cannot find toolbar "{}"'.format(toolbar))
|
logger.error('cannot find toolbar "{}"',toolbar)
|
||||||
tb.setVisible(show)
|
tb.setVisible(show)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -494,8 +494,7 @@ class AsmCmdTrace(AsmCmdCheckable):
|
||||||
if len(subs)==1:
|
if len(subs)==1:
|
||||||
cls._object = sel[0].Object
|
cls._object = sel[0].Object
|
||||||
cls._subname = subs[0]
|
cls._subname = subs[0]
|
||||||
logger.info('trace {}.{}'.format(
|
logger.info('trace {}.{}',cls._object.Name,cls._subname)
|
||||||
cls._object.Name,cls._subname))
|
|
||||||
return
|
return
|
||||||
logger.info('trace moving element')
|
logger.info('trace moving element')
|
||||||
|
|
||||||
|
@ -690,8 +689,8 @@ class AsmCmdGotoLinked(AsmCmdBase):
|
||||||
subname = '.'.join(subname+linkSub.split('.'))
|
subname = '.'.join(subname+linkSub.split('.'))
|
||||||
sobj = sels[0].Object.getSubObject(subname,retType=1)
|
sobj = sels[0].Object.getSubObject(subname,retType=1)
|
||||||
if not sobj:
|
if not sobj:
|
||||||
logger.error('Cannot find sub object {}.{}'.format(
|
logger.error('Cannot find sub object {}.{}',
|
||||||
objName(sels[0].Object),subname))
|
objName(sels[0].Object),subname)
|
||||||
return
|
return
|
||||||
FreeCADGui.Selection.pushSelStack()
|
FreeCADGui.Selection.pushSelStack()
|
||||||
FreeCADGui.Selection.clearSelection()
|
FreeCADGui.Selection.clearSelection()
|
||||||
|
@ -738,8 +737,8 @@ class AsmCmdUp(AsmCmdBase):
|
||||||
j = len(children)-1
|
j = len(children)-1
|
||||||
elif j>=len(children):
|
elif j>=len(children):
|
||||||
j = 0
|
j = 0
|
||||||
logger.debug('move {}:{} -> {}:{}'.format(
|
logger.debug('move {}:{} -> {}:{}',
|
||||||
i,objName(obj),j,objName(children[j])))
|
i,objName(obj),j,objName(children[j]))
|
||||||
FreeCAD.setActiveTransaction(cls._menuText)
|
FreeCAD.setActiveTransaction(cls._menuText)
|
||||||
readonly = 'Immutable' in parent.getPropertyStatus('Group')
|
readonly = 'Immutable' in parent.getPropertyStatus('Group')
|
||||||
if readonly:
|
if readonly:
|
||||||
|
|
13
mover.py
13
mover.py
|
@ -41,8 +41,7 @@ class AsmMovingPart(object):
|
||||||
if bbox.isValid():
|
if bbox.isValid():
|
||||||
self.bbox = bbox
|
self.bbox = bbox
|
||||||
else:
|
else:
|
||||||
logger.warn('empty bounding box of part {}'.format(
|
logger.warn('empty bounding box of part {}',info.PartName)
|
||||||
info.PartName))
|
|
||||||
self.bbox = FreeCAD.BoundBox(0,0,0,5,5,5)
|
self.bbox = FreeCAD.BoundBox(0,0,0,5,5,5)
|
||||||
hasBound = False
|
hasBound = False
|
||||||
|
|
||||||
|
@ -84,7 +83,7 @@ class AsmMovingPart(object):
|
||||||
pla = info.Placement.multiply(FreeCAD.Placement(pos,rot))
|
pla = info.Placement.multiply(FreeCAD.Placement(pos,rot))
|
||||||
else:
|
else:
|
||||||
pla = info.Placement.multiply(self.offset)
|
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
|
self.draggerPlacement = pla
|
||||||
return pla
|
return pla
|
||||||
|
|
||||||
|
@ -115,15 +114,15 @@ class AsmMovingPart(object):
|
||||||
if info.Subname.startswith('Vertex'):
|
if info.Subname.startswith('Vertex'):
|
||||||
idx = utils.draftWireVertex2PointIndex(part,info.Subname)
|
idx = utils.draftWireVertex2PointIndex(part,info.Subname)
|
||||||
if idx is None:
|
if idx is None:
|
||||||
logger.error('Invalid draft wire vertex {} {}'.format(
|
logger.error('Invalid draft wire vertex {} {}',
|
||||||
info.Subname, info.PartName))
|
info.Subname, info.PartName)
|
||||||
return
|
return
|
||||||
change = [idx]
|
change = [idx]
|
||||||
else:
|
else:
|
||||||
change = utils.edge2VertexIndex(part,info.Subname,True)
|
change = utils.edge2VertexIndex(part,info.Subname,True)
|
||||||
if change[0] is None or change[1] is None:
|
if change[0] is None or change[1] is None:
|
||||||
logger.error('Invalid draft wire edge {} {}'.format(
|
logger.error('Invalid draft wire edge {} {}',
|
||||||
info.Subname, info.PartName))
|
info.Subname, info.PartName)
|
||||||
return
|
return
|
||||||
|
|
||||||
movement = self.Movement
|
movement = self.Movement
|
||||||
|
|
24
proxy.py
24
proxy.py
|
@ -92,8 +92,8 @@ class ProxyType(type):
|
||||||
cls = mcs.getType(mcs.getTypeName(obj))
|
cls = mcs.getType(mcs.getTypeName(obj))
|
||||||
proxy = mcs.getProxy(obj)
|
proxy = mcs.getProxy(obj)
|
||||||
if type(proxy) is not cls:
|
if type(proxy) is not cls:
|
||||||
logger.debug('attaching {}, {} -> {}'.format(
|
logger.debug('attaching {}, {} -> {}',
|
||||||
objName(obj),type(proxy).__name__,cls.__name__),frame=1)
|
objName(obj),type(proxy).__name__,cls.__name__,frame=1)
|
||||||
if proxy:
|
if proxy:
|
||||||
mcs.detach(obj)
|
mcs.detach(obj)
|
||||||
if mcs.getTypeID(obj) != cls._id:
|
if mcs.getTypeID(obj) != cls._id:
|
||||||
|
@ -131,8 +131,8 @@ class ProxyType(type):
|
||||||
def detach(mcs,obj,detachAll=False):
|
def detach(mcs,obj,detachAll=False):
|
||||||
proxy = mcs.getProxy(obj)
|
proxy = mcs.getProxy(obj)
|
||||||
if proxy:
|
if proxy:
|
||||||
logger.debug('detaching {}<{}>'.format(objName(obj),
|
logger.debug('detaching {}<{}>',objName(obj),
|
||||||
proxy.__class__.__name__))
|
proxy.__class__.__name__)
|
||||||
for key in proxy.getPropertyInfoList():
|
for key in proxy.getPropertyInfoList():
|
||||||
prop = mcs.getPropertyInfo(key)
|
prop = mcs.getPropertyInfo(key)
|
||||||
obj.removeProperty(prop.Name)
|
obj.removeProperty(prop.Name)
|
||||||
|
@ -156,8 +156,8 @@ class ProxyType(type):
|
||||||
def attach(mcs,obj,checkType=True):
|
def attach(mcs,obj,checkType=True):
|
||||||
info = mcs.getInfo()
|
info = mcs.getInfo()
|
||||||
if not info.TypeNames:
|
if not info.TypeNames:
|
||||||
logger.error('"{}" has no registered types'.format(
|
logger.error('"{}" has no registered types',
|
||||||
mcs.getMetaName()))
|
mcs.getMetaName())
|
||||||
return
|
return
|
||||||
|
|
||||||
if checkType:
|
if checkType:
|
||||||
|
@ -167,8 +167,8 @@ class ProxyType(type):
|
||||||
mcs.setDefaultTypeID(obj)
|
mcs.setDefaultTypeID(obj)
|
||||||
|
|
||||||
if mcs._typeEnum not in obj.PropertiesList:
|
if mcs._typeEnum not in obj.PropertiesList:
|
||||||
logger.debug('type enum {}, {}'.format(mcs._typeEnum,
|
logger.debug('type enum {}, {}',mcs._typeEnum,
|
||||||
mcs._propGroup))
|
mcs._propGroup)
|
||||||
obj.addProperty("App::PropertyEnumeration",
|
obj.addProperty("App::PropertyEnumeration",
|
||||||
mcs._typeEnum,mcs._propGroup,'',2)
|
mcs._typeEnum,mcs._propGroup,'',2)
|
||||||
mcs.setTypeName(obj,info.TypeNames)
|
mcs.setTypeName(obj,info.TypeNames)
|
||||||
|
@ -177,8 +177,8 @@ class ProxyType(type):
|
||||||
try:
|
try:
|
||||||
idx = mcs.getType(obj)._idx
|
idx = mcs.getType(obj)._idx
|
||||||
except KeyError:
|
except KeyError:
|
||||||
logger.warn('{} has unknown {} type {}'.format(
|
logger.warn('{} has unknown {} type {}',
|
||||||
objName(obj),mcs.getMetaName(),mcs.getTypeID(obj)))
|
objName(obj),mcs.getMetaName(),mcs.getTypeID(obj))
|
||||||
mcs.setTypeName(obj,idx)
|
mcs.setTypeName(obj,idx)
|
||||||
|
|
||||||
return mcs.setProxy(obj)
|
return mcs.setProxy(obj)
|
||||||
|
@ -226,8 +226,8 @@ class ProxyType(type):
|
||||||
info.TypeNameMap[cls.getName()] = cls
|
info.TypeNameMap[cls.getName()] = cls
|
||||||
info.TypeNames.append(cls.getName())
|
info.TypeNames.append(cls.getName())
|
||||||
cls._idx = len(info.TypeNames)-1
|
cls._idx = len(info.TypeNames)-1
|
||||||
logger.trace('register {} "{}":{},{}'.format(
|
logger.trace('register {} "{}":{},{}',
|
||||||
mcs.getMetaName(),cls.getName(),cls._id,cls._idx))
|
mcs.getMetaName(),cls.getName(),cls._id,cls._idx)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def addPropertyInfo(mcs,info,duplicate):
|
def addPropertyInfo(mcs,info,duplicate):
|
||||||
|
|
55
solver.py
55
solver.py
|
@ -34,8 +34,8 @@ class Solver(object):
|
||||||
self.system = System.getSystem(assembly)
|
self.system = System.getSystem(assembly)
|
||||||
cstrs = assembly.Proxy.getConstraints()
|
cstrs = assembly.Proxy.getConstraints()
|
||||||
if not cstrs:
|
if not cstrs:
|
||||||
logger.debug('skip assembly {} with no constraint'.format(
|
logger.debug('skip assembly {} with no constraint',
|
||||||
objName(assembly)))
|
objName(assembly))
|
||||||
return
|
return
|
||||||
|
|
||||||
self._fixedGroup = 2
|
self._fixedGroup = 2
|
||||||
|
@ -69,7 +69,7 @@ class Solver(object):
|
||||||
self._fixedElements.add((part,None))
|
self._fixedElements.add((part,None))
|
||||||
|
|
||||||
for cstr in cstrs:
|
for cstr in cstrs:
|
||||||
self.system.log('preparing {}'.format(cstrName(cstr)))
|
self.system.log('preparing {}',cstrName(cstr))
|
||||||
self.system.GroupHandle += 1
|
self.system.GroupHandle += 1
|
||||||
ret = Constraint.prepare(cstr,self)
|
ret = Constraint.prepare(cstr,self)
|
||||||
if ret:
|
if ret:
|
||||||
|
@ -87,13 +87,12 @@ class Solver(object):
|
||||||
info = self._partMap.get(dragPart,None)
|
info = self._partMap.get(dragPart,None)
|
||||||
if info and info.Workplane:
|
if info and info.Workplane:
|
||||||
# add dragging point
|
# add dragging point
|
||||||
self.system.log('add drag point '
|
self.system.log('add drag point {}',info.Workplane[1])
|
||||||
'{}'.format(info.Workplane[1]))
|
|
||||||
# TODO: slvs addWhereDragged doesn't work as expected, need
|
# TODO: slvs addWhereDragged doesn't work as expected, need
|
||||||
# to investigate more
|
# to investigate more
|
||||||
# addDragPoint(info.Workplane[1],group=self.group)
|
# addDragPoint(info.Workplane[1],group=self.group)
|
||||||
|
|
||||||
self.system.log('solving {}'.format(objName(assembly)))
|
self.system.log('solving {}',objName(assembly))
|
||||||
try:
|
try:
|
||||||
self.system.solve(group=self.group,reportFailed=reportFailed)
|
self.system.solve(group=self.group,reportFailed=reportFailed)
|
||||||
except RuntimeError as e:
|
except RuntimeError as e:
|
||||||
|
@ -109,13 +108,12 @@ class Solver(object):
|
||||||
try:
|
try:
|
||||||
c = self.system.getConstraint(h)
|
c = self.system.getConstraint(h)
|
||||||
except Exception as e2:
|
except Exception as e2:
|
||||||
logger.error('cannot find constraint '
|
logger.error('cannot find constraint {}: {}',h,e2)
|
||||||
'{}: {}'.format(h,e2))
|
|
||||||
continue
|
continue
|
||||||
if c.group <= self._fixedGroup or \
|
if c.group <= self._fixedGroup or \
|
||||||
c.group-self._fixedGroup >= len(cstrs):
|
c.group-self._fixedGroup >= len(cstrs):
|
||||||
logger.error('failed constraint in unexpected group'
|
logger.error('failed constraint in unexpected group'
|
||||||
' {}'.format(c.group))
|
' {}',c.group)
|
||||||
continue
|
continue
|
||||||
cstr = cstrs[c.group-self._fixedGroup]
|
cstr = cstrs[c.group-self._fixedGroup]
|
||||||
msg += '\n{}, handle: {}'.format(cstrName(cstr),h)
|
msg += '\n{}, handle: {}'.format(cstrName(cstr),h)
|
||||||
|
@ -143,12 +141,12 @@ class Solver(object):
|
||||||
v = partInfo.Placement.inverse().multVec(v)
|
v = partInfo.Placement.inverse().multVec(v)
|
||||||
idx = utils.draftWireVertex2PointIndex(part,key[:-2])
|
idx = utils.draftWireVertex2PointIndex(part,key[:-2])
|
||||||
if utils.isSamePos(points[idx],v):
|
if utils.isSamePos(points[idx],v):
|
||||||
self.system.log('not moving {} point {}'.format(
|
self.system.log('not moving {} point {}',
|
||||||
partInfo.PartName,idx))
|
partInfo.PartName,idx)
|
||||||
else:
|
else:
|
||||||
changed = True
|
changed = True
|
||||||
self.system.log('moving {} point{} from {}->{}'.format(
|
self.system.log('moving {} point{} from {}->{}',
|
||||||
partInfo.PartName,idx,points[idx],v))
|
partInfo.PartName,idx,points[idx],v)
|
||||||
if rollback is not None:
|
if rollback is not None:
|
||||||
rollback.append((partInfo.PartName,
|
rollback.append((partInfo.PartName,
|
||||||
part,
|
part,
|
||||||
|
@ -163,11 +161,11 @@ class Solver(object):
|
||||||
q = (params[4],params[5],params[6],params[3])
|
q = (params[4],params[5],params[6],params[3])
|
||||||
pla = FreeCAD.Placement(FreeCAD.Vector(*p),FreeCAD.Rotation(*q))
|
pla = FreeCAD.Placement(FreeCAD.Vector(*p),FreeCAD.Rotation(*q))
|
||||||
if isSamePlacement(partInfo.Placement,pla):
|
if isSamePlacement(partInfo.Placement,pla):
|
||||||
self.system.log('not moving {}'.format(partInfo.PartName))
|
self.system.log('not moving {}',partInfo.PartName)
|
||||||
else:
|
else:
|
||||||
touched = True
|
touched = True
|
||||||
self.system.log('moving {} {} {} {}'.format(
|
self.system.log('moving {} {} {} {}',
|
||||||
partInfo.PartName,partInfo.Params,params,pla))
|
partInfo.PartName,partInfo.Params,params,pla)
|
||||||
if rollback is not None:
|
if rollback is not None:
|
||||||
rollback.append((partInfo.PartName,
|
rollback.append((partInfo.PartName,
|
||||||
part,
|
part,
|
||||||
|
@ -196,12 +194,12 @@ class Solver(object):
|
||||||
math.degrees(p0.getAngle(p2)))
|
math.degrees(p0.getAngle(p2)))
|
||||||
|
|
||||||
if utils.isSameValue(v0,v):
|
if utils.isSameValue(v0,v):
|
||||||
self.system.log('not change draft circle {}'.format(
|
self.system.log('not change draft circle {}',
|
||||||
partInfo.PartName))
|
partInfo.PartName)
|
||||||
else:
|
else:
|
||||||
touched = True
|
touched = True
|
||||||
self.system.log('change draft circle {} {}->{}'.format(
|
self.system.log('change draft circle {} {}->{}',
|
||||||
partInfo.PartName,v0,v))
|
partInfo.PartName,v0,v)
|
||||||
if rollback is not None:
|
if rollback is not None:
|
||||||
rollback.append((partInfo.PartName, part, v0))
|
rollback.append((partInfo.PartName, part, v0))
|
||||||
part.Radius = v[0]
|
part.Radius = v[0]
|
||||||
|
@ -221,10 +219,9 @@ class Solver(object):
|
||||||
pla = partInfo0.Placement.copy()
|
pla = partInfo0.Placement.copy()
|
||||||
pla.Base += pos-refPos
|
pla.Base += pos-refPos
|
||||||
if isSamePlacement(info0.Placement,pla):
|
if isSamePlacement(info0.Placement,pla):
|
||||||
self.system.log('not moving {}'.format(info0.PartName))
|
self.system.log('not moving {}',info0.PartName)
|
||||||
else:
|
else:
|
||||||
self.system.log('moving {} {}'.format(
|
self.system.log('moving {} {}',partInfo.PartName,pla)
|
||||||
partInfo.PartName,pla))
|
|
||||||
touched = True
|
touched = True
|
||||||
if rollback is not None:
|
if rollback is not None:
|
||||||
rollback.append((info0.PartName,
|
rollback.append((info0.PartName,
|
||||||
|
@ -307,7 +304,7 @@ class Solver(object):
|
||||||
CstrMap = {},
|
CstrMap = {},
|
||||||
Update = [])
|
Update = [])
|
||||||
|
|
||||||
self.system.log('{}, {}'.format(partInfo,g))
|
self.system.log('{}, {}',partInfo,g)
|
||||||
|
|
||||||
self._partMap[info.Part] = partInfo
|
self._partMap[info.Part] = partInfo
|
||||||
return partInfo
|
return partInfo
|
||||||
|
@ -332,9 +329,9 @@ def _solve(objs=None,recursive=None,reportFailed=False,
|
||||||
if not isTypeOf(obj,Assembly):
|
if not isTypeOf(obj,Assembly):
|
||||||
continue
|
continue
|
||||||
if System.isDisabled(obj) or obj.Freeze:
|
if System.isDisabled(obj) or obj.Freeze:
|
||||||
logger.debug('bypass disabled assembly {}'.format(objName(obj)))
|
logger.debug('bypass disabled assembly {}',objName(obj))
|
||||||
continue
|
continue
|
||||||
logger.debug('adding assembly {}'.format(objName(obj)))
|
logger.debug('adding assembly {}',objName(obj))
|
||||||
assemblies.append(obj)
|
assemblies.append(obj)
|
||||||
|
|
||||||
if not assemblies:
|
if not assemblies:
|
||||||
|
@ -354,9 +351,9 @@ def _solve(objs=None,recursive=None,reportFailed=False,
|
||||||
if not isTypeOf(obj,Assembly):
|
if not isTypeOf(obj,Assembly):
|
||||||
continue
|
continue
|
||||||
if System.isDisabled(obj) or obj.Freeze:
|
if System.isDisabled(obj) or obj.Freeze:
|
||||||
logger.debug('skip disabled assembly {}'.format(objName(obj)))
|
logger.debug('skip disabled assembly {}',objName(obj))
|
||||||
continue
|
continue
|
||||||
logger.debug('adding assembly {}'.format(objName(obj)))
|
logger.debug('adding assembly {}',objName(obj))
|
||||||
assemblies.append(obj)
|
assemblies.append(obj)
|
||||||
|
|
||||||
if not assemblies:
|
if not assemblies:
|
||||||
|
@ -375,7 +372,7 @@ def _solve(objs=None,recursive=None,reportFailed=False,
|
||||||
except Exception:
|
except Exception:
|
||||||
if rollback is not None:
|
if rollback is not None:
|
||||||
for name,part,v in reversed(rollback):
|
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):
|
if isinstance(v,FreeCAD.Placement):
|
||||||
setPlacement(part,v)
|
setPlacement(part,v)
|
||||||
elif utils.isDraftWire(part):
|
elif utils.isDraftWire(part):
|
||||||
|
|
|
@ -51,5 +51,5 @@ class _SystemSlvs(SystemExtension,slvs.System):
|
||||||
reason = 'unknown failure'
|
reason = 'unknown failure'
|
||||||
if reason:
|
if reason:
|
||||||
raise RuntimeError(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):
|
def __init__(cls, name, bases, attrs):
|
||||||
super(_MetaType,cls).__init__(name,bases,attrs)
|
super(_MetaType,cls).__init__(name,bases,attrs)
|
||||||
if len(cls._args):
|
if len(cls._args):
|
||||||
logger.trace('registing sympy ' + cls.__name__)
|
logger.trace('registing sympy {}', cls.__name__)
|
||||||
mcs = cls.__class__
|
mcs = cls.__class__
|
||||||
mcs._types.append(cls)
|
mcs._types.append(cls)
|
||||||
mcs._typeMap[cls.__name__[1:]] = cls
|
mcs._typeMap[cls.__name__[1:]] = cls
|
||||||
|
@ -689,7 +689,7 @@ class _Translate(_Vector):
|
||||||
elif isinstance(e,CoordSystem):
|
elif isinstance(e,CoordSystem):
|
||||||
# This means src is a normal, and we don't translate normal in order
|
# This means src is a normal, and we don't translate normal in order
|
||||||
# to be compatibable with solvespace
|
# 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
|
return e
|
||||||
else:
|
else:
|
||||||
raise ValueError('unsupported transformation {} of '
|
raise ValueError('unsupported transformation {} of '
|
||||||
|
@ -1183,7 +1183,7 @@ class _SystemSymPy(SystemExtension):
|
||||||
if not ret.success:
|
if not ret.success:
|
||||||
msg = getattr(ret,'message',None)
|
msg = getattr(ret,'message',None)
|
||||||
logger.warn('failed to solve {}: '
|
logger.warn('failed to solve {}: '
|
||||||
'{}'.format(o.Name,msg if msg else ret))
|
'{}',o.Name,msg if msg else ret)
|
||||||
else:
|
else:
|
||||||
self.log('single solve done: '
|
self.log('single solve done: '
|
||||||
'{}'.format(ret.x[0]))
|
'{}'.format(ret.x[0]))
|
||||||
|
@ -1216,7 +1216,7 @@ class _SystemSymPy(SystemExtension):
|
||||||
continue
|
continue
|
||||||
except Exception as excp:
|
except Exception as excp:
|
||||||
logger.warn('simple solve exception: '
|
logger.warn('simple solve exception: '
|
||||||
'{}'.format(excp.message))
|
'{}',excp.message)
|
||||||
|
|
||||||
if not restart:
|
if not restart:
|
||||||
if len(active_params)!=len(params):
|
if len(active_params)!=len(params):
|
||||||
|
|
|
@ -148,9 +148,9 @@ class SystemExtension(object):
|
||||||
msg = '{} between {} and {}'.format(cstrName(self.cstrObj),
|
msg = '{} between {} and {}'.format(cstrName(self.cstrObj),
|
||||||
self.firstInfo.PartName, self.secondInfo.PartName)
|
self.firstInfo.PartName, self.secondInfo.PartName)
|
||||||
if warn:
|
if warn:
|
||||||
logger.warn('skip redundant ' + msg, frame=1)
|
logger.warn('skip redundant {}', msg, frame=1)
|
||||||
else:
|
else:
|
||||||
logger.debug('auto relax ' + msg, frame=1)
|
logger.debug('auto relax {}', msg, frame=1)
|
||||||
|
|
||||||
def _countConstraints(self,increment,limit,*names):
|
def _countConstraints(self,increment,limit,*names):
|
||||||
first,second = self.firstInfo,self.secondInfo
|
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,
|
needSubElement=True,retType=2,
|
||||||
transform=transform,noElementMap=noElementMap)
|
transform=transform,noElementMap=noElementMap)
|
||||||
if not sobj:
|
if not sobj:
|
||||||
logger.trace('no sub object {}'.format(obj))
|
logger.trace('no sub object {}',obj)
|
||||||
return
|
return
|
||||||
if sobj.isDerivedFrom('App::Line'):
|
if sobj.isDerivedFrom('App::Line'):
|
||||||
if tp not in (None,Part.Shape,Part.Edge):
|
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
|
return
|
||||||
size = sobj.ViewObject.Size
|
size = sobj.ViewObject.Size
|
||||||
shape = Part.makeLine(FreeCAD.Vector(-size,0,0),
|
shape = Part.makeLine(FreeCAD.Vector(-size,0,0),
|
||||||
|
@ -102,7 +102,7 @@ def getElementShape(obj,tp=None,transform=False,noElementMap=True):
|
||||||
return shape
|
return shape
|
||||||
elif sobj.isDerivedFrom('App::Plane'):
|
elif sobj.isDerivedFrom('App::Plane'):
|
||||||
if tp not in (None, Part.Shape, Part.Face):
|
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
|
return
|
||||||
size = sobj.ViewObject.Size
|
size = sobj.ViewObject.Size
|
||||||
shape = Part.makePlane(size*2,size*2,
|
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)
|
shape.transformShape(mat,False,True)
|
||||||
return shape
|
return shape
|
||||||
elif shape.isNull():
|
elif shape.isNull():
|
||||||
logger.trace('no shape {}'.format(obj))
|
logger.trace('no shape {}',obj)
|
||||||
return
|
return
|
||||||
|
|
||||||
if not isinstance(shape,Part.Shape) or shape.isNull():
|
if not isinstance(shape,Part.Shape) or shape.isNull():
|
||||||
logger.trace('null shape {}'.format(obj))
|
logger.trace('null shape {}',obj)
|
||||||
return
|
return
|
||||||
|
|
||||||
if not tp or isinstance(shape,tp):
|
if not tp or isinstance(shape,tp):
|
||||||
return shape
|
return shape
|
||||||
elif isinstance(shape,(Part.Vertex,Part.Edge,Part.Face)):
|
elif isinstance(shape,(Part.Vertex,Part.Edge,Part.Face)):
|
||||||
logger.trace('wrong shape type {}'.format(obj))
|
logger.trace('wrong shape type {}',obj)
|
||||||
return
|
return
|
||||||
elif tp is Part.Vertex:
|
elif tp is Part.Vertex:
|
||||||
if shape.countElement('Edge'):
|
if shape.countElement('Edge'):
|
||||||
|
@ -136,7 +136,7 @@ def getElementShape(obj,tp=None,transform=False,noElementMap=True):
|
||||||
if shape.countElement('Face')==1:
|
if shape.countElement('Face')==1:
|
||||||
return shape.Face1
|
return shape.Face1
|
||||||
else:
|
else:
|
||||||
logger.trace('wrong shape type {}'.format(obj))
|
logger.trace('wrong shape type {}',obj)
|
||||||
|
|
||||||
def isDraftWire(obj):
|
def isDraftWire(obj):
|
||||||
proxy = getattr(obj,'Proxy',None)
|
proxy = getattr(obj,'Proxy',None)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user