Handle excluded_materials in getAvailableMaterials()

CURA-5223

Move the handling of excluded_materials into MaterialManager
getAvailableMaterials().
This commit is contained in:
Lipu Fei 2018-04-12 16:12:04 +02:00
parent e2d6e18ac9
commit 7eba73adc5
3 changed files with 16 additions and 8 deletions

View File

@ -18,7 +18,10 @@ from .MaterialNode import MaterialNode
from .MaterialGroup import MaterialGroup from .MaterialGroup import MaterialGroup
if TYPE_CHECKING: if TYPE_CHECKING:
from UM.Settings.DefinitionContainer import DefinitionContainer
from UM.Settings.InstanceContainer import InstanceContainer
from cura.Settings.GlobalStack import GlobalStack 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. # 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: diameter: float) -> dict:
# round the diameter to get the approximate diameter # round the diameter to get the approximate diameter
rounded_diameter = str(round(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) Logger.log("i", "Cannot find materials with diameter [%s] (rounded to [%s])", diameter, rounded_diameter)
return dict() return dict()
machine_definition_id = machine_definition.getId()
# If there are variant materials, get the variant material # If there are variant materials, get the variant material
machine_variant_material_map = self._diameter_machine_variant_material_map[rounded_diameter] machine_variant_material_map = self._diameter_machine_variant_material_map[rounded_diameter]
machine_node = machine_variant_material_map.get(machine_definition_id) machine_node = machine_variant_material_map.get(machine_definition_id)
@ -266,10 +271,18 @@ class MaterialManager(QObject):
# 1. variant-specific material # 1. variant-specific material
# 2. machine-specific material # 2. machine-specific material
# 3. generic material (for fdmprinter) # 3. generic material (for fdmprinter)
machine_exclude_materials = machine_definition.getMetaDataEntry("exclude_materials", [])
material_id_metadata_dict = dict() material_id_metadata_dict = dict()
for node in nodes_to_check: for node in nodes_to_check:
if node is not None: if node is not None:
for material_id, node in node.material_map.items(): 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: if material_id not in material_id_metadata_dict:
material_id_metadata_dict[material_id] = node material_id_metadata_dict[material_id] = node
@ -280,14 +293,13 @@ class MaterialManager(QObject):
# #
def getAvailableMaterialsForMachineExtruder(self, machine: "GlobalStack", def getAvailableMaterialsForMachineExtruder(self, machine: "GlobalStack",
extruder_stack: "ExtruderStack") -> Optional[dict]: extruder_stack: "ExtruderStack") -> Optional[dict]:
machine_definition_id = machine.definition.getId()
variant_name = None variant_name = None
if extruder_stack.variant.getId() != "empty_variant": if extruder_stack.variant.getId() != "empty_variant":
variant_name = extruder_stack.variant.getName() variant_name = extruder_stack.variant.getName()
diameter = extruder_stack.approximateMaterialDiameter diameter = extruder_stack.approximateMaterialDiameter
# Fetch the available materials (ContainerNode) for the current active machine and extruder setup. # 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. # Gets MaterialNode for the given extruder and machine with the given material name.

View File

@ -31,7 +31,6 @@ class GenericMaterialsModel(BaseMaterialsModel):
self.setItems([]) self.setItems([])
return return
extruder_stack = global_stack.extruders[extruder_position] 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, available_material_dict = self._material_manager.getAvailableMaterialsForMachineExtruder(global_stack,
extruder_stack) extruder_stack)
@ -42,9 +41,6 @@ class GenericMaterialsModel(BaseMaterialsModel):
item_list = [] item_list = []
for root_material_id, container_node in available_material_dict.items(): for root_material_id, container_node in available_material_dict.items():
metadata = container_node.metadata metadata = container_node.metadata
# Skip excluded materials
if metadata["id"] in exclude_materials:
continue
# Only add results for generic materials # Only add results for generic materials
if metadata["brand"].lower() != "generic": if metadata["brand"].lower() != "generic":
continue continue

View File

@ -1153,7 +1153,7 @@ class MachineManager(QObject):
context.context["evaluate_from_container_index"] = _ContainerIndexes.DefinitionChanges context.context["evaluate_from_container_index"] = _ContainerIndexes.DefinitionChanges
material_diameter = extruder.getProperty("material_diameter", "value", context) material_diameter = extruder.getProperty("material_diameter", "value", context)
candidate_materials = self._material_manager.getAvailableMaterials( candidate_materials = self._material_manager.getAvailableMaterials(
self._global_container_stack.definition.getId(), self._global_container_stack.definition,
current_variant_name, current_variant_name,
material_diameter) material_diameter)