diff --git a/cura/Machines/MachineNode.py b/cura/Machines/MachineNode.py index 0e424101c0..cc08fd1ff3 100644 --- a/cura/Machines/MachineNode.py +++ b/cura/Machines/MachineNode.py @@ -7,6 +7,7 @@ from UM.Util import parseBool from UM.Settings.ContainerRegistry import ContainerRegistry # To find all the variants for this machine. from UM.Settings.Interfaces import ContainerInterface from cura.Machines.ContainerNode import ContainerNode +from cura.Machines.QualityNode import QualityNode from cura.Machines.VariantNode import VariantNode if TYPE_CHECKING: @@ -18,7 +19,8 @@ if TYPE_CHECKING: class MachineNode(ContainerNode): def __init__(self, container_id: str) -> None: super().__init__(container_id) - self.variants = {} # type: Dict[str, VariantNode] # mapping variant names to their nodes. + self.variants = {} # type: Dict[str, VariantNode] # Mapping variant names to their nodes. + self.global_qualities = {} # type: Dict[str, QualityNode] # Mapping quality types to the global quality for those types. container_registry = ContainerRegistry.getInstance() my_metadata = container_registry.findContainersMetadata(id = container_id)[0] @@ -37,12 +39,20 @@ class MachineNode(ContainerNode): ## (Re)loads all variants under this printer. def _loadAll(self): # Find all the variants for this definition ID. - variants = ContainerRegistry.getInstance().findInstanceContainersMetadata(type = "variant", definition = self.container_id, hardware_type = "nozzle") + container_registry = ContainerRegistry.getInstance() + variants = container_registry.findInstanceContainersMetadata(type = "variant", definition = self.container_id, hardware_type = "nozzle") for variant in variants: variant_name = variant["name"] if variant_name not in self.variants: self.variants[variant_name] = VariantNode(variant["id"], machine = self) + # Find the global qualities for this printer. + global_qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.container_id, global_quality = True) # First try specific to this printer. + if len(global_qualities) == 0: # This printer doesn't override the global qualities. + global_qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = "fdmprinter", global_quality = True) # Otherwise pick the global global qualities. + for global_quality in global_qualities: + self.global_qualities[global_quality["quality_type"]] = QualityNode(global_quality["id"], parent = self) + ## When a variant gets added to the set of profiles, we need to update our # tree here. def _variantAdded(self, container: ContainerInterface): diff --git a/cura/Machines/MaterialNode.py b/cura/Machines/MaterialNode.py index 51dc62837a..ffe1e56b35 100644 --- a/cura/Machines/MaterialNode.py +++ b/cura/Machines/MaterialNode.py @@ -37,7 +37,7 @@ class MaterialNode(ContainerNode): for quality in qualities: quality_id = quality["id"] if quality_id not in self.qualities: - self.qualities[quality_id] = QualityNode(quality_id, material = self) + self.qualities[quality_id] = QualityNode(quality_id, parent = self) def _qualityAdded(self, container: ContainerInterface) -> None: if container.getMetaDataEntry("type") != "quality": @@ -50,4 +50,4 @@ class MaterialNode(ContainerNode): return # Doesn't match our configuration. quality_id = container.getId() - self.qualities[quality_id] = QualityNode(quality_id, material = self) \ No newline at end of file + self.qualities[quality_id] = QualityNode(quality_id, parent = self) \ No newline at end of file diff --git a/cura/Machines/QualityNode.py b/cura/Machines/QualityNode.py index 5c5f1264aa..3dad0e4434 100644 --- a/cura/Machines/QualityNode.py +++ b/cura/Machines/QualityNode.py @@ -1,7 +1,7 @@ # Copyright (c) 2019 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import TYPE_CHECKING +from typing import Union, TYPE_CHECKING from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.Interfaces import ContainerInterface @@ -11,14 +11,15 @@ from cura.Machines.IntentNode import IntentNode if TYPE_CHECKING: from typing import Dict from cura.Machines.MaterialNode import MaterialNode + from cura.Machines.MachineNode import MachineNode ## Represents a material profile in the container tree. # # Its subcontainers are intent profiles. class QualityNode(ContainerNode): - def __init__(self, container_id: str, material: "MaterialNode") -> None: + def __init__(self, container_id: str, parent: Union["MaterialNode", "MachineNode"]) -> None: super().__init__(container_id) - self.material = material + self.parent = parent self.intents = {} # type: Dict[str, IntentNode] ContainerRegistry.getInstance().containerAdded.connect(self._intentAdded) self._loadAll() @@ -26,17 +27,22 @@ class QualityNode(ContainerNode): def _loadAll(self) -> None: container_registry = ContainerRegistry.getInstance() # Find all intent profiles that fit the current configuration. - for intent in container_registry.findInstanceContainersMetadata(type = "intent", definition = self.material.variant.machine.quality_definition, variant = self.material.variant.variant_name, material = self.material.base_file): - self.intents[intent["id"]] = IntentNode(intent["id"], quality = self) + if isinstance(self.parent, MaterialNode): # Not a global profile. + for intent in container_registry.findInstanceContainersMetadata(type = "intent", definition = self.parent.variant.machine.quality_definition, variant = self.parent.variant.variant_name, material = self.parent.base_file): + self.intents[intent["id"]] = IntentNode(intent["id"], quality = self) + # Otherwise, there are no intents for global profiles. def _intentAdded(self, container: ContainerInterface) -> None: + from cura.Machines.MachineNode import MachineNode # Imported here to prevent circular imports. if container.getMetaDataEntry("type") != "intent": return # Not interested if it's not an intent. - if container.getMetaDataEntry("definition") != self.material.variant.machine.quality_definition: + if isinstance(self.parent, MachineNode): + return # Global profiles don't have intents. + if container.getMetaDataEntry("definition") != self.parent.variant.machine.quality_definition: return # Incorrect printer. - if container.getMetaDataEntry("variant") != self.material.variant.variant_name: + if container.getMetaDataEntry("variant") != self.parent.variant.variant_name: return # Incorrect variant. - if container.getMetaDataEntry("material") != self.material.base_file: + if container.getMetaDataEntry("material") != self.parent.base_file: return # Incorrect material. container_id = container.getId() if container_id in self.intents: