Просмотр исходного кода

Don't make parent a common property

Instead we use properly-typed and appropriately-named variables in each of the sub classes.

Contributes to issue CURA-6600.
Ghostkeeper 5 лет назад
Родитель
Сommit
8ec1c31b58

+ 1 - 3
cura/Machines/ContainerNode.py

@@ -18,10 +18,8 @@ class ContainerNode:
     ##  Creates a new node for the container tree.
     #   \param container_id The ID of the container that this node should
     #   represent.
-    #   \param parent The parent container node, if any.
-    def __init__(self, container_id: str, parent: Optional["ContainerNode"]) -> None:
+    def __init__(self, container_id: str) -> None:
         self.container_id = container_id
-        self.parent = parent
         self._container = None  # type: Optional[InstanceContainer]
         self.children_map = {}  # type: Dict[str, ContainerNode]  # Mapping from container ID to container node.
 

+ 3 - 3
cura/Machines/MachineNode.py

@@ -17,7 +17,7 @@ if TYPE_CHECKING:
 #   The subnodes of these nodes are variants.
 class MachineNode(ContainerNode):
     def __init__(self, container_id: str) -> None:
-        super().__init__(container_id, None)
+        super().__init__(container_id)
         self.variants = {}  # type: Dict[str, VariantNode] # mapping variant names to their nodes.
         container_registry = ContainerRegistry.getInstance()
         my_metadata = container_registry.findContainersMetadata(id = container_id)[0]
@@ -35,7 +35,7 @@ class MachineNode(ContainerNode):
         for variant in variants:
             variant_name = variant["name"]
             if variant_name not in self.variants:
-                self.variants[variant_name] = VariantNode(variant["id"], parent = self)
+                self.variants[variant_name] = VariantNode(variant["id"], machine = self)
 
     ##  When a variant gets added to the set of profiles, we need to update our
     #   tree here.
@@ -50,4 +50,4 @@ class MachineNode(ContainerNode):
         if container.getMetaDataEntry("definition") != self.container_id:
             return  # Not a nozzle that fits in my machine.
 
-        self.variants[name] = VariantNode(container.getId(), parent = self)
+        self.variants[name] = VariantNode(container.getId(), machine = self)

+ 9 - 8
cura/Machines/MaterialNode.py

@@ -16,8 +16,9 @@ if TYPE_CHECKING:
 #
 #   Its subcontainers are quality profiles.
 class MaterialNode(ContainerNode):
-    def __init__(self, container_id, parent: VariantNode) -> None:
-        super().__init__(container_id, parent)
+    def __init__(self, container_id, variant: VariantNode) -> None:
+        super().__init__(container_id)
+        self.variant = variant
         self.qualities = {}  # type: Dict[str, QualityNode] # Mapping container IDs to quality profiles.
         container_registry = ContainerRegistry.getInstance()
         my_metadata = container_registry.findContainersMetadata(id = container_id)[0]
@@ -28,25 +29,25 @@ class MaterialNode(ContainerNode):
     def _loadAll(self) -> None:
         container_registry = ContainerRegistry.getInstance()
         # Find all quality profiles that fit on this material.
-        if not self.parent.parent.has_machine_quality:  # Need to find the global qualities.
+        if not self.variant.machine.has_machine_quality:  # Need to find the global qualities.
             qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = "fdmprinter")
         else:
-            qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.parent.parent.quality_definition, variant = self.parent.variant_name, material = self.base_file)
+            qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition, variant = self.variant.variant_name, material = self.base_file)
 
         for quality in qualities:
             quality_id = quality["id"]
             if quality_id not in self.qualities:
-                self.qualities[quality_id] = QualityNode(quality_id, parent = self)
+                self.qualities[quality_id] = QualityNode(quality_id, material = self)
 
     def _qualityAdded(self, container: ContainerInterface) -> None:
         if container.getMetaDataEntry("type") != "quality":
             return  # Not interested.
-        if not self.parent.parent.has_machine_quality:
+        if not self.variant.machine.has_machine_quality:
             if container.getMetaDataEntry("definition") != "fdmprinter":
                 return  # Only want global qualities.
         else:
-            if container.getMetaDataEntry("definition") != self.parent.parent.quality_definition or container.getMetaDataEntry("variant") != self.parent.variant_name or container.getMetaDataEntry("material") != self.base_file:
+            if container.getMetaDataEntry("definition") != self.variant.machine.quality_definition or container.getMetaDataEntry("variant") != self.variant.variant_name or container.getMetaDataEntry("material") != self.base_file:
                 return  # Doesn't match our configuration.
 
         quality_id = container.getId()
-        self.qualities[quality_id] = QualityNode(quality_id, parent = self)
+        self.qualities[quality_id] = QualityNode(quality_id, material = self)

+ 14 - 13
cura/Machines/VariantNode.py

