diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index c396a4a2be..0348d6855f 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -1,16 +1,17 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from UM.Logger import Logger +from typing import Optional +from UM.Logger import Logger from UM.Settings.Interfaces import DefinitionContainerInterface from UM.Settings.InstanceContainer import InstanceContainer from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Util import parseBool +from cura.Machines.VariantManager import VariantType from .GlobalStack import GlobalStack from .ExtruderStack import ExtruderStack -from typing import Optional ## Contains helper functions to create new machines. @@ -37,18 +38,32 @@ class CuraStackBuilder: machine_definition = definitions[0] + # get variant container for the global stack + global_variant_container = application.empty_variant_container + if parseBool(machine_definition.getMetaDataEntry("has_variant_buildplates", False)): + global_variant_name = machine_definition.getMetaDataEntry("preferred_variant_buildplate_name") + if global_variant_name: + variant_node = variant_manager.getVariantNode(definition_id, global_variant_name, + variant_type = VariantType.BUILD_PLATE) + if variant_node is None: + raise RuntimeError("Cannot find buildplate variant with definition [%s] and variant name [%s]" % + (definition_id, global_variant_name)) + global_variant_container = variant_node.getContainer() + + # get variant container for extruders - variant_container = application.empty_variant_container + extruder_variant_container = application.empty_variant_container # Only look for the preferred variant if this machine has variants - variant_name = None + extruder_variant_name = None if parseBool(machine_definition.getMetaDataEntry("has_variants", False)): - variant_name = machine_definition.getMetaDataEntry("preferred_variant_name") - if variant_name: - variant_node = variant_manager.getVariantNode(definition_id, variant_name) + extruder_variant_name = machine_definition.getMetaDataEntry("preferred_variant_name") + if extruder_variant_name: + variant_node = variant_manager.getVariantNode(definition_id, extruder_variant_name) # Sanity check. If you see this error, the related definition files should be fixed. if variant_node is None: - raise RuntimeError("Cannot find variant with definition [%s] and variant name [%s]" % (definition_id, variant_name)) - variant_container = variant_node.getContainer() + raise RuntimeError("Cannot find extruder variant with definition [%s] and variant name [%s]" % + (definition_id, extruder_variant_name)) + extruder_variant_container = variant_node.getContainer() # get material container for extruders material_container = application.empty_material_container @@ -58,11 +73,11 @@ class CuraStackBuilder: approximate_material_diameter = str(round(material_diameter)) root_material_id = machine_definition.getMetaDataEntry("preferred_material") root_material_id = material_manager.getRootMaterialIDForDiameter(root_material_id, approximate_material_diameter) - material_node = material_manager.getMaterialNode(definition_id, variant_name, material_diameter, root_material_id) + material_node = material_manager.getMaterialNode(definition_id, extruder_variant_name, material_diameter, root_material_id) # Sanity check. If you see this error, the related definition files should be fixed. if not material_node: - raise RuntimeError("Cannot find material with definition [%s], variant_name [%s], and root_material_id [%s]" % - (definition_id, variant_name, root_material_id)) + raise RuntimeError("Cannot find material with definition [%s], extruder_variant_name [%s], and root_material_id [%s]" % + (definition_id, extruder_variant_name, root_material_id)) material_container = material_node.getContainer() generated_name = registry.createUniqueName("machine", "", name, machine_definition.getName()) @@ -75,7 +90,7 @@ class CuraStackBuilder: new_global_stack = cls.createGlobalStack( new_stack_id = generated_name, definition = machine_definition, - variant_container = application.empty_variant_container, # TODO: fix for build plate + variant_container = global_variant_container, material_container = application.empty_material_container, quality_container = application.empty_quality_container, ) @@ -99,9 +114,10 @@ class CuraStackBuilder: extruder_definition = extruder_definition, machine_definition_id = definition_id, position = position, - variant_container = variant_container, + variant_container = extruder_variant_container, material_container = material_container, quality_container = application.empty_quality_container, + global_stack = new_global_stack, ) new_extruder.setNextStack(new_global_stack) new_global_stack.addExtruder(new_extruder) @@ -133,11 +149,11 @@ class CuraStackBuilder: @classmethod def createExtruderStack(cls, new_stack_id: str, extruder_definition: DefinitionContainerInterface, machine_definition_id: str, position: int, - variant_container, material_container, quality_container) -> ExtruderStack: + variant_container, material_container, quality_container, global_stack) -> ExtruderStack: from cura.CuraApplication import CuraApplication application = CuraApplication.getInstance() - stack = ExtruderStack(new_stack_id) + stack = ExtruderStack(new_stack_id, parent = global_stack) stack.setName(extruder_definition.getName()) stack.setDefinition(extruder_definition) diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py index 35b5b1320b..56834ca32a 100755 --- a/cura/Settings/ExtruderManager.py +++ b/cura/Settings/ExtruderManager.py @@ -36,22 +36,15 @@ class ExtruderManager(QObject): self._global_container_stack_definition_id = None self._addCurrentMachineExtruders() - Application.getInstance().globalContainerStackChanged.connect(self.__globalContainerStackChanged) + #Application.getInstance().globalContainerStackChanged.connect(self._globalContainerStackChanged) Selection.selectionChanged.connect(self.resetSelectedObjectExtruders) ## Signal to notify other components when the list of extruders for a machine definition changes. extrudersChanged = pyqtSignal(QVariant) - ## Signal to notify other components when the global container stack is switched to a definition - # that has different extruders than the previous global container stack - globalContainerStackDefinitionChanged = pyqtSignal() - ## Notify when the user switches the currently active extruder. activeExtruderChanged = pyqtSignal() - ## The signal notifies subscribers if extruders are added - extrudersAdded = pyqtSignal() - ## Gets the unique identifier of the currently active extruder stack. # # The currently active extruder stack is the stack that is currently being @@ -371,11 +364,10 @@ class ExtruderManager(QObject): return result[:machine_extruder_count] - def __globalContainerStackChanged(self) -> None: + def _globalContainerStackChanged(self) -> None: global_container_stack = Application.getInstance().getGlobalContainerStack() if global_container_stack and global_container_stack.getBottom() and global_container_stack.getBottom().getId() != self._global_container_stack_definition_id: self._global_container_stack_definition_id = global_container_stack.getBottom().getId() - self.globalContainerStackDefinitionChanged.emit() # If the global container changed, the machine changed and might have extruders that were not registered yet self._addCurrentMachineExtruders() @@ -415,7 +407,6 @@ class ExtruderManager(QObject): if extruders_changed: self.extrudersChanged.emit(global_stack_id) - self.extrudersAdded.emit() self.setActiveExtruderIndex(0) ## Get all extruder values for a certain setting. diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index a2ff092143..5a3ac85d75 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -3,7 +3,6 @@ from typing import Any, TYPE_CHECKING, Optional -from UM.Application import Application from UM.Decorators import override from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase from UM.Settings.ContainerStack import ContainerStack @@ -34,7 +33,7 @@ class ExtruderStack(CuraContainerStack): # # This will set the next stack and ensure that we register this stack as an extruder. @override(ContainerStack) - def setNextStack(self, stack: ContainerStack) -> None: + def setNextStack(self, stack: CuraContainerStack) -> None: super().setNextStack(stack) stack.addExtruder(self) self.addMetaDataEntry("machine", stack.id) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 7be3f0798e..45c7648916 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -283,6 +283,7 @@ class MachineManager(QObject): containers = container_registry.findContainerStacks(id = stack_id) if containers: Application.getInstance().setGlobalContainerStack(containers[0]) + ExtruderManager.getInstance()._globalContainerStackChanged() self.__emitChangedSignals() @@ -877,9 +878,10 @@ class MachineManager(QObject): @pyqtSlot(int, result = QObject) def getExtruder(self, position: int): + extruder = None if self._global_container_stack: - return self._global_container_stack.extruders.get(str(position)) - return None + extruder = self._global_container_stack.extruders.get(str(position)) + return extruder def _onMachineNameChanged(self): self.globalContainerChanged.emit() diff --git a/plugins/CuraEngineBackend/CuraEngineBackend.py b/plugins/CuraEngineBackend/CuraEngineBackend.py index cd4f74141b..ea3ac3c0f8 100755 --- a/plugins/CuraEngineBackend/CuraEngineBackend.py +++ b/plugins/CuraEngineBackend/CuraEngineBackend.py @@ -88,7 +88,6 @@ class CuraEngineBackend(QObject, Backend): # self._global_container_stack = None Application.getInstance().globalContainerStackChanged.connect(self._onGlobalStackChanged) - Application.getInstance().getExtruderManager().extrudersAdded.connect(self._onGlobalStackChanged) self._onGlobalStackChanged() Application.getInstance().stacksValidationFinished.connect(self._onStackErrorCheckFinished) diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml index ea1c0000f4..153bd88220 100644 --- a/resources/qml/Menus/NozzleMenu.qml +++ b/resources/qml/Menus/NozzleMenu.qml @@ -13,7 +13,8 @@ Menu title: "Nozzle" property int extruderIndex: 0 - property var extruderStack: Cura.MachineManager.getExtruder(menu.extruderIndex) + property QtObject extruderStack: Cura.MachineManager.getExtruder(menu.extruderIndex) + property bool hasExtruderStack: extruderStack != null Cura.NozzleModel { @@ -24,7 +25,7 @@ Menu { target: Cura.MachineManager onGlobalContainerChanged: { - menu.extruderStack = Cura.MachineManager.getExtruder(extruderIndex); + menu.extruderStack = Cura.MachineManager.getExtruder(menu.extruderIndex); } } @@ -36,7 +37,7 @@ Menu { text: model.hotend_name checkable: true - checked: extruderStack.variant.name == model.hotend_name + checked: menu.hasExtruderStack && extruderStack.variant.name == model.hotend_name exclusiveGroup: group onTriggered: { Cura.MachineManager.setVariantGroup(extruderIndex, model.container_node);