Просмотр исходного кода

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.
Lipu Fei 7 лет назад
Родитель
Сommit
f26872ec1f
2 измененных файлов с 23 добавлено и 3 удалено
  1. 20 2
      cura/Settings/CuraContainerRegistry.py
  2. 3 1
      cura/Settings/MachineManager.py

+ 20 - 2
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):

+ 3 - 1
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])