From 54d07ae29bc63a731d1a13d0eb6eb210d3841d82 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 28 Sep 2016 14:20:58 +0200 Subject: [PATCH 1/3] Fix error when no machine is active --- cura/PrintInformation.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index e992b14e06..b65101ecc7 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -130,7 +130,12 @@ class PrintInformation(QObject): ## Created an acronymn-like abbreviated machine name from the currently active machine name # Called each time the global stack is switched def _setAbbreviatedMachineName(self): - global_stack_name = Application.getInstance().getGlobalContainerStack().getName() + global_container_stack = Application.getInstance().getGlobalContainerStack() + if not global_container_stack: + self._abbr_machine = "" + return + + global_stack_name = global_container_stack.getName() split_name = global_stack_name.split(" ") abbr_machine = "" for word in split_name: From 299d05fa713ec59484a4c2ce459f8599227a093a Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 28 Sep 2016 14:23:29 +0200 Subject: [PATCH 2/3] Prepend extruder id to extruder quality profiles extruder quality profiles are not shown to the user, so the prepended extruder id is never visible. This way imported profiles behave the same way as normally created profiles. CURA-2478 --- cura/Settings/CuraContainerRegistry.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 17baca305d..460d7ba6c8 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -144,17 +144,18 @@ class CuraContainerRegistry(ContainerRegistry): self._configureProfile(profile, name_seed) return { "status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile.getName()) } else: - new_name = self.createUniqueName("quality_changes", "", name_seed, catalog.i18nc("@label", "Custom profile")) for profile in profile_or_list: + extruder_id = profile.getMetaDataEntry("extruder") + if extruder_id: + profile_name = "%s_%s" % (extruder_id, name_seed) + else: + profile_name = name_seed + new_name = self.createUniqueName("quality_changes", "", profile_name, catalog.i18nc("@label", "Custom profile")) profile.setDirty(True) # Ensure the profiles are correctly saved - self._configureProfile(profile, name_seed) + self._configureProfile(profile, profile_name) profile.setName(new_name) - if len(profile_or_list) == 1: - return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())} - else: - profile_names = ", ".join([profile.getName() for profile in profile_or_list]) - return { "status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profiles {0}", profile_names) } + return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())} #If it hasn't returned by now, none of the plugins loaded the profile successfully. return { "status": "error", "message": catalog.i18nc("@info:status", "Profile {0} has an unknown file type.", file_name)} From a7c58c33f7a1d05bd776d61a53ec33f67f1ca0f1 Mon Sep 17 00:00:00 2001 From: Simon Edwards Date: Wed, 28 Sep 2016 15:11:31 +0200 Subject: [PATCH 3/3] Fixed up the profiles menu to handle multiple extruders better. Contributes to CURA-2477 Profile menu should only contain valid options for all materials --- cura/CuraApplication.py | 1 + cura/Settings/ProfilesModel.py | 58 +++++++++++++++++++++++++++++ cura/Settings/__init__.py | 3 +- resources/qml/Menus/ProfileMenu.qml | 5 +-- 4 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 cura/Settings/ProfilesModel.py 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 {