diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py index 24c7ccb8c0..2cdc784a5e 100644 --- a/cura/Machines/MaterialManager.py +++ b/cura/Machines/MaterialManager.py @@ -18,7 +18,10 @@ from .MaterialNode import MaterialNode from .MaterialGroup import MaterialGroup if TYPE_CHECKING: + from UM.Settings.DefinitionContainer import DefinitionContainer + from UM.Settings.InstanceContainer import InstanceContainer from cura.Settings.GlobalStack import GlobalStack + from cura.Settings.ExtruderStack import ExtruderStack # @@ -244,7 +247,7 @@ class MaterialManager(QObject): # # Return a dict with all root material IDs (k) and ContainerNodes (v) that's suitable for the given setup. # - def getAvailableMaterials(self, machine_definition_id: str, extruder_variant_name: Optional[str], + def getAvailableMaterials(self, machine_definition: "DefinitionContainer", extruder_variant_name: Optional[str], diameter: float) -> dict: # round the diameter to get the approximate diameter rounded_diameter = str(round(diameter)) @@ -252,6 +255,8 @@ class MaterialManager(QObject): Logger.log("i", "Cannot find materials with diameter [%s] (rounded to [%s])", diameter, rounded_diameter) return dict() + machine_definition_id = machine_definition.getId() + # If there are variant materials, get the variant material machine_variant_material_map = self._diameter_machine_variant_material_map[rounded_diameter] machine_node = machine_variant_material_map.get(machine_definition_id) @@ -266,10 +271,18 @@ class MaterialManager(QObject): # 1. variant-specific material # 2. machine-specific material # 3. generic material (for fdmprinter) + machine_exclude_materials = machine_definition.getMetaDataEntry("exclude_materials", []) + material_id_metadata_dict = dict() for node in nodes_to_check: if node is not None: for material_id, node in node.material_map.items(): + fallback_id = self.getFallbackMaterialIdByMaterialType(node.metadata["material"]) + if fallback_id in machine_exclude_materials: + Logger.log("d", "Exclude material [%s] for machine [%s]", + material_id, machine_definition.getId()) + continue + if material_id not in material_id_metadata_dict: material_id_metadata_dict[material_id] = node @@ -280,14 +293,13 @@ class MaterialManager(QObject): # def getAvailableMaterialsForMachineExtruder(self, machine: "GlobalStack", extruder_stack: "ExtruderStack") -> Optional[dict]: - machine_definition_id = machine.definition.getId() variant_name = None if extruder_stack.variant.getId() != "empty_variant": variant_name = extruder_stack.variant.getName() diameter = extruder_stack.approximateMaterialDiameter # Fetch the available materials (ContainerNode) for the current active machine and extruder setup. - return self.getAvailableMaterials(machine_definition_id, variant_name, diameter) + return self.getAvailableMaterials(machine.definition, variant_name, diameter) # # Gets MaterialNode for the given extruder and machine with the given material name. diff --git a/cura/Machines/Models/GenericMaterialsModel.py b/cura/Machines/Models/GenericMaterialsModel.py index c185432f32..2fac919f3e 100644 --- a/cura/Machines/Models/GenericMaterialsModel.py +++ b/cura/Machines/Models/GenericMaterialsModel.py @@ -31,7 +31,6 @@ class GenericMaterialsModel(BaseMaterialsModel): self.setItems([]) return extruder_stack = global_stack.extruders[extruder_position] - exclude_materials = set(global_stack.definition.getMetaDataEntry("exclude_materials", [])) available_material_dict = self._material_manager.getAvailableMaterialsForMachineExtruder(global_stack, extruder_stack) @@ -42,9 +41,6 @@ class GenericMaterialsModel(BaseMaterialsModel): item_list = [] for root_material_id, container_node in available_material_dict.items(): metadata = container_node.metadata - # Skip excluded materials - if metadata["id"] in exclude_materials: - continue # Only add results for generic materials if metadata["brand"].lower() != "generic": continue diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 1d6a401b43..9bb66aa36a 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1153,7 +1153,7 @@ class MachineManager(QObject): context.context["evaluate_from_container_index"] = _ContainerIndexes.DefinitionChanges material_diameter = extruder.getProperty("material_diameter", "value", context) candidate_materials = self._material_manager.getAvailableMaterials( - self._global_container_stack.definition.getId(), + self._global_container_stack.definition, current_variant_name, material_diameter)