Fix solver fixed part finding

This commit is contained in:
Zheng, Lei 2018-08-02 17:45:23 +08:00
parent f84f5b47d2
commit 81df569c4d
3 changed files with 26 additions and 13 deletions

View File

@ -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

View File

@ -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)
else:
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'.format(cstrName(obj)))
return return

View File

@ -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):