Browse Source

Fix quality lookup

CURA-5694

For a machine, if it has extruder-specific qualities, when we look up
extruder qualities, we should NOT fall back to use the global qualities.
Lipu Fei 6 years ago
parent
commit
d8421105d4
2 changed files with 23 additions and 11 deletions
  1. 20 11
      cura/Machines/QualityManager.py
  2. 3 0
      cura/Settings/GlobalStack.py

+ 20 - 11
cura/Machines/QualityManager.py

@@ -200,14 +200,19 @@ class QualityManager(QObject):
         machine_definition_id = getMachineDefinitionIDForQualitySearch(machine.definition)
 
         # This determines if we should only get the global qualities for the global stack and skip the global qualities for the extruder stacks
-        has_variants = machine.getHasVariants()
-        has_materials = machine.getHasMaterials()
-        has_variants_or_materials = has_variants or has_materials
+        has_machine_specific_qualities = machine.getHasMachineQuality()
 
         # To find the quality container for the GlobalStack, check in the following fall-back manner:
         #   (1) the machine-specific node
         #   (2) the generic node
         machine_node = self._machine_nozzle_buildplate_material_quality_type_to_quality_dict.get(machine_definition_id)
+        # Check if this machine has specific quality profiles for its extruders, if so, when looking up extruder
+        # qualities, we should not fall back to use the global qualities.
+        has_extruder_specific_qualities = False
+        if machine_node:
+            if machine_node.children_map:
+                has_extruder_specific_qualities = True
+
         default_machine_node = self._machine_nozzle_buildplate_material_quality_type_to_quality_dict.get(self._default_machine_definition_id)
         nodes_to_check = [machine_node, default_machine_node]
 
@@ -215,12 +220,10 @@ class QualityManager(QObject):
         quality_group_dict = {}
         for node in nodes_to_check:
             if node and node.quality_type_map:
-                # Only include global qualities
-                if has_variants_or_materials:
-                    quality_node = list(node.quality_type_map.values())[0]
-                    is_global_quality = parseBool(quality_node.metadata.get("global_quality", False))
-                    if not is_global_quality:
-                        continue
+                quality_node = list(node.quality_type_map.values())[0]
+                is_global_quality = parseBool(quality_node.metadata.get("global_quality", False))
+                if not is_global_quality:
+                    continue
 
                 for quality_type, quality_node in node.quality_type_map.items():
                     quality_group = QualityGroup(quality_node.metadata["name"], quality_type)
@@ -302,9 +305,9 @@ class QualityManager(QObject):
             else:
                 nodes_to_check += [default_machine_node]
 
-            for node in nodes_to_check:
+            for node_idx, node in enumerate(nodes_to_check):
                 if node and node.quality_type_map:
-                    if has_variants_or_materials:
+                    if has_extruder_specific_qualities:
                         # Only include variant qualities; skip non global qualities
                         quality_node = list(node.quality_type_map.values())[0]
                         is_global_quality = parseBool(quality_node.metadata.get("global_quality", False))
@@ -320,6 +323,12 @@ class QualityManager(QObject):
                         if position not in quality_group.nodes_for_extruders:
                             quality_group.nodes_for_extruders[position] = quality_node
 
+                # If the machine has its own specific qualities, for extruders, it should skip the global qualities
+                # and use the material/variant specific qualities.
+                if has_extruder_specific_qualities:
+                    if node_idx == len(nodes_to_check) - 1:
+                        break
+
         # Update availabilities for each quality group
         self._updateQualityGroupsAvailability(machine, quality_group_dict.values())
 

+ 3 - 0
cura/Settings/GlobalStack.py

@@ -196,6 +196,9 @@ class GlobalStack(CuraContainerStack):
     def getHasVariants(self) -> bool:
         return parseBool(self.getMetaDataEntry("has_variants", False))
 
+    def getHasMachineQuality(self) -> bool:
+        return parseBool(self.getMetaDataEntry("has_machine_quality", False))
+
 
 ## private:
 global_stack_mime = MimeType(