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):
|
||||
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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue
Block a user