From 6db26eaca5053c5cabace4000a268fa0113b11a3 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Sat, 3 Mar 2018 15:29:49 +0100 Subject: [PATCH] Add getDefaultMaterial() in MaterialManager --- cura/Machines/MaterialManager.py | 23 +++++++++++++++++++++-- cura/Settings/CuraStackBuilder.py | 15 ++------------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py index 5998e8b020..98e4f67f82 100644 --- a/cura/Machines/MaterialManager.py +++ b/cura/Machines/MaterialManager.py @@ -4,17 +4,22 @@ from collections import defaultdict, OrderedDict import copy import uuid -from typing import Optional +from typing import Optional, TYPE_CHECKING from PyQt5.Qt import QTimer, QObject, pyqtSignal, pyqtSlot from UM.Application import Application from UM.Logger import Logger -from UM.Settings import ContainerRegistry +from UM.Settings.ContainerRegistry import ContainerRegistry +from UM.Settings.SettingFunction import SettingFunction +from UM.Util import parseBool from .MaterialNode import MaterialNode from .MaterialGroup import MaterialGroup +if TYPE_CHECKING: + from cura.Settings.GlobalStack import GlobalStack + # # MaterialManager maintains a number of maps and trees for material lookup. @@ -344,6 +349,20 @@ class MaterialManager(QObject): else: return None + def getDefaultMaterial(self, global_stack: "GlobalStack", extruder_variant_name: str) -> Optional["MaterialNode"]: + node = None + machine_definition = global_stack.definition + if parseBool(machine_definition.getMetaDataEntry("has_materials", False)): + material_diameter = machine_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(), extruder_variant_name, + material_diameter, root_material_id) + return node + # # Methods for GUI # diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index efdfa677fc..a8234b9de9 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -71,19 +71,8 @@ class CuraStackBuilder: # get material container for extruders material_container = application.empty_material_container - # Only look for the preferred material if this machine has materials - if parseBool(machine_definition.getMetaDataEntry("has_materials", False)): - material_diameter = machine_definition.getProperty("material_diameter", "value") - if isinstance(material_diameter, SettingFunction): - material_diameter = material_diameter(new_global_stack) - approximate_material_diameter = str(round(material_diameter)) - root_material_id = machine_definition.getMetaDataEntry("preferred_material") - root_material_id = material_manager.getRootMaterialIDForDiameter(root_material_id, approximate_material_diameter) - material_node = material_manager.getMaterialNode(definition_id, extruder_variant_name, material_diameter, root_material_id) - # Sanity check. If you see this error, the related definition files should be fixed. - if not material_node: - raise RuntimeError("Cannot find material with definition [%s], extruder_variant_name [%s], and root_material_id [%s]" % - (definition_id, extruder_variant_name, root_material_id)) + material_node = material_manager.getDefaultMaterial(new_global_stack, extruder_variant_name) + if material_node: material_container = material_node.getContainer() # Create ExtruderStacks