MaterialNode.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. # Copyright (c) 2019 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from typing import TYPE_CHECKING
  4. from UM.Settings.ContainerRegistry import ContainerRegistry
  5. from UM.Settings.Interfaces import ContainerInterface
  6. from cura.Machines.ContainerNode import ContainerNode
  7. from cura.Machines.QualityNode import QualityNode
  8. if TYPE_CHECKING:
  9. from typing import Dict
  10. from cura.Machines.VariantNode import VariantNode
  11. ## Represents a material in the container tree.
  12. #
  13. # Its subcontainers are quality profiles.
  14. class MaterialNode(ContainerNode):
  15. def __init__(self, container_id, variant: "VariantNode") -> None:
  16. super().__init__(container_id)
  17. self.variant = variant
  18. self.qualities = {} # type: Dict[str, QualityNode] # Mapping container IDs to quality profiles.
  19. container_registry = ContainerRegistry.getInstance()
  20. my_metadata = container_registry.findContainersMetadata(id = container_id)[0]
  21. self.base_file = my_metadata["base_file"]
  22. container_registry.containerAdded.connect(self._qualityAdded)
  23. self._loadAll()
  24. def _loadAll(self) -> None:
  25. container_registry = ContainerRegistry.getInstance()
  26. # Find all quality profiles that fit on this material.
  27. if not self.variant.machine.has_machine_quality: # Need to find the global qualities.
  28. qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = "fdmprinter")
  29. else:
  30. qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition, variant = self.variant.variant_name, material = self.base_file)
  31. for quality in qualities:
  32. quality_id = quality["id"]
  33. if quality_id not in self.qualities:
  34. self.qualities[quality_id] = QualityNode(quality_id, parent = self)
  35. def _qualityAdded(self, container: ContainerInterface) -> None:
  36. if container.getMetaDataEntry("type") != "quality":
  37. return # Not interested.
  38. if not self.variant.machine.has_machine_quality:
  39. if container.getMetaDataEntry("definition") != "fdmprinter":
  40. return # Only want global qualities.
  41. else:
  42. if container.getMetaDataEntry("definition") != self.variant.machine.quality_definition or container.getMetaDataEntry("variant") != self.variant.variant_name or container.getMetaDataEntry("material") != self.base_file:
  43. return # Doesn't match our configuration.
  44. quality_id = container.getId()
  45. self.qualities[quality_id] = QualityNode(quality_id, parent = self)