From 17b8e9930c32aebedab50dc697d43242b32a916f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 12 Nov 2019 13:28:12 +0100 Subject: [PATCH 1/3] Add handling for case where variant could not be found CURA-6975 --- cura/Machines/Models/BaseMaterialsModel.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cura/Machines/Models/BaseMaterialsModel.py b/cura/Machines/Models/BaseMaterialsModel.py index 73d9d48b22..db660704b5 100644 --- a/cura/Machines/Models/BaseMaterialsModel.py +++ b/cura/Machines/Models/BaseMaterialsModel.py @@ -6,6 +6,7 @@ from typing import Dict, Set from PyQt5.QtCore import Qt, QTimer, pyqtSignal, pyqtProperty from UM.Qt.ListModel import ListModel +from UM.Logger import Logger import cura.CuraApplication # Imported like this to prevent a circular reference. from cura.Machines.ContainerTree import ContainerTree @@ -153,7 +154,12 @@ class BaseMaterialsModel(ListModel): if not extruder_stack: return nozzle_name = extruder_stack.variant.getName() - materials = ContainerTree.getInstance().machines[global_stack.definition.getId()].variants[nozzle_name].materials + machine_node = ContainerTree.getInstance().machines[global_stack.definition.getId()] + if nozzle_name not in machine_node.variants: + Logger.log("w", "Unable to find variant %s in container tree", nozzle_name) + self._available_materials = {} + return + materials = machine_node.variants[nozzle_name].materials approximate_material_diameter = extruder_stack.getApproximateMaterialDiameter() self._available_materials = {key: material for key, material in materials.items() if float(material.getMetaDataEntry("approximate_diameter", -1)) == approximate_material_diameter} From 8228c6a7433ce7c3302fb89b637efcfd2b5e7614 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 12 Nov 2019 14:22:18 +0100 Subject: [PATCH 2/3] Make sure position is not None CURA-6974 --- cura/Machines/MachineNode.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/Machines/MachineNode.py b/cura/Machines/MachineNode.py index 72652f2987..8d69ffdc8d 100644 --- a/cura/Machines/MachineNode.py +++ b/cura/Machines/MachineNode.py @@ -140,7 +140,7 @@ class MachineNode(ContainerNode): elif groups_by_name[name].intent_category == "default": # Intent category should be stored as "default" if everything is default or as the intent if any of the extruder have an actual intent. groups_by_name[name].intent_category = quality_changes.get("intent_category", "default") - if "position" in quality_changes: # An extruder profile. + if quality_changes.get("position") is not None: # An extruder profile. groups_by_name[name].metadata_per_extruder[int(quality_changes["position"])] = quality_changes else: # Global profile. groups_by_name[name].metadata_for_global = quality_changes From 77c194464e5edd70aedd255163513970dfcf8032 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 12 Nov 2019 14:33:54 +0100 Subject: [PATCH 3/3] Fix tests --- tests/Machines/TestVariantNode.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/Machines/TestVariantNode.py b/tests/Machines/TestVariantNode.py index bc860058a1..6e3a469877 100644 --- a/tests/Machines/TestVariantNode.py +++ b/tests/Machines/TestVariantNode.py @@ -139,6 +139,7 @@ def test_preferredMaterialExactMatch(empty_variant_node): "some_different_material": MagicMock(getMetaDataEntry = lambda x: 3), "preferred_material_base_file": MagicMock(getMetaDataEntry = lambda x: 3) # Exact match. } + empty_variant_node.machine.preferred_material = "preferred_material_base_file" assert empty_variant_node.preferredMaterial(approximate_diameter = 3) == empty_variant_node.materials["preferred_material_base_file"], "It should match exactly on this one since it's the preferred material." @@ -149,6 +150,7 @@ def test_preferredMaterialSubmaterial(empty_variant_node): "some_different_material": MagicMock(getMetaDataEntry = lambda x: 3), "preferred_material_base_file_aa04": MagicMock(getMetaDataEntry = lambda x: 3) # This is a submaterial of the preferred material. } + empty_variant_node.machine.preferred_material = "preferred_material_base_file_aa04" assert empty_variant_node.preferredMaterial(approximate_diameter = 3) == empty_variant_node.materials["preferred_material_base_file_aa04"], "It should match on the submaterial just as well." @@ -160,6 +162,7 @@ def test_preferredMaterialDiameter(empty_variant_node): "preferred_material_wrong_diameter": MagicMock(getMetaDataEntry = lambda x: 2), # Approximate diameter is 2 instead of 3. "preferred_material_correct_diameter": MagicMock(getMetaDataEntry = lambda x: 3) # Correct approximate diameter. } + empty_variant_node.machine.preferred_material = "preferred_material_correct_diameter" assert empty_variant_node.preferredMaterial(approximate_diameter = 3) == empty_variant_node.materials["preferred_material_correct_diameter"], "It should match only on the material with correct diameter."