Browse Source

Fix empty material/quality profiles when switching variants

CURA-1278
fieldOfView 8 years ago
parent
commit
a7939c6f3d
1 changed files with 26 additions and 6 deletions
  1. 26 6
      cura/MachineManagerModel.py

+ 26 - 6
cura/MachineManagerModel.py

@@ -401,9 +401,9 @@ class MachineManagerModel(QObject):
 
             preferred_material = None
             if old_material:
-                preferred_material = old_material.getId()
+                preferred_material_name = old_material.getName()
 
-            self.setActiveMaterial(self._updateMaterialContainer(self._global_container_stack.getBottom(), containers[0], preferred_material).id)
+            self.setActiveMaterial(self._updateMaterialContainer(self._global_container_stack.getBottom(), containers[0], preferred_material_name).id)
 
     @pyqtSlot(str)
     def setActiveQuality(self, quality_id):
@@ -519,7 +519,7 @@ class MachineManagerModel(QObject):
 
         return self._empty_variant_container
 
-    def _updateMaterialContainer(self, definition, variant_container = None, preferred_material = None):
+    def _updateMaterialContainer(self, definition, variant_container = None, preferred_material_name = None):
         if not definition.getMetaDataEntry("has_materials"):
             return self._empty_material_container
 
@@ -533,15 +533,26 @@ class MachineManagerModel(QObject):
         else:
             search_criteria["definition"] = "fdmprinter"
 
-        if not preferred_material:
+        if preferred_material_name:
+            search_criteria["name"] = preferred_material_name
+        else:
             preferred_material = definition.getMetaDataEntry("preferred_material")
-        if preferred_material:
-            search_criteria["id"] = preferred_material
+            if preferred_material:
+                search_criteria["id"] = preferred_material
 
         containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(**search_criteria)
         if containers:
             return containers[0]
 
+        if "name" in search_criteria or "id" in search_criteria:
+            # If a material 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)
+            if containers:
+                return containers[0]
+
         return self._empty_material_container
 
     def _updateQualityContainer(self, definition, material_container = None, preferred_quality_name = None):
@@ -566,6 +577,15 @@ class MachineManagerModel(QObject):
         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)
+            if containers:
+                return containers[0]
+
         return self._empty_quality_container
 
 def createMachineManagerModel(engine, script_engine):