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):
def __init__(self,parent):
self.parent = getProxy(parent,Assembly)
self.derivedParts = set()
self.derivedParts = None
super(AsmPartGroup,self).__init__()
def linkSetup(self,obj):
super(AsmPartGroup,self).linkSetup(obj)
if not hasattr(obj,'DerivedFrom'):
obj.addProperty('App::PropertyLink','DerivedFrom','Base','')
self.derivedParts = set()
self.derivedParts = None
def checkDerivedParts(self):
if self.getAssembly().Object.Freeze:
@ -194,17 +194,16 @@ class AsmPartGroup(AsmGroup):
obj = self.Object
if not isTypeOf(obj.DerivedFrom,Assembly,True):
self.derivedParts = set()
self.derivedParts = None
return
parts = set(obj.Group)
derived = obj.DerivedFrom.getLinkedObject(True).Proxy.getPartGroup()
derivedParts = derived.Group
self.derivedParts = set(derivedParts)
self.derivedParts = derived.Group
newParts = obj.Group
vis = list(obj.VisibilityList)
touched = False
for o in derivedParts:
for o in self.derivedParts:
if o in parts:
continue
touched = True

View File

@ -486,14 +486,18 @@ class Constraint(ProxyType):
@classmethod
def getFixedParts(mcs,solver,cstrs,partGroup):
firstInfo = None
ret = partGroup.Proxy.derivedParts
if partGroup.Proxy.derivedParts:
ret = set(partGroup.Proxy.derivedParts)
else:
ret = set()
from .assembly import isTypeOf, AsmWorkPlane
for obj in partGroup.Group:
if not hasattr(obj,'Placement'):
ret.add(obj)
logger.debug('part without Placement {}'.format(objName(obj)))
elif isTypeOf(obj,AsmWorkPlane) and getattr(obj,'Fixed',False):
ret.add(obj)
logger.debug('fix workplane {}'.format(objName(obj)))
found = len(ret)
for obj in cstrs:
@ -511,6 +515,7 @@ class Constraint(ProxyType):
if not found:
if not firstInfo or not solver:
logger.warn('no fixed part')
return ret
if utils.isDraftObject(firstInfo.Part):
Locked.lockElement(firstInfo,solver)
@ -520,6 +525,14 @@ class Constraint(ProxyType):
else:
logger.debug('lock first part {}'.format(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]))
else:
logger.debug('\t{}'.format(o.Name))
return ret
@classmethod
@ -951,13 +964,12 @@ class BaseMulti(Base):
parts.add(info.Part)
if solver.isFixedPart(info.Part):
if ref:
logger.warn('{} skip more than one fixed part {}'.format(
cstrName(obj),info.PartName))
logger.warn('{} skip more than one fixed part {},{}'.format(
cstrName(obj),info.PartName,ref.PartName))
continue
ref = info
elements.insert(0,e)
else:
elements.append(e)
elements.append(e)
if len(elements)<=1:
logger.warn('{} has no effective constraint'.format(cstrName(obj)))
return

View File

@ -197,6 +197,8 @@ class Solver(object):
assembly.recompute(True)
def isFixedPart(self,part):
if isinstance(part,tuple) and part[0] in self._fixedParts:
return True
return part in self._fixedParts
def isFixedElement(self,part,subname):