diff --git a/cura/Machines/QualityManager.py b/cura/Machines/QualityManager.py index 580d52b089..4ae58a71b2 100644 --- a/cura/Machines/QualityManager.py +++ b/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()) diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py index d7ebe804f4..e2f7df41ea 100755 --- a/cura/Settings/GlobalStack.py +++ b/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(