Add global quality nodes to machine node

This means that the parent of the quality node could be one of two types. A bit confusing.

Contributes to issue CURA-6600.
This commit is contained in:
Ghostkeeper 2019-08-12 14:18:51 +02:00
parent fff26bb021
commit 8f075b644d
No known key found for this signature in database
GPG key ID: 86BEF881AE2CF276
3 changed files with 28 additions and 12 deletions

View file

@ -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.ContainerRegistry import ContainerRegistry # To find all the variants for this machine.
from UM.Settings.Interfaces import ContainerInterface from UM.Settings.Interfaces import ContainerInterface
from cura.Machines.ContainerNode import ContainerNode from cura.Machines.ContainerNode import ContainerNode
from cura.Machines.QualityNode import QualityNode
from cura.Machines.VariantNode import VariantNode from cura.Machines.VariantNode import VariantNode
if TYPE_CHECKING: if TYPE_CHECKING:
@ -18,7 +19,8 @@ if TYPE_CHECKING:
class MachineNode(ContainerNode): class MachineNode(ContainerNode):
def __init__(self, container_id: str) -> None: def __init__(self, container_id: str) -> None:
super().__init__(container_id) 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() container_registry = ContainerRegistry.getInstance()
my_metadata = container_registry.findContainersMetadata(id = container_id)[0] my_metadata = container_registry.findContainersMetadata(id = container_id)[0]
@ -37,12 +39,20 @@ class MachineNode(ContainerNode):
## (Re)loads all variants under this printer. ## (Re)loads all variants under this printer.
def _loadAll(self): def _loadAll(self):
# Find all the variants for this definition ID. # 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: for variant in variants:
variant_name = variant["name"] variant_name = variant["name"]
if variant_name not in self.variants: if variant_name not in self.variants:
self.variants[variant_name] = VariantNode(variant["id"], machine = self) 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 ## When a variant gets added to the set of profiles, we need to update our
# tree here. # tree here.
def _variantAdded(self, container: ContainerInterface): def _variantAdded(self, container: ContainerInterface):

View file

@ -37,7 +37,7 @@ class MaterialNode(ContainerNode):
for quality in qualities: for quality in qualities:
quality_id = quality["id"] quality_id = quality["id"]
if quality_id not in self.qualities: 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: def _qualityAdded(self, container: ContainerInterface) -> None:
if container.getMetaDataEntry("type") != "quality": if container.getMetaDataEntry("type") != "quality":
@ -50,4 +50,4 @@ class MaterialNode(ContainerNode):
return # Doesn't match our configuration. return # Doesn't match our configuration.
quality_id = container.getId() quality_id = container.getId()
self.qualities[quality_id] = QualityNode(quality_id, material = self) self.qualities[quality_id] = QualityNode(quality_id, parent = self)

View file

@ -1,7 +1,7 @@
# Copyright (c) 2019 Ultimaker B.V. # Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # 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.ContainerRegistry import ContainerRegistry
from UM.Settings.Interfaces import ContainerInterface from UM.Settings.Interfaces import ContainerInterface
@ -11,14 +11,15 @@ from cura.Machines.IntentNode import IntentNode
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Dict from typing import Dict
from cura.Machines.MaterialNode import MaterialNode from cura.Machines.MaterialNode import MaterialNode
from cura.Machines.MachineNode import MachineNode
## Represents a material profile in the container tree. ## Represents a material profile in the container tree.
# #
# Its subcontainers are intent profiles. # Its subcontainers are intent profiles.
class QualityNode(ContainerNode): 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) super().__init__(container_id)
self.material = material self.parent = parent
self.intents = {} # type: Dict[str, IntentNode] self.intents = {} # type: Dict[str, IntentNode]
ContainerRegistry.getInstance().containerAdded.connect(self._intentAdded) ContainerRegistry.getInstance().containerAdded.connect(self._intentAdded)
self._loadAll() self._loadAll()
@ -26,17 +27,22 @@ class QualityNode(ContainerNode):
def _loadAll(self) -> None: def _loadAll(self) -> None:
container_registry = ContainerRegistry.getInstance() container_registry = ContainerRegistry.getInstance()
# Find all intent profiles that fit the current configuration. # 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): 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) self.intents[intent["id"]] = IntentNode(intent["id"], quality = self)
# Otherwise, there are no intents for global profiles.
def _intentAdded(self, container: ContainerInterface) -> None: def _intentAdded(self, container: ContainerInterface) -> None:
from cura.Machines.MachineNode import MachineNode # Imported here to prevent circular imports.
if container.getMetaDataEntry("type") != "intent": if container.getMetaDataEntry("type") != "intent":
return # Not interested if it's not an 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. return # Incorrect printer.
if container.getMetaDataEntry("variant") != self.material.variant.variant_name: if container.getMetaDataEntry("variant") != self.parent.variant.variant_name:
return # Incorrect variant. return # Incorrect variant.
if container.getMetaDataEntry("material") != self.material.base_file: if container.getMetaDataEntry("material") != self.parent.base_file:
return # Incorrect material. return # Incorrect material.
container_id = container.getId() container_id = container.getId()
if container_id in self.intents: if container_id in self.intents: