From 4abbd4b9887fc3e3d98ebf06481d2b21a9e9be0e Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 13:19:28 +0100 Subject: [PATCH 1/5] Show custom qualities based on not supported CURA-4796 --- cura/QualityManager.py | 3 +++ cura/Settings/ProfilesModel.py | 18 ++++++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/cura/QualityManager.py b/cura/QualityManager.py index 76a0c86a5f..d984bd17a1 100644 --- a/cura/QualityManager.py +++ b/cura/QualityManager.py @@ -136,6 +136,9 @@ class QualityManager: if basic_materials: result = self._getFilteredContainersForStack(machine_definition, basic_materials, **criteria) + empty_quality = ContainerRegistry.getInstance().findInstanceContainers(id = "empty_quality")[0] + result.append(empty_quality) + return result ## Find all quality changes for a machine. diff --git a/cura/Settings/ProfilesModel.py b/cura/Settings/ProfilesModel.py index 3b43e2740a..cf58a49905 100644 --- a/cura/Settings/ProfilesModel.py +++ b/cura/Settings/ProfilesModel.py @@ -36,6 +36,8 @@ class ProfilesModel(InstanceContainersModel): Application.getInstance().getMachineManager().activeStackChanged.connect(self._update) Application.getInstance().getMachineManager().activeMaterialChanged.connect(self._update) + self._empty_quality = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] + # Factory function, used by QML @staticmethod def createProfilesModel(engine, js_engine): @@ -72,11 +74,18 @@ class ProfilesModel(InstanceContainersModel): # The actual list of quality profiles come from the first extruder in the extruder list. result = QualityManager.getInstance().findAllUsableQualitiesForMachineAndExtruders(global_container_stack, extruder_stacks) + # append empty quality if it's not there + if not any(q.getId() == self._empty_quality.getId() for q in result): + result.append(self._empty_quality) + # The usable quality types are set quality_type_set = set([x.getMetaDataEntry("quality_type") for x in result]) # Fetch all qualities available for this machine and the materials selected in extruders all_qualities = QualityManager.getInstance().findAllQualitiesForMachineAndMaterials(global_stack_definition, materials) + # append empty quality if it's not there + if not any(q.getId() == self._empty_quality.getId() for q in all_qualities): + all_qualities.append(self._empty_quality) # If in the all qualities there is some of them that are not available due to incompatibility with materials # we also add it so that they will appear in the slide quality bar. However in recomputeItems will be marked as @@ -85,13 +94,7 @@ class ProfilesModel(InstanceContainersModel): if quality.getMetaDataEntry("quality_type") not in quality_type_set: result.append(quality) - # if still profiles are found, add a single empty_quality ("Not supported") instance to the drop down list - if len(result) == 0: - # If not qualities are found we dynamically create a not supported container for this machine + material combination - not_supported_container = ContainerRegistry.getInstance().findContainers(id = "empty_quality")[0] - result.append(not_supported_container) - - return {item.getId():item for item in result}, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. + return {item.getId(): item for item in result}, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. ## Re-computes the items in this model, and adds the layer height role. def _recomputeItems(self): @@ -114,7 +117,6 @@ class ProfilesModel(InstanceContainersModel): # active machine and material, and later yield the right ones. tmp_all_quality_items = OrderedDict() for item in super()._recomputeItems(): - profiles = container_registry.findContainersMetadata(id = item["id"]) if not profiles or "quality_type" not in profiles[0]: quality_type = "" From 1d104f367d1e23e8f99ee56066a951e279fbf797 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 13:20:10 +0100 Subject: [PATCH 2/5] Do not show not supported in profile manager CURA-4796 --- cura/Settings/QualityAndUserProfilesModel.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index bc81df976b..d6a9b3f719 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -42,5 +42,7 @@ class QualityAndUserProfilesModel(ProfilesModel): qc.getMetaDataEntry("extruder") == active_extruder.definition.getId())} result = filtered_quality_changes - result.update({q.getId():q for q in quality_list}) + for q in quality_list: + if q.getId() != "empty_quality": + result[q.getId()] = q return result, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. \ No newline at end of file From a3c26356485ac350b7da1622188d46ae8a267c82 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 14:22:28 +0100 Subject: [PATCH 3/5] Fix profile manager to support not supported custom profiles CURA-4796 Profile manager should be able to show custom profiles that are based on the not supported profile correctly. --- cura/CuraApplication.py | 1 + cura/Settings/QualityAndUserProfilesModel.py | 2 +- cura/Settings/QualitySettingsModel.py | 123 ++++++++++--------- resources/qml/Preferences/ProfilesPage.qml | 4 +- 4 files changed, 70 insertions(+), 60 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 756dae2704..53b65e3d1b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -805,6 +805,7 @@ class CuraApplication(QtApplication): qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") + qmlRegisterType(InstanceContainer, "Cura", 1, 0, "InstanceContainer") qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel) diff --git a/cura/Settings/QualityAndUserProfilesModel.py b/cura/Settings/QualityAndUserProfilesModel.py index d6a9b3f719..8396e62417 100644 --- a/cura/Settings/QualityAndUserProfilesModel.py +++ b/cura/Settings/QualityAndUserProfilesModel.py @@ -45,4 +45,4 @@ class QualityAndUserProfilesModel(ProfilesModel): for q in quality_list: if q.getId() != "empty_quality": result[q.getId()] = q - return result, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. \ No newline at end of file + return result, {} #Only return true profiles for now, no metadata. The quality manager is not able to get only metadata yet. diff --git a/cura/Settings/QualitySettingsModel.py b/cura/Settings/QualitySettingsModel.py index 243fd146dc..0e17237ff7 100644 --- a/cura/Settings/QualitySettingsModel.py +++ b/cura/Settings/QualitySettingsModel.py @@ -1,8 +1,6 @@ # Copyright (c) 2017 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -import collections - from PyQt5.QtCore import pyqtProperty, pyqtSignal, Qt from UM.Logger import Logger @@ -42,6 +40,8 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): self.addRoleName(self.UserValueRole, "user_value") self.addRoleName(self.CategoryRole, "category") + self._empty_quality = self._container_registry.findInstanceContainers(id = "empty_quality")[0] + def setExtruderId(self, extruder_id): if extruder_id != self._extruder_id: self._extruder_id = extruder_id @@ -107,77 +107,87 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): else: quality_changes_container = containers[0] - criteria = { - "type": "quality", - "quality_type": quality_changes_container.getMetaDataEntry("quality_type"), - "definition": quality_changes_container.getDefinition().getId() - } + if quality_changes_container.getMetaDataEntry("quality_type") == "not_supported": + quality_container = self._empty_quality + else: + criteria = { + "type": "quality", + "quality_type": quality_changes_container.getMetaDataEntry("quality_type"), + "definition": quality_changes_container.getDefinition().getId() + } - quality_container = self._container_registry.findInstanceContainers(**criteria) - if not quality_container: - Logger.log("w", "Could not find a quality container matching quality changes %s", quality_changes_container.getId()) - return - quality_container = quality_container[0] + quality_container = self._container_registry.findInstanceContainers(**criteria) + if not quality_container: + Logger.log("w", "Could not find a quality container matching quality changes %s", quality_changes_container.getId()) + return + + quality_container = quality_container[0] quality_type = quality_container.getMetaDataEntry("quality_type") - definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(quality_container.getDefinition()) - definition = quality_container.getDefinition() - # Check if the definition container has a translation file. - definition_suffix = ContainerRegistry.getMimeTypeForContainer(type(definition)).preferredSuffix - catalog = i18nCatalog(os.path.basename(definition_id + "." + definition_suffix)) - if catalog.hasTranslationLoaded(): - self._i18n_catalog = catalog + if quality_type == "not_supported": + containers = [] + else: + definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(quality_container.getDefinition()) + definition = quality_container.getDefinition() - for file_name in quality_container.getDefinition().getInheritedFiles(): - catalog = i18nCatalog(os.path.basename(file_name)) + # Check if the definition container has a translation file. + definition_suffix = ContainerRegistry.getMimeTypeForContainer(type(definition)).preferredSuffix + catalog = i18nCatalog(os.path.basename(definition_id + "." + definition_suffix)) if catalog.hasTranslationLoaded(): self._i18n_catalog = catalog - criteria = {"type": "quality", "quality_type": quality_type, "definition": definition_id} + for file_name in quality_container.getDefinition().getInheritedFiles(): + catalog = i18nCatalog(os.path.basename(file_name)) + if catalog.hasTranslationLoaded(): + self._i18n_catalog = catalog - if self._material_id and self._material_id != "empty_material": - criteria["material"] = self._material_id + criteria = {"type": "quality", "quality_type": quality_type, "definition": definition_id} - criteria["extruder"] = self._extruder_id + if self._material_id and self._material_id != "empty_material": + criteria["material"] = self._material_id - containers = self._container_registry.findInstanceContainers(**criteria) - if not containers: - # Try again, this time without extruder - new_criteria = criteria.copy() - new_criteria.pop("extruder") - containers = self._container_registry.findInstanceContainers(**new_criteria) + criteria["extruder"] = self._extruder_id - if not containers and "material" in criteria: - # Try again, this time without material - criteria.pop("material", None) containers = self._container_registry.findInstanceContainers(**criteria) + if not containers: + # Try again, this time without extruder + new_criteria = criteria.copy() + new_criteria.pop("extruder") + containers = self._container_registry.findInstanceContainers(**new_criteria) - if not containers: - # Try again, this time without material or extruder - criteria.pop("extruder") # "material" has already been popped - containers = self._container_registry.findInstanceContainers(**criteria) + if not containers and "material" in criteria: + # Try again, this time without material + criteria.pop("material", None) + containers = self._container_registry.findInstanceContainers(**criteria) - if not containers: - Logger.log("w", "Could not find any quality containers matching the search criteria %s" % str(criteria)) - return + if not containers: + # Try again, this time without material or extruder + criteria.pop("extruder") # "material" has already been popped + containers = self._container_registry.findInstanceContainers(**criteria) + + if not containers: + Logger.log("w", "Could not find any quality containers matching the search criteria %s" % str(criteria)) + return if quality_changes_container: - criteria = {"type": "quality_changes", "quality_type": quality_type, "definition": definition_id, "name": quality_changes_container.getName()} - if self._extruder_definition_id != "": - extruder_definitions = self._container_registry.findDefinitionContainers(id = self._extruder_definition_id) - if extruder_definitions: - criteria["extruder"] = Application.getInstance().getMachineManager().getQualityDefinitionId(extruder_definitions[0]) - criteria["name"] = quality_changes_container.getName() + if quality_type == "not_supported": + criteria = {"type": "quality_changes", "quality_type": quality_type, "name": quality_changes_container.getName()} else: - criteria["extruder"] = None + criteria = {"type": "quality_changes", "quality_type": quality_type, "definition": definition_id, "name": quality_changes_container.getName()} + if self._extruder_definition_id != "": + extruder_definitions = self._container_registry.findDefinitionContainers(id = self._extruder_definition_id) + if extruder_definitions: + criteria["extruder"] = Application.getInstance().getMachineManager().getQualityDefinitionId(extruder_definitions[0]) + criteria["name"] = quality_changes_container.getName() + else: + criteria["extruder"] = None changes = self._container_registry.findInstanceContainers(**criteria) if changes: containers.extend(changes) global_container_stack = Application.getInstance().getGlobalContainerStack() - is_multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1 current_category = "" for definition in definition_container.findDefinitions(): @@ -213,15 +223,14 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel): if profile_value is None and user_value is None: continue - if is_multi_extrusion: - settable_per_extruder = global_container_stack.getProperty(definition.key, "settable_per_extruder") - # If a setting is not settable per extruder (global) and we're looking at an extruder tab, don't show this value. - if self._extruder_id != "" and not settable_per_extruder: - continue + settable_per_extruder = global_container_stack.getProperty(definition.key, "settable_per_extruder") + # If a setting is not settable per extruder (global) and we're looking at an extruder tab, don't show this value. + if self._extruder_id != "" and not settable_per_extruder: + continue - # If a setting is settable per extruder (not global) and we're looking at global tab, don't show this value. - if self._extruder_id == "" and settable_per_extruder: - continue + # If a setting is settable per extruder (not global) and we're looking at global tab, don't show this value. + if self._extruder_id == "" and settable_per_extruder: + continue label = definition.label if self._i18n_catalog: diff --git a/resources/qml/Preferences/ProfilesPage.qml b/resources/qml/Preferences/ProfilesPage.qml index e3ba9b23a4..5e040cdba2 100644 --- a/resources/qml/Preferences/ProfilesPage.qml +++ b/resources/qml/Preferences/ProfilesPage.qml @@ -213,8 +213,8 @@ UM.ManagementPage ProfileTab { title: catalog.i18nc("@title:tab", "Global Settings"); - quality: base.currentItem != null ? base.currentItem.id : ""; - material: Cura.MachineManager.allActiveMaterialIds[Cura.MachineManager.activeMachineId] + quality: Cura.MachineManager.activeMachine.qualityChanges.id + material: Cura.MachineManager.activeMachine.material.id } Repeater From 03bd4d8d22f8fb92d028c45838a6f8be4c8174a4 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 15 Jan 2018 14:28:16 +0100 Subject: [PATCH 4/5] Fix profile menu text for custom profiles based on not supported CURA-4796 --- resources/qml/Settings/SettingView.qml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 6929614830..8cecd81099 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -63,11 +63,9 @@ Item menu: ProfileMenu { } function generateActiveQualityText () { - var result = catalog.i18nc("@", "No Profile Available") // default text + result = Cura.MachineManager.activeQualityName if (Cura.MachineManager.isActiveQualitySupported ) { - result = Cura.MachineManager.activeQualityName - if (Cura.MachineManager.activeQualityLayerHeight > 0) { result += " " result += " - " From 5280501660e3ad6ded329f6263aa0df2f2e5bcf3 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 15 Jan 2018 14:40:01 +0100 Subject: [PATCH 5/5] Fix for CURA-4789 `deleteAll()` within `CuraApplication.py` used to only delete all scene nodes but now also resets the print information, as deleting all scene nodes _should_ do that by default. Timer now resets to 0, and project name is reset. --- cura/CuraApplication.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 53b65e3d1b..428a26f956 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -647,10 +647,10 @@ class CuraApplication(QtApplication): if parsed_args["help"]: parser.print_help() sys.exit(0) - + def run(self): self.preRun() - + self.showSplashMessage(self._i18n_catalog.i18nc("@info:progress", "Setting up scene...")) self._setUpSingleInstanceServer() @@ -1060,6 +1060,9 @@ class CuraApplication(QtApplication): op.push() Selection.clear() + Logger.log("i", "Reseting print information") + self._print_information = PrintInformation.PrintInformation() + self.getCuraSceneController().setActiveBuildPlate(0) # Select first build plate ## Reset all translation on nodes with mesh data.