From f26872ec1f6b1a4a6fa0f71e307a96e3b956845c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 15 Dec 2017 14:45:06 +0100 Subject: [PATCH 1/2] Apply fix for single extrusion machines when a new global stack is added CURA-4713 Now the machines are not all loaded in the beginning, so the old way of adding extruder stacks for old single-extrusion machines don't work. With this fix, it now happens whenever a global stack is added to the registry. --- cura/Settings/CuraContainerRegistry.py | 22 ++++++++++++++++++++-- cura/Settings/MachineManager.py | 4 +++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 07eb357f39..dc1cc726c4 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -36,6 +36,11 @@ class CuraContainerRegistry(ContainerRegistry): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) + # We don't have all the machines loaded in the beginning, so in order to add the missing extruder stack + # for single extrusion machines, we subscribe to the containerAdded signal, and whenever a global stack + # is added, we check to see if an extruder stack needs to be added. + self.containerAdded.connect(self._onContainerAdded) + ## Overridden from ContainerRegistry # # Adds a container to the registry. @@ -410,6 +415,17 @@ class CuraContainerRegistry(ContainerRegistry): if not extruder_stacks: self.addExtruderStackForSingleExtrusionMachine(machine, "fdmextruder") + def _onContainerAdded(self, container): + # We don't have all the machines loaded in the beginning, so in order to add the missing extruder stack + # for single extrusion machines, we subscribe to the containerAdded signal, and whenever a global stack + # is added, we check to see if an extruder stack needs to be added. + if not isinstance(container, ContainerStack) or container.getMetaDataEntry("type") != "machine": + return + + extruder_stacks = self.findContainerStacks(type = "extruder_train", machine = container.getId()) + if not extruder_stacks: + self.addExtruderStackForSingleExtrusionMachine(container, "fdmextruder") + def addExtruderStackForSingleExtrusionMachine(self, machine, extruder_id): new_extruder_id = extruder_id @@ -425,7 +441,6 @@ class CuraContainerRegistry(ContainerRegistry): extruder_stack.setName(extruder_definition.getName()) extruder_stack.setDefinition(extruder_definition) extruder_stack.addMetaDataEntry("position", extruder_definition.getMetaDataEntry("position")) - extruder_stack.setNextStack(machine) # create empty user changes container otherwise user_container = InstanceContainer(extruder_stack.id + "_user") @@ -444,8 +459,8 @@ class CuraContainerRegistry(ContainerRegistry): user_container.addInstance(machine.userChanges.getInstance(user_setting_key)) machine.userChanges.removeInstance(user_setting_key, postpone_emit = True) - extruder_stack.setUserChanges(user_container) self.addContainer(user_container) + extruder_stack.setUserChanges(user_container) variant_id = "default" if machine.variant.getId() not in ("empty", "empty_variant"): @@ -491,6 +506,9 @@ class CuraContainerRegistry(ContainerRegistry): self.addContainer(extruder_stack) + # Set next stack at the end + extruder_stack.setNextStack(machine) + return extruder_stack def _findQualityChangesContainerInCuraFolder(self, name): diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 7c0adb5043..05aed1f5e2 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -369,7 +369,9 @@ class MachineManager(QObject): self.blurSettings.emit() # Ensure no-one has focus. self._cancelDelayedActiveContainerStackChanges() - containers = ContainerRegistry.getInstance().findContainerStacks(id = stack_id) + container_registry = ContainerRegistry.getInstance() + + containers = container_registry.findContainerStacks(id = stack_id) if containers: Application.getInstance().setGlobalContainerStack(containers[0]) From 248fe37ed92450f374c230c1bc8e78dcaa7293f7 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Fri, 15 Dec 2017 14:54:23 +0100 Subject: [PATCH 2/2] setDefinition() takes the ID instead of the container CURA-4713 --- cura/Settings/CuraContainerRegistry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index dc1cc726c4..43e2e072b0 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -448,7 +448,7 @@ class CuraContainerRegistry(ContainerRegistry): user_container.addMetaDataEntry("machine", extruder_stack.getId()) from cura.CuraApplication import CuraApplication user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) - user_container.setDefinition(machine.definition) + user_container.setDefinition(machine.definition.getId()) if machine.userChanges: # for the newly created extruder stack, we need to move all "per-extruder" settings to the user changes