diff --git a/cura/QualityManager.py b/cura/QualityManager.py index ecea46a352..97cf2a356a 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -101,12 +101,11 @@ class QualityManager: if quality_type: criteria["quality_type"] = quality_type result = self._getFilteredContainersForStack(machine_definition, material_containers, **criteria) - # Fall back to using generic materials and qualities if nothing could be found. if not result and material_containers and len(material_containers) == 1: basic_materials = self._getBasicMaterials(material_containers[0]) - result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) - + if basic_materials: + result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) return result[0] if result else None ## Find all suitable qualities for a combination of machine and material. @@ -119,7 +118,8 @@ class QualityManager: result = self._getFilteredContainersForStack(machine_definition, [material_container], **criteria) if not result: basic_materials = self._getBasicMaterials(material_container) - result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) + if basic_materials: + result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) return result @@ -179,7 +179,6 @@ class QualityManager: definition_id = material_container.getDefinition().getMetaDataEntry("quality_definition", material_container.getDefinition().getId()) else: definition_id = "fdmprinter" - if base_material: # There is a basic material specified criteria = { "type": "material", "name": base_material, "definition": definition_id } @@ -226,13 +225,13 @@ class QualityManager: # Stick the material IDs in a set material_ids = set() + for material_instance in material_containers: if material_instance is not None: # Add the parent material too. for basic_material in self._getBasicMaterials(material_instance): material_ids.add(basic_material.getId()) material_ids.add(material_instance.getId()) - containers = ContainerRegistry.getInstance().findInstanceContainers(**criteria) result = [] @@ -241,6 +240,7 @@ class QualityManager: if filter_by_material and container.getMetaDataEntry("material") not in material_ids and "global_quality" not in kwargs: continue result.append(container) + return result ## Get the parent machine definition of a machine definition. diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index fc256e37be..dd4872b05b 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -929,6 +929,11 @@ class ContainerManager(QObject): quality_changes.setDefinition(self._container_registry.findContainers(id = "fdmprinter")[0]) else: quality_changes.setDefinition(QualityManager.getInstance().getParentMachineDefinition(machine_definition)) + whole_machine_definition = QualityManager.getInstance().getWholeMachineDefinition(machine_definition) + + if whole_machine_definition.getMetaDataEntry("has_materials"): + quality_changes.addMetaDataEntry("material", quality_container.getMetaDataEntry("material")) + from cura.CuraApplication import CuraApplication quality_changes.addMetaDataEntry("setting_version", CuraApplication.SettingVersion) return quality_changes diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 8738b044fb..33372a3228 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -753,11 +753,12 @@ class MachineManager(QObject): candidate_quality = quality_manager.findQualityByQualityType(quality_type, quality_manager.getWholeMachineDefinition(machine_definition), [material_container]) + if not candidate_quality or isinstance(candidate_quality, type(self._empty_quality_changes_container)): + Logger.log("d", "Attempting to find fallback quality") # Fall back to a quality (which must be compatible with all other extruders) new_qualities = quality_manager.findAllUsableQualitiesForMachineAndExtruders( self._global_container_stack, ExtruderManager.getInstance().getExtruderStacks()) - if new_qualities: new_quality_id = new_qualities[0].getId() # Just pick the first available one else: