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.
This commit is contained in:
Lipu Fei 2018-01-15 14:22:28 +01:00
parent 1d104f367d
commit a3c2635648
4 changed files with 70 additions and 60 deletions

View File

@ -805,6 +805,7 @@ class CuraApplication(QtApplication):
qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type") qmlRegisterUncreatableType(CuraApplication, "Cura", 1, 0, "ResourceTypes", "Just an Enum type")
qmlRegisterType(InstanceContainer, "Cura", 1, 0, "InstanceContainer")
qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel") qmlRegisterType(ExtrudersModel, "Cura", 1, 0, "ExtrudersModel")
qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel") qmlRegisterType(ContainerSettingsModel, "Cura", 1, 0, "ContainerSettingsModel")
qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel) qmlRegisterSingletonType(ProfilesModel, "Cura", 1, 0, "ProfilesModel", ProfilesModel.createProfilesModel)

View File

@ -1,8 +1,6 @@
# Copyright (c) 2017 Ultimaker B.V. # Copyright (c) 2017 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
import collections
from PyQt5.QtCore import pyqtProperty, pyqtSignal, Qt from PyQt5.QtCore import pyqtProperty, pyqtSignal, Qt
from UM.Logger import Logger from UM.Logger import Logger
@ -42,6 +40,8 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
self.addRoleName(self.UserValueRole, "user_value") self.addRoleName(self.UserValueRole, "user_value")
self.addRoleName(self.CategoryRole, "category") self.addRoleName(self.CategoryRole, "category")
self._empty_quality = self._container_registry.findInstanceContainers(id = "empty_quality")[0]
def setExtruderId(self, extruder_id): def setExtruderId(self, extruder_id):
if extruder_id != self._extruder_id: if extruder_id != self._extruder_id:
self._extruder_id = extruder_id self._extruder_id = extruder_id
@ -107,77 +107,87 @@ class QualitySettingsModel(UM.Qt.ListModel.ListModel):
else: else:
quality_changes_container = containers[0] quality_changes_container = containers[0]
criteria = { if quality_changes_container.getMetaDataEntry("quality_type") == "not_supported":
"type": "quality", quality_container = self._empty_quality
"quality_type": quality_changes_container.getMetaDataEntry("quality_type"), else:
"definition": quality_changes_container.getDefinition().getId() criteria = {
} "type": "quality",
"quality_type": quality_changes_container.getMetaDataEntry("quality_type"),
"definition": quality_changes_container.getDefinition().getId()
}
quality_container = self._container_registry.findInstanceContainers(**criteria) quality_container = self._container_registry.findInstanceContainers(**criteria)
if not quality_container: if not quality_container:
Logger.log("w", "Could not find a quality container matching quality changes %s", quality_changes_container.getId()) Logger.log("w", "Could not find a quality container matching quality changes %s", quality_changes_container.getId())
return return
quality_container = quality_container[0]
quality_container = quality_container[0]
quality_type = quality_container.getMetaDataEntry("quality_type") 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. if quality_type == "not_supported":
definition_suffix = ContainerRegistry.getMimeTypeForContainer(type(definition)).preferredSuffix containers = []
catalog = i18nCatalog(os.path.basename(definition_id + "." + definition_suffix)) else:
if catalog.hasTranslationLoaded(): definition_id = Application.getInstance().getMachineManager().getQualityDefinitionId(quality_container.getDefinition())
self._i18n_catalog = catalog definition = quality_container.getDefinition()
for file_name in quality_container.getDefinition().getInheritedFiles(): # Check if the definition container has a translation file.
catalog = i18nCatalog(os.path.basename(file_name)) definition_suffix = ContainerRegistry.getMimeTypeForContainer(type(definition)).preferredSuffix
catalog = i18nCatalog(os.path.basename(definition_id + "." + definition_suffix))
if catalog.hasTranslationLoaded(): if catalog.hasTranslationLoaded():
self._i18n_catalog = catalog 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 = {"type": "quality", "quality_type": quality_type, "definition": definition_id}
criteria["material"] = self._material_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) criteria["extruder"] = self._extruder_id
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 and "material" in criteria:
# Try again, this time without material
criteria.pop("material", None)
containers = self._container_registry.findInstanceContainers(**criteria) 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: if not containers and "material" in criteria:
# Try again, this time without material or extruder # Try again, this time without material
criteria.pop("extruder") # "material" has already been popped criteria.pop("material", None)
containers = self._container_registry.findInstanceContainers(**criteria) containers = self._container_registry.findInstanceContainers(**criteria)
if not containers: if not containers:
Logger.log("w", "Could not find any quality containers matching the search criteria %s" % str(criteria)) # Try again, this time without material or extruder
return 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: if quality_changes_container:
criteria = {"type": "quality_changes", "quality_type": quality_type, "definition": definition_id, "name": quality_changes_container.getName()} if quality_type == "not_supported":
if self._extruder_definition_id != "": criteria = {"type": "quality_changes", "quality_type": quality_type, "name": quality_changes_container.getName()}
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: 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) changes = self._container_registry.findInstanceContainers(**criteria)
if changes: if changes:
containers.extend(changes) containers.extend(changes)
global_container_stack = Application.getInstance().getGlobalContainerStack() global_container_stack = Application.getInstance().getGlobalContainerStack()
is_multi_extrusion = global_container_stack.getProperty("machine_extruder_count", "value") > 1
current_category = "" current_category = ""
for definition in definition_container.findDefinitions(): 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: if profile_value is None and user_value is None:
continue continue
if is_multi_extrusion: settable_per_extruder = global_container_stack.getProperty(definition.key, "settable_per_extruder")
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 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:
if self._extruder_id != "" and not settable_per_extruder: continue
continue
# If a setting is settable per extruder (not global) and we're looking at global tab, don't show this value. # 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: if self._extruder_id == "" and settable_per_extruder:
continue continue
label = definition.label label = definition.label
if self._i18n_catalog: if self._i18n_catalog:

View File

@ -213,8 +213,8 @@ UM.ManagementPage
ProfileTab ProfileTab
{ {
title: catalog.i18nc("@title:tab", "Global Settings"); title: catalog.i18nc("@title:tab", "Global Settings");
quality: base.currentItem != null ? base.currentItem.id : ""; quality: Cura.MachineManager.activeMachine.qualityChanges.id
material: Cura.MachineManager.allActiveMaterialIds[Cura.MachineManager.activeMachineId] material: Cura.MachineManager.activeMachine.material.id
} }
Repeater Repeater