From 16ea437255f059d7de2e9d76a4aba4e0d2cb74ab Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Wed, 4 Sep 2019 14:52:54 +0200 Subject: [PATCH] Make 3MF-reader aware of setting-version for introduction Intent. --- cura/Settings/CuraContainerStack.py | 21 ++++++++++++++++++- plugins/3MFReader/ThreeMFWorkspaceReader.py | 23 ++++++++++++--------- 2 files changed, 33 insertions(+), 11 deletions(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index c141ac9b0e..c1c2544c6e 100755 --- a/cura/Settings/CuraContainerStack.py +++ b/cura/Settings/CuraContainerStack.py @@ -1,7 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import Any, cast, List, Optional +from typing import Any, cast, Dict, List, Optional from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject from UM.Application import Application @@ -364,3 +364,22 @@ class _ContainerIndexes: # Reverse lookup: type -> index TypeIndexMap = dict([(v, k) for k, v in IndexTypeMap.items()]) + + # Mapping to old values before Intent introduction. Used for reading older versions of input files. + IndexToOldIndexMap = { + UserChanges: 0, + QualityChanges: 1, + Intent: -1, # Wasn't there in the old 'format'! + Quality: 2, + Material: 3, + Variant: 4, + DefinitionChanges: 5, + Definition: 6, + } + + # Reverse lookup: old index -> new index + OldIndexToIndexMap = dict([(v, k) for k, v in IndexToOldIndexMap.items()]) + + @classmethod + def getIndexMapping(cls, setting_version: int) -> Dict[int, int]: + return dict([(x, x) for x in list(range(99))]) if setting_version >= 10 else cls.IndexToOldIndexMap diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index d7cc2f0b70..7d01421d81 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -368,7 +368,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Get quality type parser = ConfigParser(interpolation = None) parser.read_string(serialized) - quality_container_id = parser["containers"][str(_ContainerIndexes.Quality)] + index_map_version = _ContainerIndexes.getIndexMapping(int(parser["metadata"]["setting_version"])) + quality_container_id = parser["containers"][str(index_map_version[_ContainerIndexes.Quality])] quality_type = "empty_quality" if quality_container_id not in ("empty", "empty_quality"): quality_type = instance_container_info_dict[quality_container_id].parser["metadata"]["quality_type"] @@ -378,10 +379,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): serialized = GlobalStack._updateSerialized(serialized, global_stack_file) parser = ConfigParser(interpolation = None) parser.read_string(serialized) - definition_changes_id = parser["containers"][str(_ContainerIndexes.DefinitionChanges)] + index_map_version = _ContainerIndexes.getIndexMapping(int(parser["metadata"]["setting_version"])) + definition_changes_id = parser["containers"][str(index_map_version[_ContainerIndexes.DefinitionChanges])] if definition_changes_id not in ("empty", "empty_definition_changes"): self._machine_info.definition_changes_info = instance_container_info_dict[definition_changes_id] - user_changes_id = parser["containers"][str(_ContainerIndexes.UserChanges)] + user_changes_id = parser["containers"][str(index_map_version[_ContainerIndexes.UserChanges])] if user_changes_id not in ("empty", "empty_user_changes"): self._machine_info.user_changes_info = instance_container_info_dict[user_changes_id] @@ -391,8 +393,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_info = ExtruderInfo() extruder_info.position = position - variant_id = parser["containers"][str(_ContainerIndexes.Variant)] - material_id = parser["containers"][str(_ContainerIndexes.Material)] + variant_id = parser["containers"][str(index_map_version[_ContainerIndexes.Variant])] + material_id = parser["containers"][str(index_map_version[_ContainerIndexes.Material])] if variant_id not in ("empty", "empty_variant"): extruder_info.variant_info = instance_container_info_dict[variant_id] if material_id not in ("empty", "empty_material"): @@ -400,7 +402,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_info.root_material_id = root_material_id self._machine_info.extruder_info_dict[position] = extruder_info else: - variant_id = parser["containers"][str(_ContainerIndexes.Variant)] + variant_id = parser["containers"][str(index_map_version[_ContainerIndexes.Variant])] if variant_id not in ("empty", "empty_variant"): self._machine_info.variant_info = instance_container_info_dict[variant_id] @@ -412,13 +414,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader): serialized = ExtruderStack._updateSerialized(serialized, extruder_stack_file) parser = ConfigParser(interpolation = None) parser.read_string(serialized) + index_map_version = _ContainerIndexes.getIndexMapping(int(parser["metadata"]["setting_version"])) # The check should be done for the extruder stack that's associated with the existing global stack, # and those extruder stacks may have different IDs. # So we check according to the positions position = parser["metadata"]["position"] - variant_id = parser["containers"][str(_ContainerIndexes.Variant)] - material_id = parser["containers"][str(_ContainerIndexes.Material)] + variant_id = parser["containers"][str(index_map_version[_ContainerIndexes.Variant])] + material_id = parser["containers"][str(index_map_version[_ContainerIndexes.Material])] extruder_info = ExtruderInfo() extruder_info.position = position @@ -432,11 +435,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): root_material_id = reverse_material_id_dict[material_id] extruder_info.root_material_id = root_material_id - definition_changes_id = parser["containers"][str(_ContainerIndexes.DefinitionChanges)] + definition_changes_id = parser["containers"][str(index_map_version[_ContainerIndexes.DefinitionChanges])] if definition_changes_id not in ("empty", "empty_definition_changes"): extruder_info.definition_changes_info = instance_container_info_dict[definition_changes_id] - user_changes_id = parser["containers"][str(_ContainerIndexes.UserChanges)] + user_changes_id = parser["containers"][str(index_map_version[_ContainerIndexes.UserChanges])] if user_changes_id not in ("empty", "empty_user_changes"): extruder_info.user_changes_info = instance_container_info_dict[user_changes_id] self._machine_info.extruder_info_dict[position] = extruder_info