diff --git a/assembly.py b/assembly.py index ce7956e..5e0da13 100644 --- a/assembly.py +++ b/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 diff --git a/constraint.py b/constraint.py index f594186..f576497 100644 --- a/constraint.py +++ b/constraint.py @@ -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 diff --git a/solver.py b/solver.py index 24c4ada..485f2f9 100644 --- a/solver.py +++ b/solver.py @@ -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):