diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 0725c6e48c..150952c4ff 100644 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -504,6 +504,7 @@ class CuraApplication(QtApplication): qmlRegisterType(cura.Settings.ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterType(cura.Settings.ProfilesModel, "Cura", 1, 0, "ProfilesModel") qmlRegisterType(cura.Settings.QualityAndUserProfilesModel, "Cura", 1, 0, "QualityAndUserProfilesModel") + qmlRegisterType(cura.Settings.UserProfilesModel, "Cura", 1, 0, "UserProfilesModel") qmlRegisterType(cura.Settings.MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler") qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") diff --git a/cura/QualityManager.py b/cura/QualityManager.py index fb3a623466..97bb0c271b 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -110,6 +110,49 @@ class QualityManager: result = self._getFilteredContainersForStack(machine_definition, [basic_material], **criteria) return result + ## Find all quality changes for a machine. + # + # \param machine_definition \type{DefinitionContainer} the machine definition. + # \return \type{List[InstanceContainer]} the list of quality changes + def findAllQualityChangesForMachine(self, machine_definition): + if machine_definition.getMetaDataEntry("has_machine_quality"): + definition_id = machine_definition.getId() + else: + definition_id = "fdmprinter" + + filter_dict = { "type": "quality_changes", "extruder": None, "definition": definition_id } + quality_changes_list = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**filter_dict) + return quality_changes_list + + ## Find all usable qualities for a machine and extruders. + # + # Finds all of the qualities for this combination of machine and extruders. + # Only one quality per quality type is returned. i.e. if there are 2 qualities with quality_type=normal + # then only one of then is returned (at random). + # + # \param global_container_stack \type{ContainerStack} the global machine definition + # \param extruder_stacks \type{List[ContainerStack]} the list of extruder stacks + # \return \type{List[InstanceContainer]} the list of the matching qualities + def findAllUsableQualitiesForMachineAndExtruders(self, global_container_stack, extruder_stacks): + global_machine_definition = global_container_stack.getBottom() + + if extruder_stacks: + # Multi-extruder machine detected. + materials = [stack.findContainer(type="material") for stack in extruder_stacks] + else: + # Machine with one extruder. + materials = [global_container_stack.findContainer(type="material")] + + quality_types = self.findAllQualityTypesForMachineAndMaterials(global_machine_definition, materials) + + # Map the list of quality_types to InstanceContainers + qualities = self.findAllQualitiesForMachineMaterial(global_machine_definition, materials[0]) + quality_type_dict = {} + for quality in qualities: + quality_type_dict[quality.getMetaDataEntry("quality_type")] = quality + + return [quality_type_dict[quality_type] for quality_type in quality_types] + ## Fetch a more basic version of a material. # # This tries to find a generic or basic version of the given material. diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 954f8e8ae8..5b82ce9221 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -28,23 +28,5 @@ class ProfilesModel(InstanceContainersModel): if global_container_stack is None: return [] - global_machine_definition = global_container_stack.getBottom() - - extruder_stacks = ExtruderManager.getInstance().getActiveExtruderStacks() - if extruder_stacks: - # Multi-extruder machine detected. - materials = [stack.findContainer(type="material") for stack in extruder_stacks] - else: - # Machine with one extruder. - materials = [global_container_stack.findContainer(type="material")] - - quality_types = QualityManager.getInstance().findAllQualityTypesForMachineAndMaterials(global_machine_definition, - materials) - # Map the list of quality_types to InstanceContainers - qualities = QualityManager.getInstance().findAllQualitiesForMachineMaterial(global_machine_definition, - materials[0]) - quality_type_dict = {} - for quality in qualities: - quality_type_dict[quality.getMetaDataEntry("quality_type")] = quality - - return [quality_type_dict[quality_type] for quality_type in quality_types] + return QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, + ExtruderManager.getInstance().getActiveExtruderStacks()) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index c7e6796e8a..dcb6c698cf 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -1,10 +1,10 @@ # Copyright (c) 2016 Ultimaker B.V. # Cura is released under the terms of the AGPLv3 or higher. from UM.Application import Application -from UM.Settings.ContainerRegistry import ContainerRegistry from cura.QualityManager import QualityManager from cura.Settings.ProfilesModel import ProfilesModel +from cura.Settings.ExtruderManager import ExtruderManager ## QML Model for listing the current list of valid quality and quality changes profiles. # @@ -20,19 +20,17 @@ class QualityAndUserProfilesModel(ProfilesModel): if not global_container_stack: return [] - # Fetch the list of qualities - quality_list = super()._fetchInstanceContainers() - # Fetch the list of quality changes. quality_manager = QualityManager.getInstance() - machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) - if machine_definition.getMetaDataEntry("has_machine_quality"): - definition_id = machine_definition.getId() - else: - definition_id = "fdmprinter" + quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition) - filter_dict = { "type": "quality_changes", "extruder": None, "definition": definition_id } - quality_changes_list = ContainerRegistry.getInstance().findInstanceContainers(**filter_dict) + # Fetch the list of qualities + quality_list = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, + ExtruderManager.getInstance().getActiveExtruderStacks()) - return quality_list + quality_changes_list + # Filter the quality_change by the list of available quality_types + quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) + filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set] + + return quality_list + filtered_quality_changes diff --git a/cura/Settings/UserProfilesModel.py b/cura/Settings/UserProfilesModel.py new file mode 100644 index 0000000000..01b0cdb981 --- /dev/null +++ b/cura/Settings/UserProfilesModel.py @@ -0,0 +1,36 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the AGPLv3 or higher. +from UM.Application import Application + +from cura.QualityManager import QualityManager +from cura.Settings.ProfilesModel import ProfilesModel +from cura.Settings.ExtruderManager import ExtruderManager + +## QML Model for listing the current list of valid quality changes profiles. +# +class UserProfilesModel(ProfilesModel): + 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() + if not global_container_stack: + return [] + + # Fetch the list of quality changes. + quality_manager = QualityManager.getInstance() + machine_definition = quality_manager.getParentMachineDefinition(global_container_stack.getBottom()) + quality_changes_list = quality_manager.findAllQualityChangesForMachine(machine_definition) + + # Fetch the list of qualities + quality_list = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, + ExtruderManager.getInstance().getActiveExtruderStacks()) + + # Filter the quality_change by the list of available quality_types + quality_type_set = set([x.getMetaDataEntry("quality_type") for x in quality_list]) + filtered_quality_changes = [qc for qc in quality_changes_list if qc.getMetaDataEntry("quality_type") in quality_type_set] + + return filtered_quality_changes diff --git a/cura/Settings/__init__.py b/cura/Settings/__init__.py index 0fb2ef611c..a28073fa7f 100644 --- a/cura/Settings/__init__.py +++ b/cura/Settings/__init__.py @@ -14,3 +14,4 @@ from .QualitySettingsModel import QualitySettingsModel from .SettingInheritanceManager import SettingInheritanceManager from .ProfilesModel import ProfilesModel from .QualityAndUserProfilesModel import QualityAndUserProfilesModel +from .UserProfilesModel import UserProfilesModel diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index 42f0ddd33a..1cb97153dd 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -33,13 +33,8 @@ Menu Instantiator { id: customProfileInstantiator - model: UM.InstanceContainersModel + model: Cura.UserProfilesModel { - filter: ({ - "type": "quality_changes", - "extruder": null, - "definition": Cura.MachineManager.filterQualityByMachine ? Cura.MachineManager.activeQualityDefinitionId : "fdmprinter" - }) onModelReset: customSeparator.visible = rowCount() > 0 }