1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- # Copyright (c) 2020 Ultimaker B.V.
- # Cura is released under the terms of the LGPLv3 or higher.
- from typing import Any, Optional
- from UM.Application import Application
- from UM.Decorators import override
- from UM.Settings.Interfaces import PropertyEvaluationContext
- from UM.Settings.SettingInstance import InstanceState
- from .CuraContainerStack import CuraContainerStack
- class PerObjectContainerStack(CuraContainerStack):
- def isDirty(self):
- # This stack should never be auto saved, so always return that there is nothing to save.
- return False
- @override(CuraContainerStack)
- def getProperty(self, key: str, property_name: str, context: Optional[PropertyEvaluationContext] = None) -> Any:
- if context is None:
- context = PropertyEvaluationContext()
- context.pushContainer(self)
- global_stack = Application.getInstance().getGlobalContainerStack()
- if not global_stack:
- return None
- # Return the user defined value if present, otherwise, evaluate the value according to the default routine.
- if self.getContainer(0).hasProperty(key, property_name):
- if self.getContainer(0).getProperty(key, "state") == InstanceState.User:
- result = super().getProperty(key, property_name, context)
- context.popContainer()
- return result
- # Handle the "limit_to_extruder" property.
- limit_to_extruder = super().getProperty(key, "limit_to_extruder", context)
- if limit_to_extruder is not None:
- limit_to_extruder = str(limit_to_extruder)
- # if this stack has the limit_to_extruder "not overridden", use the original limit_to_extruder as the current
- # limit_to_extruder, so the values retrieved will be from the perspective of the original limit_to_extruder
- # stack.
- if limit_to_extruder == "-1":
- if "original_limit_to_extruder" in context.context:
- limit_to_extruder = context.context["original_limit_to_extruder"]
- if limit_to_extruder is not None and limit_to_extruder != "-1" and int(limit_to_extruder) <= len(global_stack.extruderList):
- # set the original limit_to_extruder if this is the first stack that has a non-overridden limit_to_extruder
- if "original_limit_to_extruder" not in context.context:
- context.context["original_limit_to_extruder"] = limit_to_extruder
- if super().getProperty(key, "settable_per_extruder", context):
- result = global_stack.extruderList[int(limit_to_extruder)].getProperty(key, property_name, context)
- if result is not None:
- context.popContainer()
- return result
- result = super().getProperty(key, property_name, context)
- context.popContainer()
- return result
- @override(CuraContainerStack)
- def setNextStack(self, stack: CuraContainerStack) -> None:
- super().setNextStack(stack)
- # trigger signal to re-evaluate all default settings
- for key in self.getContainer(0).getAllKeys():
- # only evaluate default settings
- if self.getContainer(0).getProperty(key, "state") != InstanceState.Default:
- continue
- self._collectPropertyChanges(key, "value")
- self._emitCollectedPropertyChanges()
|