From 52dda935fc9de3589c2e7685ad5cde0d2351e281 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 22 Aug 2016 11:14:53 +0200 Subject: [PATCH 1/2] Switch to a generic quality profile if a material has no specific qualities CURA-2095 --- cura/Settings/MachineManager.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index c9eab930a6..a59b85c8df 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -362,7 +362,7 @@ class MachineManager(QObject): variant_instance_container = self._updateVariantContainer(definition) material_instance_container = self._updateMaterialContainer(definition, variant_instance_container) - quality_instance_container = self._updateQualityContainer(definition, material_instance_container) + quality_instance_container = self._updateQualityContainer(definition, variant_instance_container, material_instance_container) current_settings_instance_container = UM.Settings.InstanceContainer(name + "_current_settings") current_settings_instance_container.addMetaDataEntry("machine", name) @@ -618,6 +618,7 @@ class MachineManager(QObject): if not containers or not self._active_container_stack: return + old_variant = self._active_container_stack.findContainer({"type":"variant"}) old_material = self._active_container_stack.findContainer({"type":"material"}) old_quality = self._active_container_stack.findContainer({"type": "quality"}) if old_material: @@ -632,7 +633,7 @@ class MachineManager(QObject): if old_quality: preferred_quality_name = old_quality.getName() - self.setActiveQuality(self._updateQualityContainer(self._global_container_stack.getBottom(), containers[0], preferred_quality_name).id) + self.setActiveQuality(self._updateQualityContainer(self._global_container_stack.getBottom(), old_variant, containers[0], preferred_quality_name).id) else: Logger.log("w", "While trying to set the active material, no material was found to replace.") @@ -852,7 +853,8 @@ class MachineManager(QObject): return self._empty_material_container - def _updateQualityContainer(self, definition, material_container = None, preferred_quality_name = None): + def _updateQualityContainer(self, definition, variant_container, material_container = None, preferred_quality_name = None): + container_registry = UM.Settings.ContainerRegistry.getInstance() search_criteria = { "type": "quality" } if definition.getMetaDataEntry("has_machine_quality"): @@ -863,23 +865,42 @@ class MachineManager(QObject): else: search_criteria["definition"] = "fdmprinter" - if preferred_quality_name: + if preferred_quality_name and preferred_quality_name != "empty": search_criteria["name"] = preferred_quality_name else: preferred_quality = definition.getMetaDataEntry("preferred_quality") if preferred_quality: search_criteria["id"] = preferred_quality - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + containers = container_registry.findInstanceContainers(**search_criteria) if containers: return containers[0] + if "material" in search_criteria: + # If a quality for this specific material cannot be found, try finding qualities for a generic version of the material + material_search_criteria = { "type": "material", "material": material_container.getMetaDataEntry("material"), "color_name": "Generic" } + if definition.getMetaDataEntry("has_machine_quality"): + material_search_criteria["definition"] = definition.id + + if definition.getMetaDataEntry("has_variants") and variant_container: + material_search_criteria["variant"] = variant_container.id + else: + material_search_criteria["definition"] = "fdmprinter" + + material_containers = container_registry.findInstanceContainers(**material_search_criteria) + if material_containers: + search_criteria["material"] = material_containers[0].getId() + + containers = container_registry.findInstanceContainers(**search_criteria) + if containers: + return containers[0] + if "name" in search_criteria or "id" in search_criteria: # If a quality by this name can not be found, try a wider set of search criteria search_criteria.pop("name", None) search_criteria.pop("id", None) - containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria) + containers = container_registry.findInstanceContainers(**search_criteria) if containers: return containers[0] From 1003066ce175828812d0ea73dd89cfb9d8c6edf0 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 22 Aug 2016 11:31:31 +0200 Subject: [PATCH 2/2] Show qualities for the material associated with the currently selected quality CURA-2095 --- cura/Settings/MachineManager.py | 9 +++++++++ resources/qml/Menus/ProfileMenu.qml | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index a59b85c8df..d4ccad5bae 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -477,6 +477,15 @@ class MachineManager(QObject): return "" + @pyqtProperty(str, notify=activeQualityChanged) + def activeQualityMaterialId(self): + if self._active_container_stack: + quality = self._active_container_stack.findContainer({"type": "quality"}) + if quality: + return quality.getMetaDataEntry("material") + + return "" + @pyqtProperty(str, notify=activeQualityChanged) def activeQualityName(self): if self._active_container_stack: diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml index 68f83305d7..fcc97e5ea2 100644 --- a/resources/qml/Menus/ProfileMenu.qml +++ b/resources/qml/Menus/ProfileMenu.qml @@ -83,7 +83,7 @@ import Cura 1.0 as Cura result.definition = Cura.MachineManager.activeDefinitionId; if(Cura.MachineManager.hasMaterials) { - result.material = Cura.MachineManager.activeMaterialId; + result.material = Cura.MachineManager.activeQualityMaterialId; } } else