assembly: fix freeze toggling behavior

Related #342
This commit is contained in:
Zheng, Lei 2020-11-16 20:50:40 +08:00
parent 6bb16b5550
commit 6fbded4460

View File

@ -285,7 +285,7 @@ class AsmGroup(AsmBase):
class ViewProviderAsmGroup(ViewProviderAsmBase): class ViewProviderAsmGroup(ViewProviderAsmBase):
def claimChildren(self): def claimChildren(self):
return self.ViewObject.Object.Group return getattr(self.ViewObject.Object, 'Group', [])
def doubleClicked(self, _vobj): def doubleClicked(self, _vobj):
return False return False
@ -319,6 +319,10 @@ class AsmPartGroup(AsmGroup):
super(AsmPartGroup,self).linkSetup(obj) super(AsmPartGroup,self).linkSetup(obj)
if not hasProperty(obj,'DerivedFrom'): if not hasProperty(obj,'DerivedFrom'):
obj.addProperty('App::PropertyLink','DerivedFrom','Base','') obj.addProperty('App::PropertyLink','DerivedFrom','Base','')
try:
obj.setPropertyStatus('Shape','-Output')
except Exception:
pass
self.derivedParts = None self.derivedParts = None
def checkDerivedParts(self): def checkDerivedParts(self):
@ -376,7 +380,6 @@ class AsmPartGroup(AsmGroup):
obj = parent.Document.addObject("Part::FeaturePython",name, obj = parent.Document.addObject("Part::FeaturePython",name,
AsmPartGroup(parent),None,True) AsmPartGroup(parent),None,True)
obj.setPropertyStatus('Placement',('Output','Hidden')) obj.setPropertyStatus('Placement',('Output','Hidden'))
obj.setPropertyStatus('Shape','Output')
ViewProviderAsmPartGroup(obj.ViewObject) ViewProviderAsmPartGroup(obj.ViewObject)
obj.purgeTouched() obj.purgeTouched()
return obj return obj
@ -682,6 +685,10 @@ class AsmElement(AsmBase):
self.version.value += 1 self.version.value += 1
return False return False
if self.getAssembly().Object.Freeze:
logger.warn('Skip recomputing frozen element {}', objName(obj))
return True
if obj.Detach: if obj.Detach:
self.updatePlacement() self.updatePlacement()
return True return True
@ -811,7 +818,10 @@ class AsmElement(AsmBase):
raise RuntimeError('Broken element link') raise RuntimeError('Broken element link')
obj = link[0].getSubObject(link[1],1) obj = link[0].getSubObject(link[1],1)
if not obj: if not obj:
raise RuntimeError('Broken element link') if self.getAssembly().Object.Freeze:
raise RuntimeError('Unable to resolve element on frozen assembly %s'\
% objName(self.getAssembly().Object))
raise RuntimeError('Broken element link %s.%s'%(objName(link[0]), link[1]))
if not isTypeOf(obj,AsmElement): if not isTypeOf(obj,AsmElement):
# If not pointing to another element, then assume we are directly # If not pointing to another element, then assume we are directly
# pointing to the geometry element, just return as it is, which is a # pointing to the geometry element, just return as it is, which is a
@ -1381,7 +1391,10 @@ class ViewProviderAsmElement(ViewProviderAsmOnTop):
def getLinkedViewProvider(self, recursive): def getLinkedViewProvider(self, recursive):
obj = self.ViewObject.Object obj = self.ViewObject.Object
sub = obj.Proxy.getElementSubname(recursive) try:
sub = obj.Proxy.getElementSubname(recursive)
except Exception:
return
linked = obj.Proxy.getAssembly().getPartGroup().getSubObject(sub, retType=1) linked = obj.Proxy.getAssembly().getPartGroup().getSubObject(sub, retType=1)
if not linked: if not linked:
return return
@ -2113,7 +2126,10 @@ class ViewProviderAsmElementLink(ViewProviderAsmOnTop):
obj = self.ViewObject.Object obj = self.ViewObject.Object
if not recursive: if not recursive:
return obj.LinkedObject.ViewObject return obj.LinkedObject.ViewObject
sub = obj.Proxy.getElementSubname(True) try:
sub = obj.Proxy.getElementSubname(True)
except Exception:
return
linked = obj.Proxy.getAssembly().getPartGroup().getSubObject(sub, retType=1) linked = obj.Proxy.getAssembly().getPartGroup().getSubObject(sub, retType=1)
if not linked: if not linked:
return return
@ -4259,6 +4275,7 @@ class ViewProviderAssembly(ViewProviderAsmGroup):
'Unfreeze assembly' if obj.Freeze else 'Freeze assembly') 'Unfreeze assembly' if obj.Freeze else 'Freeze assembly')
try: try:
obj.Freeze = not obj.Freeze obj.Freeze = not obj.Freeze
obj.recompute(True)
FreeCAD.closeActiveTransaction() FreeCAD.closeActiveTransaction()
except Exception: except Exception:
FreeCAD.closeActiveTransaction(True) FreeCAD.closeActiveTransaction(True)