Fixed up the profiles menu to handle multiple extruders better.

Contributes to CURA-2477 Profile menu should only contain valid options for all materials
This commit is contained in:
Simon Edwards 2016-09-28 15:11:31 +02:00
parent 299d05fa71
commit a7c58c33f7
4 changed files with 62 additions and 5 deletions

View file

@ -502,6 +502,7 @@ class CuraApplication(QtApplication):
qmlRegisterType(cura.Settings.ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") qmlRegisterType(cura.Settings.ExtrudersModel, "Cura", 1, 0, "ExtrudersModel")
qmlRegisterType(cura.Settings.ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") 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.MaterialSettingsVisibilityHandler, "Cura", 1, 0, "MaterialSettingsVisibilityHandler")
qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel") qmlRegisterType(cura.Settings.QualitySettingsModel, "Cura", 1, 0, "QualitySettingsModel")

View file

@ -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

View file

@ -12,3 +12,4 @@ from .MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler
from .SettingOverrideDecorator import SettingOverrideDecorator from .SettingOverrideDecorator import SettingOverrideDecorator
from .QualitySettingsModel import QualitySettingsModel from .QualitySettingsModel import QualitySettingsModel
from .SettingInheritanceManager import SettingInheritanceManager from .SettingInheritanceManager import SettingInheritanceManager
from .ProfilesModel import ProfilesModel

View file

@ -13,10 +13,7 @@ Menu
Instantiator Instantiator
{ {
model: UM.InstanceContainersModel model: Cura.ProfilesModel { }
{
filter: menu.getFilter({ "type": "quality" });
}
MenuItem MenuItem
{ {