Browse Source

Insert "generic color same brand" logic for qualities

So instead of always falling back to generic brand and generic color,
we first try to fall back to generic color with the same brand for qualities

CURA-10953
Jaime van Kessel 1 year ago
parent
commit
331ff75315
1 changed files with 17 additions and 2 deletions
  1. 17 2
      cura/Machines/MaterialNode.py

+ 17 - 2
cura/Machines/MaterialNode.py

@@ -31,6 +31,7 @@ class MaterialNode(ContainerNode):
         my_metadata = container_registry.findContainersMetadata(id = container_id)[0]
         self.base_file = my_metadata["base_file"]
         self.material_type = my_metadata["material"]
+        self.brand = my_metadata["brand"]
         self.guid = my_metadata["GUID"]
         self._loadAll()
         container_registry.containerRemoved.connect(self._onRemoved)
@@ -80,6 +81,7 @@ class MaterialNode(ContainerNode):
                 # such as "generic_pla_ultimaker_s5_AA_0.4". So we search with the "base_file" which is the material_root_id.
             else:
                 qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition, material = self.base_file)
+
             if not qualities:
                 my_material_type = self.material_type
                 if self.variant.machine.has_variants:
@@ -89,9 +91,22 @@ class MaterialNode(ContainerNode):
                 else:
                     qualities_any_material = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition)
 
-                all_material_base_files = {material_metadata["base_file"] for material_metadata in container_registry.findInstanceContainersMetadata(type = "material", material = my_material_type)}
+                # First we attempt to find materials that have the same brand but not the right color
+                all_material_base_files_right_brand = {material_metadata["base_file"] for material_metadata in container_registry.findInstanceContainersMetadata(type = "material", material = my_material_type, brand = self.brand)}
+
+                right_brand_no_color_qualities = [quality for quality in qualities_any_material if quality.get("material") in all_material_base_files_right_brand]
 
-                qualities.extend((quality for quality in qualities_any_material if quality.get("material") in all_material_base_files))
+                if right_brand_no_color_qualities:
+                    # We found qualties for materials with the right brand but not with the right color. Use those.
+                    qualities.extend(right_brand_no_color_qualities)
+                else:
+                    # Fall back to generic
+                    all_material_base_files = {material_metadata["base_file"] for material_metadata in
+                                               container_registry.findInstanceContainersMetadata(type="material",
+                                                                                                 material=my_material_type)}
+                    no_brand_no_color_qualities = (quality for quality in qualities_any_material if
+                                                   quality.get("material") in all_material_base_files)
+                    qualities.extend(no_brand_no_color_qualities)
 
                 if not qualities:  # No quality profiles found. Go by GUID then.
                     my_guid = self.guid