@@ -22,11 +22,12 @@ if TYPE_CHECKING:
 #   material diameter setting, we cannot filter them here. Filtering must be
 #   done in the model.
 class VariantNode(ContainerNode):
-    def __init__(self, container_id: str, parent: MachineNode) -> None:
-        super().__init__(container_id, parent)
+    def __init__(self, container_id: str, machine: MachineNode) -> None:
+        super().__init__(container_id)
+        self.machine = machine
         self.materials = {}  # type: Dict[str, MaterialNode]  # Mapping material base files to their nodes.
         container_registry = ContainerRegistry.getInstance()
-        self.variant_name = container_registry.findContainersMetadata(id = container_id)[0]["name"] #Store our own name so that we can filter more easily.
+        self.variant_name = container_registry.findContainersMetadata(id = container_id)[0]["name"]  # Store our own name so that we can filter more easily.
         container_registry.containerAdded.connect(self._materialAdded)
         self._loadAll()
 
@@ -34,24 +35,24 @@ class VariantNode(ContainerNode):
     def _loadAll(self):
         container_registry = ContainerRegistry.getInstance()
         # Find all the materials for this variant's name.
-        if not self.parent.has_machine_materials:  # Printer has no specific materials. Look for all fdmprinter materials.
+        if not self.machine.has_machine_materials:  # Printer has no specific materials. Look for all fdmprinter materials.
             materials = container_registry.findInstanceContainersMetadata(type = "material", definition = "fdmprinter")  # These are ONLY the base materials.
         else:  # Printer has its own material profiles. Look for material profiles with this printer's definition.
             all_materials = container_registry.findInstanceContainersMetadata(type = "material", definition = "fdmprinter")
-            printer_specific_materials = container_registry.findInstanceContainersMetadata(type = "material", definition = self.parent.container_id)
-            variant_specific_materials = container_registry.findInstanceContainersMetadata(type = "material", definition = self.parent.container_id, variant = self.variant_name)
+            printer_specific_materials = container_registry.findInstanceContainersMetadata(type = "material", definition = self.machine.container_id)
+            variant_specific_materials = container_registry.findInstanceContainersMetadata(type = "material", definition = self.machine.container_id, variant = self.variant_name)
             materials_per_base_file = {material["base_file"]: material for material in all_materials}
             materials_per_base_file.update({material["base_file"]: material for material in printer_specific_materials})  # Printer-specific profiles override global ones.
             materials_per_base_file.update({material["base_file"]: material for material in variant_specific_materials})  # Variant-specific profiles override all of those.
             materials = materials_per_base_file.values()
 
-        for excluded_material in self.parent.exclude_materials:
+        for excluded_material in self.machine.exclude_materials:
             del materials[excluded_material]
 
         for material in materials:
             base_file = material["base_file"]
             if base_file not in self.materials:
-                self.materials[base_file] = MaterialNode(material["id"], parent = self)
+                self.materials[base_file] = MaterialNode(material["id"], variant = self)
 
     ##  When a material gets added to the set of profiles, we need to update our
     #   tree here.
@@ -59,14 +60,14 @@ class VariantNode(ContainerNode):
         if container.getMetaDataEntry("type") != "material":
             return  # Not interested.
         material_definition = container.getMetaDataEntry("definition")
-        if not self.parent.has_machine_materials:
+        if not self.machine.has_machine_materials:
             if material_definition != "fdmprinter":
                 return
         base_file = container.getMetaDataEntry("base_file")
-        if base_file in self.parent.exclude_materials:
+        if base_file in self.machine.exclude_materials:
             return  # Material is forbidden for this printer.
         if base_file not in self.materials:  # Completely new base file. Always better than not having a file as long as it matches our set-up.
-            if material_definition != "fdmprinter" and material_definition != self.parent.container_id:
+            if material_definition != "fdmprinter" and material_definition != self.machine.container_id:
                 return
             material_variant = container.getMetaDataEntry("variant", "empty")
             if material_variant != "empty" and material_variant != self.variant_name:
@@ -75,11 +76,11 @@ class VariantNode(ContainerNode):
             new_definition = container.getMetaDataEntry("definition")
             if new_definition == "fdmprinter":
                 return  # Just as unspecific or worse.
-            if new_definition != self.parent.container_id:
+            if new_definition != self.machine.container_id:
                 return  # Doesn't match this set-up.
             original_metadata = ContainerRegistry.getInstance().findContainersMetadata(id = self.materials[base_file].container_id)[0]
             original_variant = original_metadata.get("variant", "empty")
             if original_variant != "empty" or container.getMetaDataEntry("variant", "empty") == "empty":
                 return  # Original was already specific or just as unspecific as the new one.
 
-        self.materials[base_file] = MaterialNode(container.getId(), parent = self)
+        self.materials[base_file] = MaterialNode(container.getId(), variant = self)