From ddc5d983a1625c38950d1732185fdec83bf93bad Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 18 Sep 2018 13:34:54 +0200 Subject: [PATCH] Fix single extrusion machines without an ExtruderStack CURA-5736 --- cura/Settings/CuraStackBuilder.py | 46 ++++++++++++++++++++++++++++++- cura/Settings/ExtruderManager.py | 11 ++++++-- cura/Settings/MachineManager.py | 3 +- 3 files changed, 56 insertions(+), 4 deletions(-) diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 12fe732e3e..802f607f20 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -136,6 +136,50 @@ class CuraStackBuilder: return new_global_stack + @classmethod + def createExtruderStackWithDefaultSetup(cls, global_stack: "GlobalStack", extruder_position: int) -> None: + from cura.CuraApplication import CuraApplication + application = CuraApplication.getInstance() + variant_manager = application.getVariantManager() + material_manager = application.getMaterialManager() + registry = application.getContainerRegistry() + + # get variant container for extruders + extruder_variant_container = application.empty_variant_container + extruder_variant_node = variant_manager.getDefaultVariantNode(global_stack.definition, VariantType.NOZZLE) + extruder_variant_name = None + if extruder_variant_node: + extruder_variant_container = extruder_variant_node.getContainer() + if not extruder_variant_container: + extruder_variant_container = application.empty_variant_container + extruder_variant_name = extruder_variant_container.getName() + + extruder_definition_dict = global_stack.getMetaDataEntry("machine_extruder_trains") + extruder_definition_id = extruder_definition_dict[str(extruder_position)] + extruder_definition = registry.findDefinitionContainers(id = extruder_definition_id)[0] + + # get material container for extruders + material_container = application.empty_material_container + material_node = material_manager.getDefaultMaterial(global_stack, extruder_position, extruder_variant_name, + extruder_definition = extruder_definition) + if material_node and material_node.getContainer(): + material_container = material_node.getContainer() + + new_extruder_id = registry.uniqueName(extruder_definition_id) + new_extruder = cls.createExtruderStack( + new_extruder_id, + extruder_definition = extruder_definition, + machine_definition_id = global_stack.definition.getId(), + position = extruder_position, + variant_container = extruder_variant_container, + material_container = material_container, + quality_container = application.empty_quality_container + ) + new_extruder.setNextStack(global_stack) + global_stack.addExtruder(new_extruder) + + registry.addContainer(new_extruder) + ## Create a new Extruder stack # # \param new_stack_id The ID of the new stack. @@ -157,7 +201,7 @@ class CuraStackBuilder: stack.setName(extruder_definition.getName()) stack.setDefinition(extruder_definition) - stack.setMetaDataEntry("position", position) + stack.setMetaDataEntry("position", str(position)) user_container = cls.createUserChangesContainer(new_stack_id + "_user", machine_definition_id, new_stack_id, is_global_stack = False) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index ed7f6dd4f8..18744cd13f 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -358,8 +358,15 @@ class ExtruderManager(QObject): # "fdmextruder". We need to check a machine here so its extruder definition is correct according to this. def _fixSingleExtrusionMachineExtruderDefinition(self, global_stack: "GlobalStack") -> None: expected_extruder_definition_0_id = global_stack.getMetaDataEntry("machine_extruder_trains")["0"] - extruder_stack_0 = global_stack.extruders["0"] - if extruder_stack_0.definition.getId() != expected_extruder_definition_0_id: + extruder_stack_0 = global_stack.extruders.get("0") + + if extruder_stack_0 is None: + Logger.log("i", "No extruder stack for global stack [%s], create one", global_stack.getId()) + # Single extrusion machine without an ExtruderStack, create it + from cura.Settings.CuraStackBuilder import CuraStackBuilder + CuraStackBuilder.createExtruderStackWithDefaultSetup(global_stack, 0) + + elif extruder_stack_0.definition.getId() != expected_extruder_definition_0_id: Logger.log("e", "Single extruder printer [{printer}] expected extruder [{expected}], but got [{got}]. I'm making it [{expected}].".format( printer = global_stack.getId(), expected = expected_extruder_definition_0_id, got = extruder_stack_0.definition.getId())) container_registry = ContainerRegistry.getInstance() diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index ed543fcee1..3f918e21ba 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -367,6 +367,7 @@ class MachineManager(QObject): return global_stack = containers[0] + ExtruderManager.getInstance()._fixSingleExtrusionMachineExtruderDefinition(global_stack) if not global_stack.isValid(): # Mark global stack as invalid ConfigurationErrorMessage.getInstance().addFaultyContainers(global_stack.getId()) @@ -375,7 +376,7 @@ class MachineManager(QObject): self._global_container_stack = global_stack self._application.setGlobalContainerStack(global_stack) ExtruderManager.getInstance()._globalContainerStackChanged() - self._initMachineState(containers[0]) + self._initMachineState(global_stack) self._onGlobalContainerChanged() self.__emitChangedSignals()