From 7b83e51439461643df121cd7985b3d8dd4193ded Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 22 Aug 2019 15:04:20 +0200 Subject: [PATCH] Use container tree to determine default material Using the new architecture here. Contributes to issue CURA-6600. --- cura/Machines/MachineNode.py | 1 + cura/Machines/MaterialManager.py | 40 +++++++++++++------------------- 2 files changed, 17 insertions(+), 24 deletions(-) diff --git a/cura/Machines/MachineNode.py b/cura/Machines/MachineNode.py index 840c49ff08..5fd01ac2d5 100644 --- a/cura/Machines/MachineNode.py +++ b/cura/Machines/MachineNode.py @@ -36,6 +36,7 @@ class MachineNode(ContainerNode): self.quality_definition = my_metadata.get("quality_definition", container_id) self.exclude_materials = my_metadata.get("exclude_materials", []) self.preferred_variant_name = my_metadata.get("preferred_variant_name", "") + self.preferred_material = my_metadata.get("preferred_material", "") self.preferred_quality_type = my_metadata.get("preferred_quality_type", "") self._loadAll() diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py index c6901d904c..85cdc17b61 100644 --- a/cura/Machines/MaterialManager.py +++ b/cura/Machines/MaterialManager.py @@ -227,34 +227,26 @@ class MaterialManager(QObject): # you can provide the extruder_definition and then the position is ignored (useful when building up global stack in CuraStackBuilder) def getDefaultMaterial(self, global_stack: "GlobalStack", position: str, nozzle_name: Optional[str], extruder_definition: Optional["DefinitionContainer"] = None) -> Optional["MaterialNode"]: - node = None + if not parseBool(global_stack.getMetaDataEntry("has_materials", False)): + return None - buildplate_name = global_stack.getBuildplateName() - machine_definition = global_stack.definition + definition_id = global_stack.definition.getId() + machine_node = ContainerTree.getInstance().machines[definition_id] - # The extruder-compatible material diameter in the extruder definition may not be the correct value because - # the user can change it in the definition_changes container. - if extruder_definition is None: - extruder_stack_or_definition = global_stack.extruders[position] - is_extruder_stack = True + if extruder_definition is not None: + material_diameter = extruder_definition.getProperty("material_diameter", "value") else: - extruder_stack_or_definition = extruder_definition - is_extruder_stack = False + material_diameter = global_stack.extruders[position].getCompatibleMaterialDiameter() + approximate_material_diameter = round(material_diameter) - if extruder_stack_or_definition and parseBool(global_stack.getMetaDataEntry("has_materials", False)): - if is_extruder_stack: - material_diameter = extruder_stack_or_definition.getCompatibleMaterialDiameter() - else: - material_diameter = extruder_stack_or_definition.getProperty("material_diameter", "value") - - if isinstance(material_diameter, SettingFunction): - material_diameter = material_diameter(global_stack) - approximate_material_diameter = str(round(material_diameter)) - root_material_id = machine_definition.getMetaDataEntry("preferred_material") - root_material_id = self.getRootMaterialIDForDiameter(root_material_id, approximate_material_diameter) - node = self.getMaterialNode(machine_definition.getId(), nozzle_name, buildplate_name, - material_diameter, root_material_id) - return node + if nozzle_name not in machine_node.variants: + Logger.log("w", "Could not find variant {nozzle_name} for machine with definition {definition_id} in the container tree".format(nozzle_name = nozzle_name, definition_id = definition_id)) + return None + available_materials = machine_node.variants[nozzle_name].materials + for base_material, material_node in available_materials.items(): + if machine_node.preferred_material in base_material and approximate_material_diameter == int(material_node.getMetaDataEntry("approximate_diameter")): + return material_node + return None def removeMaterialByRootId(self, root_material_id: str): container_registry = CuraContainerRegistry.getInstance()