Fix solver fixed part finding
This commit is contained in:
parent
f84f5b47d2
commit
81df569c4d
11
assembly.py
11
assembly.py
|
@ -179,14 +179,14 @@ class ViewProviderAsmGroupOnTop(ViewProviderAsmGroup):
|
||||||
class AsmPartGroup(AsmGroup):
|
class AsmPartGroup(AsmGroup):
|
||||||
def __init__(self,parent):
|
def __init__(self,parent):
|
||||||
self.parent = getProxy(parent,Assembly)
|
self.parent = getProxy(parent,Assembly)
|
||||||
self.derivedParts = set()
|
self.derivedParts = None
|
||||||
super(AsmPartGroup,self).__init__()
|
super(AsmPartGroup,self).__init__()
|
||||||
|
|
||||||
def linkSetup(self,obj):
|
def linkSetup(self,obj):
|
||||||
super(AsmPartGroup,self).linkSetup(obj)
|
super(AsmPartGroup,self).linkSetup(obj)
|
||||||
if not hasattr(obj,'DerivedFrom'):
|
if not hasattr(obj,'DerivedFrom'):
|
||||||
obj.addProperty('App::PropertyLink','DerivedFrom','Base','')
|
obj.addProperty('App::PropertyLink','DerivedFrom','Base','')
|
||||||
self.derivedParts = set()
|
self.derivedParts = None
|
||||||
|
|
||||||
def checkDerivedParts(self):
|
def checkDerivedParts(self):
|
||||||
if self.getAssembly().Object.Freeze:
|
if self.getAssembly().Object.Freeze:
|
||||||
|
@ -194,17 +194,16 @@ class AsmPartGroup(AsmGroup):
|
||||||
|
|
||||||
obj = self.Object
|
obj = self.Object
|
||||||
if not isTypeOf(obj.DerivedFrom,Assembly,True):
|
if not isTypeOf(obj.DerivedFrom,Assembly,True):
|
||||||
self.derivedParts = set()
|
self.derivedParts = None
|
||||||
return
|
return
|
||||||
|
|
||||||
parts = set(obj.Group)
|
parts = set(obj.Group)
|
||||||
derived = obj.DerivedFrom.getLinkedObject(True).Proxy.getPartGroup()
|
derived = obj.DerivedFrom.getLinkedObject(True).Proxy.getPartGroup()
|
||||||
derivedParts = derived.Group
|
self.derivedParts = derived.Group
|
||||||
self.derivedParts = set(derivedParts)
|
|
||||||
newParts = obj.Group
|
newParts = obj.Group
|
||||||
vis = list(obj.VisibilityList)
|
vis = list(obj.VisibilityList)
|
||||||
touched = False
|
touched = False
|
||||||
for o in derivedParts:
|
for o in self.derivedParts:
|
||||||
if o in parts:
|
if o in parts:
|
||||||
continue
|
continue
|
||||||
touched = True
|
touched = True
|
||||||
|
|
|
@ -486,14 +486,18 @@ class Constraint(ProxyType):
|
||||||
@classmethod
|
@classmethod
|
||||||
def getFixedParts(mcs,solver,cstrs,partGroup):
|
def getFixedParts(mcs,solver,cstrs,partGroup):
|
||||||
firstInfo = None
|
firstInfo = None
|
||||||
ret = partGroup.Proxy.derivedParts
|
if partGroup.Proxy.derivedParts:
|
||||||
|
ret = set(partGroup.Proxy.derivedParts)
|
||||||
|
else:
|
||||||
|
ret = set()
|
||||||
from .assembly import isTypeOf, AsmWorkPlane
|
from .assembly import isTypeOf, AsmWorkPlane
|
||||||
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)))
|
||||||
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)))
|
||||||
found = len(ret)
|
found = len(ret)
|
||||||
|
|
||||||
for obj in cstrs:
|
for obj in cstrs:
|
||||||
|
@ -511,6 +515,7 @@ class Constraint(ProxyType):
|
||||||
|
|
||||||
if not found:
|
if not found:
|
||||||
if not firstInfo or not solver:
|
if not firstInfo or not solver:
|
||||||
|
logger.warn('no fixed part')
|
||||||
return ret
|
return ret
|
||||||
if utils.isDraftObject(firstInfo.Part):
|
if utils.isDraftObject(firstInfo.Part):
|
||||||
Locked.lockElement(firstInfo,solver)
|
Locked.lockElement(firstInfo,solver)
|
||||||
|
@ -520,6 +525,14 @@ class Constraint(ProxyType):
|
||||||
else:
|
else:
|
||||||
logger.debug('lock first part {}'.format(firstInfo.PartName))
|
logger.debug('lock first part {}'.format(firstInfo.PartName))
|
||||||
ret.add(firstInfo.Part)
|
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]))
|
||||||
|
else:
|
||||||
|
logger.debug('\t{}'.format(o.Name))
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -951,13 +964,12 @@ class BaseMulti(Base):
|
||||||
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 {},{}'.format(
|
||||||
cstrName(obj),info.PartName))
|
cstrName(obj),info.PartName,ref.PartName))
|
||||||
continue
|
continue
|
||||||
ref = info
|
ref = info
|
||||||
elements.insert(0,e)
|
elements.append(e)
|
||||||
else:
|
|
||||||
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'.format(cstrName(obj)))
|
||||||
return
|
return
|
||||||
|
|
|
@ -197,6 +197,8 @@ class Solver(object):
|
||||||
assembly.recompute(True)
|
assembly.recompute(True)
|
||||||
|
|
||||||
def isFixedPart(self,part):
|
def isFixedPart(self,part):
|
||||||
|
if isinstance(part,tuple) and part[0] in self._fixedParts:
|
||||||
|
return True
|
||||||
return part in self._fixedParts
|
return part in self._fixedParts
|
||||||
|
|
||||||
def isFixedElement(self,part,subname):
|
def isFixedElement(self,part,subname):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user