From 946ec1d32e3a3a0e34d384ffbf297bf01e930a5a Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 26 Aug 2019 15:40:27 +0200 Subject: [PATCH 1/3] Apply missing metadata fields from project files CURA-6388 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index a9142c6d12..c909955e53 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -59,6 +59,9 @@ class MachineInfo: self.container_id = None self.name = None self.definition_id = None + + self.metadata_dict = {} # type: Dict[str, str] + self.quality_type = None self.custom_quality_name = None self.quality_changes_info = None @@ -342,6 +345,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): global_stack_id = self._stripFileToId(global_stack_file) serialized = archive.open(global_stack_file).read().decode("utf-8") machine_name = self._getMachineNameFromSerializedStack(serialized) + self._machine_info.metadata_dict = self._getMetaDataDictFromSerializedStack(serialized) + stacks = self._container_registry.findContainerStacks(name = machine_name, type = "machine") self._is_same_machine_type = True existing_global_stack = None @@ -981,6 +986,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_stack.setMetaDataEntry("enabled", "True") extruder_stack.setMetaDataEntry("enabled", str(extruder_info.enabled)) + # Set metadata fields that are missing from the global stack + for key, value in self._machine_info.metadata_dict.items(): + if key not in global_stack.getMetaData(): + global_stack.setMetaDataEntry(key, value) + def _updateActiveMachine(self, global_stack): # Actually change the active machine. machine_manager = Application.getInstance().getMachineManager() @@ -993,6 +1003,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): machine_manager.setActiveMachine(global_stack.getId()) + # Set metadata fields that are missing from the global stack + for key, value in self._machine_info.metadata_dict.items(): + if key not in global_stack.getMetaData(): + global_stack.setMetaDataEntry(key, value) + if self._quality_changes_to_apply: quality_changes_group_dict = quality_manager.getQualityChangesGroups(global_stack) if self._quality_changes_to_apply not in quality_changes_group_dict: @@ -1054,6 +1069,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader): parser.read_string(serialized) return parser["general"].get("name", "") + def _getMetaDataDictFromSerializedStack(self, serialized: str) -> Dict[str, str]: + parser = ConfigParser(interpolation = None, empty_lines_in_values = False) + parser.read_string(serialized) + return parser["metadata"] + def _getMaterialLabelFromSerialized(self, serialized): data = ET.fromstring(serialized) metadata = data.iterfind("./um:metadata/um:name/um:label", {"um": "http://www.ultimaker.com/material"}) From 43d1157aa18bb0a24fcb8f396f43b2d105bd38cb Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 27 Aug 2019 11:38:25 +0200 Subject: [PATCH 2/3] Fix typing error CURA-6388 --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index c909955e53..5179fe5685 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -1072,7 +1072,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): def _getMetaDataDictFromSerializedStack(self, serialized: str) -> Dict[str, str]: parser = ConfigParser(interpolation = None, empty_lines_in_values = False) parser.read_string(serialized) - return parser["metadata"] + return dict(parser["metadata"]) def _getMaterialLabelFromSerialized(self, serialized): data = ET.fromstring(serialized) From bf66388939114c916507068e48d4a7befa476b2d Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 27 Aug 2019 11:41:21 +0200 Subject: [PATCH 3/3] Make functions that should have been static, static. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 5179fe5685..de1049403e 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -837,7 +837,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): self._machine_info.quality_changes_info.name = quality_changes_name - def _clearStack(self, stack): + @staticmethod + def _clearStack(stack): application = CuraApplication.getInstance() stack.definitionChanges.clear() @@ -1034,7 +1035,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Notify everything/one that is to notify about changes. global_stack.containersChanged.emit(global_stack.getTop()) - def _stripFileToId(self, file): + @staticmethod + def _stripFileToId(file): mime_type = MimeTypeDatabase.getMimeTypeForFile(file) file = mime_type.stripExtension(file) return file.replace("Cura/", "") @@ -1043,7 +1045,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): return self._container_registry.getContainerForMimeType(MimeTypeDatabase.getMimeType("application/x-ultimaker-material-profile")) ## Get the list of ID's of all containers in a container stack by partially parsing it's serialized data. - def _getContainerIdListFromSerialized(self, serialized): + @staticmethod + def _getContainerIdListFromSerialized(serialized): parser = ConfigParser(interpolation = None, empty_lines_in_values = False) parser.read_string(serialized) @@ -1064,17 +1067,20 @@ class ThreeMFWorkspaceReader(WorkspaceReader): return container_ids - def _getMachineNameFromSerializedStack(self, serialized): + @staticmethod + def _getMachineNameFromSerializedStack(serialized): parser = ConfigParser(interpolation = None, empty_lines_in_values = False) parser.read_string(serialized) return parser["general"].get("name", "") - def _getMetaDataDictFromSerializedStack(self, serialized: str) -> Dict[str, str]: + @staticmethod + def _getMetaDataDictFromSerializedStack(serialized: str) -> Dict[str, str]: parser = ConfigParser(interpolation = None, empty_lines_in_values = False) parser.read_string(serialized) return dict(parser["metadata"]) - def _getMaterialLabelFromSerialized(self, serialized): + @staticmethod + def _getMaterialLabelFromSerialized(serialized): data = ET.fromstring(serialized) metadata = data.iterfind("./um:metadata/um:name/um:label", {"um": "http://www.ultimaker.com/material"}) for entry in metadata: