diff --git a/cura/Machines/MachineTools.py b/cura/Machines/MachineTools.py new file mode 100644 index 0000000000..91daa2490b --- /dev/null +++ b/cura/Machines/MachineTools.py @@ -0,0 +1,25 @@ +from UM.Util import parseBool + + +# +# Gets the machine definition ID that can be used to search for Quality containers that are suitable for the given +# machine. The rule is as follows: +# 1. By default, the machine definition ID for quality container search will be "fdmprinter", which is the generic +# machine. +# 2. If a machine has its own machine quality (with "has_machine_quality = True"), we should use the given machine's +# own machine definition ID for quality search. +# Example: for an Ultimaker 3, the definition ID should be "ultimaker3". +# 3. When condition (2) is met, AND the machine has "quality_definition" defined in its definition file, then the +# definition ID specified in "quality_definition" should be used. +# Example: for an Ultimaker 3 Extended, it has "quality_definition = ultimaker3". This means Ultimaker 3 Extended +# shares the same set of qualities profiles as Ultimaker 3. +# +def getMachineDefinitionIDForQualitySearch(machine: "GlobalStack", default_definition_id: str = "fdmprinter") -> str: + machine_definition_id = default_definition_id + if parseBool(machine.getMetaDataEntry("has_machine_quality", False)): + # Only use the machine's own quality definition ID if this machine has machine quality. + machine_definition_id = machine.getMetaDataEntry("quality_definition") + if machine_definition_id is None: + machine_definition_id = machine.definition.getId() + + return machine_definition_id diff --git a/cura/Machines/QualityManager.py b/cura/Machines/QualityManager.py index ad4fa6fc8f..cb723f41d0 100644 --- a/cura/Machines/QualityManager.py +++ b/cura/Machines/QualityManager.py @@ -1,14 +1,14 @@ from typing import Optional -from PyQt5.Qt import pyqtSignal, QObject +from PyQt5.Qt import QObject from UM.Application import Application from UM.Logger import Logger -from UM.Settings.InstanceContainer import InstanceContainer from UM.Util import parseBool from cura.Machines.ContainerGroup import ContainerGroup from cura.Machines.ContainerNode import ContainerNode +from cura.Machines.MachineTools import getMachineDefinitionIDForQualitySearch # @@ -114,12 +114,12 @@ class QualityManager(QObject): def __init__(self, container_registry, parent = None): super().__init__(parent) - - self._material_manager = Application.getInstance()._material_manager - + self._application = Application.getInstance() + self._material_manager = self._application._material_manager self._container_registry = container_registry - self._empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0] - #self._empty_quality_changes_container = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0] + + self._empty_quality_container = self._application.empty_quality_container + self._empty_quality_changes_container = self._application.empty_quality_changes_container self._machine_variant_material_quality_type_to_quality_dict = {} # for quality lookup self._machine_quality_type_to_quality_changes_dict = {} # for quality_changes lookup @@ -229,12 +229,8 @@ class QualityManager(QObject): # Returns a dict of "custom profile name" -> QualityChangesGroup def getQualityChangesGroups(self, machine: "GlobalStack") -> dict: # TODO: How to make this simpler? - # Get machine definition ID - machine_definition_id = self._default_machine_definition_id - if parseBool(machine.getMetaDataEntry("has_machine_quality", False)): - machine_definition_id = machine.getMetaDataEntry("quality_definition") - if machine_definition_id is None: - machine_definition_id = machine.definition.getId() + # Get machine definition ID for quality search + machine_definition_id = getMachineDefinitionIDForQualitySearch(machine) machine_node = self._machine_quality_type_to_quality_changes_dict.get(machine_definition_id) if not machine_node: @@ -257,12 +253,8 @@ class QualityManager(QObject): def getQualityGroups(self, machine: "GlobalStack") -> dict: # TODO: How to make this simpler, including the fall backs. - # Get machine definition ID - machine_definition_id = self._default_machine_definition_id - if parseBool(machine.getMetaDataEntry("has_machine_quality", False)): - machine_definition_id = machine.getMetaDataEntry("quality_definition") - if machine_definition_id is None: - machine_definition_id = machine.definition.getId() + # Get machine definition ID for quality search + machine_definition_id = getMachineDefinitionIDForQualitySearch(machine) # To find the quality container for the GlobalStack, check in the following fall-back manner: # (1) the machine-specific node diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 365658ee48..19a5caacb8 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. from UM.Logger import Logger @@ -206,9 +206,8 @@ class CuraStackBuilder: return container - @classmethod - def createDefinitionChangesContainer(cls, container_stack, container_name, container_index = None): + def createDefinitionChangesContainer(cls, container_stack, container_name): from cura.CuraApplication import CuraApplication unique_container_name = ContainerRegistry.getInstance().uniqueName(container_name)