diff --git a/cura/Settings/SettingOverrideDecorator.py b/cura/Settings/SettingOverrideDecorator.py index f14977866e..27ae1d69f0 100644 --- a/cura/Settings/SettingOverrideDecorator.py +++ b/cura/Settings/SettingOverrideDecorator.py @@ -9,7 +9,6 @@ from UM.Signal import Signal, signalemitter from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Logger import Logger -from UM.Util import parseBool from UM.Application import Application @@ -40,7 +39,7 @@ class SettingOverrideDecorator(SceneNodeDecorator): user_container = InstanceContainer(container_id = self._generateUniqueName()) user_container.addMetaDataEntry("type", "user") self._stack.userChanges = user_container - self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0) + self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId() self._is_non_printing_mesh = False self._is_non_thumbnail_visible_mesh = False @@ -49,25 +48,13 @@ class SettingOverrideDecorator(SceneNodeDecorator): Application.getInstance().getContainerRegistry().addContainer(self._stack) - Application.getInstance().globalContainerStackChanged.connect(self._onNumberOfExtrudersEnabledChanged) - Application.getInstance().getMachineManager().numberExtrudersEnabledChanged.connect(self._onNumberOfExtrudersEnabledChanged) - + Application.getInstance().globalContainerStackChanged.connect(self._updateNextStack) self.activeExtruderChanged.connect(self._updateNextStack) self._updateNextStack() def _generateUniqueName(self): return "SettingOverrideInstanceContainer-%s" % uuid.uuid1() - def _onNumberOfExtrudersEnabledChanged(self, *args, **kwargs): - if not parseBool(self._extruder_stack.getMetaDataEntry("enabled", "True")): - # switch to the first extruder that's available - global_stack = Application.getInstance().getMachineManager().activeMachine - for _, extruder in sorted(list(global_stack.extruders.items())): - if parseBool(extruder.getMetaDataEntry("enabled", "True")): - self._extruder_stack = extruder - self._updateNextStack() - break - def __deepcopy__(self, memo): ## Create a fresh decorator object deep_copy = SettingOverrideDecorator() @@ -82,7 +69,7 @@ class SettingOverrideDecorator(SceneNodeDecorator): deep_copy._stack.replaceContainer(0, instance_container) # Properly set the right extruder on the copy - deep_copy.setActiveExtruder(self._extruder_stack.getId()) + deep_copy.setActiveExtruder(self._extruder_stack) # use value from the stack because there can be a delay in signal triggering and "_is_non_printing_mesh" # has not been updated yet. @@ -95,7 +82,7 @@ class SettingOverrideDecorator(SceneNodeDecorator): # # \return An extruder's container stack. def getActiveExtruder(self): - return self._extruder_stack.getId() + return self._extruder_stack ## Gets the signal that emits if the active extruder changed. # @@ -137,16 +124,20 @@ class SettingOverrideDecorator(SceneNodeDecorator): # kept up to date. def _updateNextStack(self): if self._extruder_stack: - if self._stack.getNextStack(): - old_extruder_stack_id = self._stack.getNextStack().getId() - else: - old_extruder_stack_id = "" + extruder_stack = ContainerRegistry.getInstance().findContainerStacks(id = self._extruder_stack) + if extruder_stack: + if self._stack.getNextStack(): + old_extruder_stack_id = self._stack.getNextStack().getId() + else: + old_extruder_stack_id = "" - self._stack.setNextStack(self._extruder_stack) - # Trigger slice/need slicing if the extruder changed. - if self._stack.getNextStack().getId() != old_extruder_stack_id: - Application.getInstance().getBackend().needsSlicing() - Application.getInstance().getBackend().tickle() + self._stack.setNextStack(extruder_stack[0]) + # Trigger slice/need slicing if the extruder changed. + if self._stack.getNextStack().getId() != old_extruder_stack_id: + Application.getInstance().getBackend().needsSlicing() + Application.getInstance().getBackend().tickle() + else: + Logger.log("e", "Extruder stack %s below per-object settings does not exist.", self._extruder_stack) else: self._stack.setNextStack(Application.getInstance().getGlobalContainerStack()) @@ -154,14 +145,7 @@ class SettingOverrideDecorator(SceneNodeDecorator): # # \param extruder_stack_id The new extruder stack to print with. def setActiveExtruder(self, extruder_stack_id): - if self._extruder_stack.getId() == extruder_stack_id: - return - - global_stack = Application.getInstance().getMachineManager().activeMachine - for extruder in global_stack.extruders.values(): - if extruder.getId() == extruder_stack_id: - self._extruder_stack = extruder - break + self._extruder_stack = extruder_stack_id self._updateNextStack() ExtruderManager.getInstance().resetSelectedObjectExtruders() self.activeExtruderChanged.emit()