diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 0edef9857c..1c767ffda5 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -502,6 +502,7 @@ class CuraApplication(QtApplication): qmlRegisterType(cura.Settings.ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") qmlRegisterType(cura.Settings.ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") + qmlRegisterType(cura.Settings.ProfilesModel, "Cura", 1, 0, "ProfilesModel") qmlRegisterType(cura.Settings.MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler") qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py new file mode 100644 index 0000000000..e7b1743556 --- /dev/null +++ b/cura/Settings/ProfilesModel.py @@ -0,0 +1,58 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Uranium is released under the terms of the AGPLv3 or higher. + +from UM.Application import Application +from UM.Settings.Models.InstanceContainersModel import InstanceContainersModel +from UM.Settings.ContainerRegistry import ContainerRegistry + +from cura.Settings.ExtruderManager import ExtruderManager + +## QML Model for listing the current list of valid quality profiles. +# +class ProfilesModel(InstanceContainersModel): + def __init__(self, parent = None): + super().__init__(parent) + + ## Fetch the list of containers to display. + # + # See UM.Settings.Models.InstanceContainersModel._fetchInstanceContainers(). + def _fetchInstanceContainers(self): + global_container_stack = Application.getInstance().getGlobalContainerStack() + global_machine_definition = global_container_stack.getBottom() + + extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() + if extruder_stacks: + # Multi-extruder machine detected. + + # Determine the common set of quality types which can be + # applied to all of the materials for this machine. + quality_type_dict = self.__fetchQualityTypeDictForStack(global_container_stack, global_machine_definition) + common_quality_types = set(quality_type_dict.keys()) + for stack in extruder_stacks[1:]: + next_quality_type_dict = self.__fetchQualityTypeDictForStack(stack, global_machine_definition) + common_quality_types.intersection_update(set(next_quality_type_dict.keys())) + + return [quality_type_dict[quality_type] for quality_type in common_quality_types] + + else: + # Machine with one extruder. + quality_type_dict = self.__fetchQualityTypeDictForStack(global_container_stack, global_machine_definition) + return list(quality_type_dict.values()) + return [] + + def __fetchQualityTypeDictForStack(self, stack, global_machine_definition): + criteria = {"type": "quality" } + if global_machine_definition.getMetaDataEntry("has_machine_quality", False): + criteria["definition"] = global_machine_definition.getId() + if global_machine_definition.getMetaDataEntry("has_materials", False): + material = stack.findContainer(type="material") + criteria["material"] = material.getId() + else: + criteria["definition"] = "fdmprinter" + + qualities = ContainerRegistry.getInstance().findInstanceContainers(**criteria) + + quality_type_dict = {} + for quality in qualities: + quality_type_dict[quality.getMetaDataEntry("quality_type")] = quality + return quality_type_dict diff --git a/cura/Settings/__init__.py b/cura/Settings/__init__.py index b314b7b842..b5773d560a 100644 --- a/cura/Settings/__init__.py +++ b/cura/Settings/__init__.py @@ -11,4 +11,5 @@ from .MachineManager import MachineManager from .MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler from .SettingOverrideDecorator import SettingOverrideDecorator from .QualitySettingsModel import QualitySettingsModel -from .SettingInheritanceManager import SettingInheritanceManager \ No newline at end of file +from .SettingInheritanceManager import SettingInheritanceManager +from .ProfilesModel import ProfilesModel diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index 1c4137a231..42f0ddd33a 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -13,10 +13,7 @@ Menu Instantiator { - model: UM.InstanceContainersModel - { - filter: menu.getFilter({ "type": "quality" }); - } + model: Cura.ProfilesModel { } MenuItem {