diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py index ff666f392d..cc4c99343b 100644 --- a/cura/Machines/MaterialManager.py +++ b/cura/Machines/MaterialManager.py @@ -412,11 +412,15 @@ class MaterialManager(QObject): else: return None - def getDefaultMaterial(self, global_stack: "GlobalStack", extruder_variant_name: Optional[str]) -> Optional["MaterialNode"]: + ## Get default material for given global stack, extruder position and extruder variant name + # 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, extruder_variant_name: Optional[str], extruder_definition: Optional["ExtruderStack"] = None) -> Optional["MaterialNode"]: node = None machine_definition = global_stack.definition + if extruder_definition is None: + extruder_definition = global_stack.extruders[position].definition if parseBool(global_stack.getMetaDataEntry("has_materials", False)): - material_diameter = machine_definition.getProperty("material_diameter", "value") + material_diameter = extruder_definition.getProperty("material_diameter", "value") if isinstance(material_diameter, SettingFunction): material_diameter = material_diameter(global_stack) approximate_material_diameter = str(round(material_diameter)) diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 85514006b5..e593c3d349 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -72,12 +72,6 @@ class CuraStackBuilder: ) new_global_stack.setName(generated_name) - # get material container for extruders - material_container = application.empty_material_container - material_node = material_manager.getDefaultMaterial(new_global_stack, extruder_variant_name) - if material_node and material_node.getContainer(): - material_container = material_node.getContainer() - # Create ExtruderStacks extruder_dict = machine_definition.getMetaDataEntry("machine_extruder_trains") @@ -90,6 +84,12 @@ class CuraStackBuilder: ConfigurationErrorMessage.getInstance().addFaultyContainers(extruder_definition_id) return None #Don't return any container stack then, not the rest of the extruders either. + # get material container for extruders + material_container = application.empty_material_container + material_node = material_manager.getDefaultMaterial(new_global_stack, position, extruder_variant_name, extruder_definition = extruder_definition) + if material_node and material_node.getContainer(): + material_container = material_node.getContainer() + new_extruder_id = registry.uniqueName(extruder_definition_id) new_extruder = cls.createExtruderStack( new_extruder_id, diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 1039085cf3..c615165046 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1241,7 +1241,7 @@ class MachineManager(QObject): continue # The current material is not available, find the preferred one - material_node = self._material_manager.getDefaultMaterial(self._global_container_stack, current_variant_name) + material_node = self._material_manager.getDefaultMaterial(self._global_container_stack, position, current_variant_name) if material_node is not None: self._setMaterial(position, material_node) diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py index 4c459e69cf..6fb582789e 100755 --- a/plugins/MachineSettingsAction/MachineSettingsAction.py +++ b/plugins/MachineSettingsAction/MachineSettingsAction.py @@ -141,7 +141,6 @@ class MachineSettingsAction(MachineAction): # Set the material container for each extruder to a sane default material_manager = self._application.getMaterialManager() - material_node = material_manager.getDefaultMaterial(self._global_container_stack, None) else: # The metadata entry is stored in an ini, and ini files are parsed as strings only. @@ -151,6 +150,8 @@ class MachineSettingsAction(MachineAction): # set materials for position in extruder_positions: + if has_materials: + material_node = material_manager.getDefaultMaterial(self._global_container_stack, position, None) machine_manager.setMaterial(position, material_node) self._application.globalContainerStackChanged.emit()