From 729019a2dcbf126458486d08e5f4b9a84dec3cbd Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 19 Sep 2019 16:15:19 +0200 Subject: [PATCH 01/10] Don't use material manager to reset the material after uninstalling material package This class is deprecated. Contributes to issue CURA-6776. --- plugins/Toolbox/src/Toolbox.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 641340db17..08b6c80b1d 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -360,12 +360,14 @@ class Toolbox(QObject, Extension): @pyqtSlot() def resetMaterialsQualitiesAndUninstall(self) -> None: application = CuraApplication.getInstance() - material_manager = application.getMaterialManager() machine_manager = application.getMachineManager() container_tree = ContainerTree.getInstance() for global_stack, extruder_nr, container_id in self._package_used_materials: - default_material_node = material_manager.getDefaultMaterial(global_stack, extruder_nr, global_stack.extruders[extruder_nr].variant.getName()) + extruder = global_stack.extruderList[int(extruder_nr)] + approximate_diameter = extruder.getApproximateMaterialDiameter() + variant_node = container_tree.machines[global_stack.definition.getId()].variants[extruder.variant.getName()] + default_material_node = variant_node.preferredMaterial(approximate_diameter) machine_manager.setMaterial(extruder_nr, default_material_node, global_stack = global_stack) for global_stack, extruder_nr, container_id in self._package_used_qualities: variant_names = [extruder.variant.getName() for extruder in global_stack.extruderList] From 105e782e75d3a58ea54d04dff87f488717e5d8f7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 19 Sep 2019 16:17:48 +0200 Subject: [PATCH 02/10] Remove unused imports to MaterialManager Contributes to issue CURA-6776. --- cura/Machines/QualityManager.py | 1 - cura/Settings/ContainerManager.py | 1 - cura/Settings/CuraStackBuilder.py | 1 - 3 files changed, 3 deletions(-) diff --git a/cura/Machines/QualityManager.py b/cura/Machines/QualityManager.py index 6c54a6890d..4aa88d6775 100644 --- a/cura/Machines/QualityManager.py +++ b/cura/Machines/QualityManager.py @@ -48,7 +48,6 @@ class QualityManager(QObject): def __init__(self, parent = None) -> None: super().__init__(parent) application = cura.CuraApplication.CuraApplication.getInstance() - self._material_manager = application.getMaterialManager() self._container_registry = application.getContainerRegistry() self._empty_quality_container = application.empty_quality_container diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 140412076e..3154a88adf 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -23,7 +23,6 @@ from UM.Settings.InstanceContainer import InstanceContainer import cura.CuraApplication from cura.Machines.ContainerTree import ContainerTree -from cura.Machines.MaterialManager import MaterialManager if TYPE_CHECKING: from cura.CuraApplication import CuraApplication diff --git a/cura/Settings/CuraStackBuilder.py b/cura/Settings/CuraStackBuilder.py index 33b0fd8d2e..2cc427e253 100644 --- a/cura/Settings/CuraStackBuilder.py +++ b/cura/Settings/CuraStackBuilder.py @@ -10,7 +10,6 @@ from UM.Settings.InstanceContainer import InstanceContainer from cura.Machines.ContainerTree import ContainerTree from cura.Machines.MachineNode import MachineNode -from cura.Machines.MaterialManager import MaterialManager from .GlobalStack import GlobalStack from .ExtruderStack import ExtruderStack From cc9115b3d3cf5968bae845443750c5e0531f0d63 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 19 Sep 2019 16:27:58 +0200 Subject: [PATCH 03/10] Don't use material manager to reset material Use the container tree. Contributes to issue CURA-6776. --- cura/UI/MachineSettingsManager.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/cura/UI/MachineSettingsManager.py b/cura/UI/MachineSettingsManager.py index 7ecd9ed65f..671bb0ece0 100644 --- a/cura/UI/MachineSettingsManager.py +++ b/cura/UI/MachineSettingsManager.py @@ -2,11 +2,12 @@ # Cura is released under the terms of the LGPLv3 or higher. from typing import Optional, TYPE_CHECKING - from PyQt5.QtCore import QObject, pyqtSlot from UM.i18n import i18nCatalog +from cura.Machines.ContainerTree import ContainerTree + if TYPE_CHECKING: from cura.CuraApplication import CuraApplication @@ -42,7 +43,7 @@ class MachineSettingsManager(QObject): # it was moved to the machine manager instead. Now this method just calls the machine manager. self._application.getMachineManager().setActiveMachineExtruderCount(extruder_count) - # Function for the Machine Settings panel (QML) to update after the usre changes "Number of Extruders". + # Function for the Machine Settings panel (QML) to update after the user changes "Number of Extruders". # # fieldOfView: The Ultimaker 2 family (not 2+) does not have materials in Cura by default, because the material is # to be set on the printer. But when switching to Marlin flavor, the printer firmware can not change/insert material @@ -51,8 +52,6 @@ class MachineSettingsManager(QObject): @pyqtSlot() def updateHasMaterialsMetadata(self): machine_manager = self._application.getMachineManager() - material_manager = self._application.getMaterialManager() - global_stack = machine_manager.activeMachine definition = global_stack.definition @@ -76,7 +75,10 @@ class MachineSettingsManager(QObject): # set materials for position in extruder_positions: if has_materials: - material_node = material_manager.getDefaultMaterial(global_stack, position, None) + extruder = global_stack.extruderList[int(position)] + approximate_diameter = extruder.getApproximateMaterialDiameter() + variant_node = ContainerTree.getInstance().machines[global_stack.definition.getId()].variants[extruder.variant.getName()] + material_node = variant_node.preferredMaterial(approximate_diameter) machine_manager.setMaterial(position, material_node) self.forceUpdate() From 12043df3678cbc088396de8df8a3317975e588b7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Thu, 19 Sep 2019 17:01:13 +0200 Subject: [PATCH 04/10] Don't use material manager to find or remove materials That remove function in the material manager was very weird... Contributes to issue CURA-6776. --- cura/Machines/MaterialManager.py | 2 +- plugins/3MFReader/ThreeMFWorkspaceReader.py | 23 ++++----------------- 2 files changed, 5 insertions(+), 20 deletions(-) diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py index dc9fb55902..83be6941ea 100644 --- a/cura/Machines/MaterialManager.py +++ b/cura/Machines/MaterialManager.py @@ -255,7 +255,7 @@ class MaterialManager(QObject): for result in results: container_registry.removeContainer(result.getMetaDataEntry("id", "")) - @pyqtSlot("QVariant", result=bool) + @pyqtSlot("QVariant", result = bool) def canMaterialBeRemoved(self, material_node: "MaterialNode"): # Check if the material is active in any extruder train. In that case, the material shouldn't be removed! # In the future we might enable this again, but right now, it's causing a ton of issues if we do (since it diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 0d1118ed64..67e48d0c23 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -575,7 +575,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): @call_on_qt_thread def read(self, file_name): application = CuraApplication.getInstance() - material_manager = application.getMaterialManager() archive = zipfile.ZipFile(file_name, "r") @@ -673,7 +672,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if self._resolve_strategies["material"] == "override": # Remove the old materials and then deserialize the one from the project root_material_id = material_container.getMetaDataEntry("base_file") - material_manager.removeMaterialByRootId(root_material_id) + application.getContainerRegistry().removeContainer(root_material_id) elif self._resolve_strategies["material"] == "new": # Note that we *must* deserialize it with a new ID, as multiple containers will be # auto created & added. @@ -727,8 +726,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader): if self._machine_info.quality_changes_info is None: return - application = CuraApplication.getInstance() - # If we have custom profiles, load them quality_changes_name = self._machine_info.quality_changes_info.name if self._machine_info.quality_changes_info is not None: @@ -957,9 +954,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_stack.variant = node.container def _applyMaterials(self, global_stack, extruder_stack_dict): - application = CuraApplication.getInstance() - material_manager = application.getMaterialManager() - + machine_node = ContainerTree.getInstance().machines[global_stack] for position, extruder_stack in extruder_stack_dict.items(): if position not in self._machine_info.extruder_info_dict: continue @@ -970,18 +965,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): root_material_id = extruder_info.root_material_id root_material_id = self._old_new_materials.get(root_material_id, root_material_id) - build_plate_id = global_stack.variant.getId() - - # get material diameter of this extruder - machine_material_diameter = extruder_stack.getCompatibleMaterialDiameter() - material_node = material_manager.getMaterialNode(global_stack.definition.getId(), - extruder_stack.variant.getName(), - build_plate_id, - machine_material_diameter, - root_material_id) - - if material_node is not None and material_node.container is not None: - extruder_stack.material = material_node.container # type: InstanceContainer + material_node = machine_node.variants[extruder_stack.variant.getName()].materials[root_material_id] + extruder_stack.material = material_node.container # type: InstanceContainer def _applyChangesToMachine(self, global_stack, extruder_stack_dict): # Clear all first From 4a68e7ec955c93bd7229dadcf882e263bef99c51 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 Sep 2019 09:34:40 +0200 Subject: [PATCH 05/10] Fix favorite materials without material manager We just track it via the preference value itself rather than duplicating that in any other data structure. It's simple enough. Contributes to issue CURA-6776. --- cura/Machines/Models/BaseMaterialsModel.py | 6 ++++ .../Models/MaterialManagementModel.py | 36 +++++++++++++++++-- .../Preferences/Materials/MaterialsSlot.qml | 9 ++--- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/cura/Machines/Models/BaseMaterialsModel.py b/cura/Machines/Models/BaseMaterialsModel.py index 7dcdb7fd57..89a50ba39d 100644 --- a/cura/Machines/Models/BaseMaterialsModel.py +++ b/cura/Machines/Models/BaseMaterialsModel.py @@ -45,6 +45,7 @@ class BaseMaterialsModel(ListModel): # Update this model when switching machines, when adding materials or changing their metadata. self._machine_manager.activeStackChanged.connect(self._update) ContainerTree.getInstance().materialsChanged.connect(self._materialsListChanged) + self._application.getMaterialManagementModel().favoritesChanged.connect(self._update) self.addRoleName(Qt.UserRole + 1, "root_material_id") self.addRoleName(Qt.UserRole + 2, "id") @@ -115,6 +116,11 @@ class BaseMaterialsModel(ListModel): return self._update() + ## Triggered when the list of favorite materials is changed. + def _favoritesChanged(self, material_base_file: str) -> None: + if material_base_file in self._available_materials: + self._update() + ## This is an abstract method that needs to be implemented by the specific # models themselves. def _update(self): diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index a0b61e0b9b..16ef4b81e8 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -2,7 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. import copy # To duplicate materials. -from PyQt5.QtCore import QObject, pyqtSlot # To allow the preference page proxy to be used from the actual preferences page. +from PyQt5.QtCore import QObject, pyqtSignal, pyqtSlot # To allow the preference page proxy to be used from the actual preferences page. from typing import Any, Dict, Optional, TYPE_CHECKING import uuid # To generate new GUIDs for new materials. @@ -23,6 +23,11 @@ catalog = i18nCatalog("cura") # This class handles the actions in that page, such as creating new materials, # renaming them, etc. class MaterialManagementModel(QObject): + ## Triggered when a favorite is added or removed. + # \param The base file of the material is provided as parameter when this + # emits. + favoritesChanged = pyqtSignal(str) + ## Can a certain material be deleted, or is it still in use in one of the # container stacks anywhere? # @@ -178,4 +183,31 @@ class MaterialManagementModel(QObject): } self.duplicateMaterial(preferred_material_node, new_base_id = new_id, new_metadata = new_metadata) - return new_id \ No newline at end of file + return new_id + + ## Adds a certain material to the favorite materials. + # \param material_base_file The base file of the material to add. + @pyqtSlot(str) + def addFavorite(self, material_base_file: str) -> None: + application = cura.CuraApplication.CuraApplication.getInstance() + favorites = application.getPreferences().getValue("cura/favorite_materials").split(";") + if material_base_file not in favorites: + favorites.append(material_base_file) + application.getPreferences().setValue("cura/favorite_materials", ";".join(favorites)) + application.saveSettings() + self.favoritesChanged.emit(material_base_file) + + ## Removes a certain material from the favorite materials. + # + # If the material was not in the favorite materials, nothing happens. + @pyqtSlot(str) + def removeFavorite(self, material_base_file: str) -> None: + application = cura.CuraApplication.CuraApplication.getInstance() + favorites = application.getPreferences().getValue("cura/favorite_materials").split(";") + try: + favorites.remove(material_base_file) + application.getPreferences().setValue("cura/favorite_materials", ";".join(favorites)) + application.saveSettings() + self.favoritesChanged.emit(material_base_file) + except ValueError: # Material was not in the favorites list. + Logger.log("w", "Material {material_base_file} was already not a favorite material.".format(material_base_file = material_base_file)) \ No newline at end of file diff --git a/resources/qml/Preferences/Materials/MaterialsSlot.qml b/resources/qml/Preferences/Materials/MaterialsSlot.qml index 0e60bb6558..c6691460cf 100644 --- a/resources/qml/Preferences/Materials/MaterialsSlot.qml +++ b/resources/qml/Preferences/Materials/MaterialsSlot.qml @@ -82,11 +82,12 @@ Rectangle { if (materialSlot.is_favorite) { - CuraApplication.getMaterialManager().removeFavorite(material.root_material_id) - return + CuraApplication.getMaterialManagementModel().removeFavorite(material.root_material_id) + } + else + { + CuraApplication.getMaterialManagementModel().addFavorite(material.root_material_id) } - CuraApplication.getMaterialManager().addFavorite(material.root_material_id) - return } style: ButtonStyle { From 3479a3df76365cfc927c3f8a3421b116132bf684 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 20 Sep 2019 09:45:55 +0200 Subject: [PATCH 06/10] Fix _applyVariants using variant manager The variant manager doesn't get properly filled any more. Contributes to issue CURA-6776. --- plugins/3MFReader/ThreeMFWorkspaceReader.py | 36 +++++++-------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index 67e48d0c23..46584aea98 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -920,41 +920,27 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_stack.userChanges.setProperty(key, "value", value) def _applyVariants(self, global_stack, extruder_stack_dict): - application = CuraApplication.getInstance() - variant_manager = application.getVariantManager() + machine_node = ContainerTree.getInstance().machines[global_stack.definition.getId()] + # Take the global variant from the machine info if available. if self._machine_info.variant_info is not None: - parser = self._machine_info.variant_info.parser - variant_name = parser["general"]["name"] - - variant_type = VariantType.BUILD_PLATE - - node = variant_manager.getVariantNode(global_stack.definition.getId(), variant_name, variant_type) - if node is not None and node.container is not None: - global_stack.variant = node.container + variant_name = self._machine_info.variant_info.parser["general"]["name"] + global_stack.variant = machine_node.variants[variant_name].container for position, extruder_stack in extruder_stack_dict.items(): if position not in self._machine_info.extruder_info_dict: continue extruder_info = self._machine_info.extruder_info_dict[position] if extruder_info.variant_info is None: - # If there is no variant_info, try to use the default variant. Otherwise, leave it be. - machine_node = ContainerTree.getInstance().machines[global_stack.definition.getId()] - node = machine_node.variants[machine_node.preferred_variant_name] - if node is not None and node.container is not None: - extruder_stack.variant = node.container - continue - parser = extruder_info.variant_info.parser - - variant_name = parser["general"]["name"] - variant_type = VariantType.NOZZLE - - node = ContainerTree.getInstance().machines[global_stack.definition.getId()].variants[variant_name] - if node is not None and node.container is not None: - extruder_stack.variant = node.container + # If there is no variant_info, try to use the default variant. Otherwise, any available variant. + node = machine_node.variants.get(machine_node.preferred_variant_name, next(iter(machine_node.variants.values()))) + else: + variant_name = extruder_info.variant_info.parser["general"]["name"] + node = ContainerTree.getInstance().machines[global_stack.definition.getId()].variants[variant_name] + extruder_stack.variant = node.container def _applyMaterials(self, global_stack, extruder_stack_dict): - machine_node = ContainerTree.getInstance().machines[global_stack] + machine_node = ContainerTree.getInstance().machines[global_stack.definition.getId()] for position, extruder_stack in extruder_stack_dict.items(): if position not in self._machine_info.extruder_info_dict: continue From cb7d99d2dc3e8ecb796dc2ac03f6f850e2afebdc Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 20 Sep 2019 11:56:08 +0200 Subject: [PATCH 07/10] Revert "Make 3MF-reader aware of setting-version for introduction Intent." This reverts commit 16ea437255f059d7de2e9d76a4aba4e0d2cb74ab. Should have been (and is now) done in the version upgrade instead. --- cura/Settings/CuraContainerStack.py | 21 +------------------ plugins/3MFReader/ThreeMFWorkspaceReader.py | 23 +++++++++------------ 2 files changed, 11 insertions(+), 33 deletions(-) diff --git a/cura/Settings/CuraContainerStack.py b/cura/Settings/CuraContainerStack.py index c1c2544c6e..c141ac9b0e 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, Dict, List, Optional +from typing import Any, cast, List, Optional from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject from UM.Application import Application @@ -364,22 +364,3 @@ 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 46584aea98..d5bc4e74c6 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -371,8 +371,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): # Get quality type parser = ConfigParser(interpolation = None) parser.read_string(serialized) - index_map_version = _ContainerIndexes.getIndexMapping(int(parser["metadata"]["setting_version"])) - quality_container_id = parser["containers"][str(index_map_version[_ContainerIndexes.Quality])] + quality_container_id = parser["containers"][str(_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"] @@ -382,11 +381,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader): serialized = GlobalStack._updateSerialized(serialized, global_stack_file) parser = ConfigParser(interpolation = None) parser.read_string(serialized) - index_map_version = _ContainerIndexes.getIndexMapping(int(parser["metadata"]["setting_version"])) - definition_changes_id = parser["containers"][str(index_map_version[_ContainerIndexes.DefinitionChanges])] + definition_changes_id = parser["containers"][str(_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(index_map_version[_ContainerIndexes.UserChanges])] + user_changes_id = parser["containers"][str(_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] @@ -396,8 +394,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader): extruder_info = ExtruderInfo() extruder_info.position = position - variant_id = parser["containers"][str(index_map_version[_ContainerIndexes.Variant])] - material_id = parser["containers"][str(index_map_version[_ContainerIndexes.Material])] + variant_id = parser["containers"][str(_ContainerIndexes.Variant)] + material_id = parser["containers"][str(_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"): @@ -405,7 +403,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(index_map_version[_ContainerIndexes.Variant])] + variant_id = parser["containers"][str(_ContainerIndexes.Variant)] if variant_id not in ("empty", "empty_variant"): self._machine_info.variant_info = instance_container_info_dict[variant_id] QCoreApplication.processEvents() # Ensure that the GUI does not freeze. @@ -417,14 +415,13 @@ 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(index_map_version[_ContainerIndexes.Variant])] - material_id = parser["containers"][str(index_map_version[_ContainerIndexes.Material])] + variant_id = parser["containers"][str(_ContainerIndexes.Variant)] + material_id = parser["containers"][str(_ContainerIndexes.Material)] extruder_info = ExtruderInfo() extruder_info.position = position @@ -438,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(index_map_version[_ContainerIndexes.DefinitionChanges])] + definition_changes_id = parser["containers"][str(_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(index_map_version[_ContainerIndexes.UserChanges])] + user_changes_id = parser["containers"][str(_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 From 61527e082e46b352ca3e0cd9d0c262f30b647195 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 23 Sep 2019 09:59:57 +0200 Subject: [PATCH 08/10] Mock ContainerTree instead of ContainerRegistry The intent models are now using the ContainerTree to build themselves rather than the registry. --- tests/Settings/TestCuraStackBuilder.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/Settings/TestCuraStackBuilder.py b/tests/Settings/TestCuraStackBuilder.py index 7a1e05296c..2fec1f659b 100644 --- a/tests/Settings/TestCuraStackBuilder.py +++ b/tests/Settings/TestCuraStackBuilder.py @@ -66,8 +66,6 @@ def test_createMachine(application, container_registry, definition_container, gl quality_manager.getQualityGroups = MagicMock(return_value = {"normal": quality_group}) application.getContainerRegistry = MagicMock(return_value=container_registry) - application.getVariantManager = MagicMock(return_value = variant_manager) - application.getQualityManager = MagicMock(return_value = quality_manager) application.empty_material_container = material_instance_container application.empty_quality_container = quality_container application.empty_intent_container = intent_container From 18d93d0b7bcebf253c48a031d82af591e893ae2b Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 23 Sep 2019 10:40:02 +0200 Subject: [PATCH 09/10] Fix UM2 extended variants CURA-6775 --- .../VersionUpgrade43to44/VersionUpgrade43to44.py | 4 ++++ ...0.25.inst.cfg => ultimaker2_extended_olsson_0.25.inst.cfg} | 2 +- ...d_0.4.inst.cfg => ultimaker2_extended_olsson_0.4.inst.cfg} | 2 +- ...d_0.6.inst.cfg => ultimaker2_extended_olsson_0.6.inst.cfg} | 2 +- ...d_0.8.inst.cfg => ultimaker2_extended_olsson_0.8.inst.cfg} | 2 +- 5 files changed, 8 insertions(+), 4 deletions(-) rename resources/variants/{ultimaker2_extended_0.25.inst.cfg => ultimaker2_extended_olsson_0.25.inst.cfg} (82%) rename resources/variants/{ultimaker2_extended_0.4.inst.cfg => ultimaker2_extended_olsson_0.4.inst.cfg} (82%) rename resources/variants/{ultimaker2_extended_0.6.inst.cfg => ultimaker2_extended_olsson_0.6.inst.cfg} (82%) rename resources/variants/{ultimaker2_extended_0.8.inst.cfg => ultimaker2_extended_olsson_0.8.inst.cfg} (82%) diff --git a/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py b/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py index e24766933f..678066c3e8 100644 --- a/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py +++ b/plugins/VersionUpgrade/VersionUpgrade43to44/VersionUpgrade43to44.py @@ -8,6 +8,10 @@ _renamed_container_id_map = { "ultimaker2_0.4": "ultimaker2_olsson_0.4", "ultimaker2_0.6": "ultimaker2_olsson_0.6", "ultimaker2_0.8": "ultimaker2_olsson_0.8", + "ultimaker2_extended_0.25": "ultimaker2_extended_olsson_0.25", + "ultimaker2_extended_0.4": "ultimaker2_extended_olsson_0.4", + "ultimaker2_extended_0.6": "ultimaker2_extended_olsson_0.6", + "ultimaker2_extended_0.8": "ultimaker2_extended_olsson_0.8", } diff --git a/resources/variants/ultimaker2_extended_0.25.inst.cfg b/resources/variants/ultimaker2_extended_olsson_0.25.inst.cfg similarity index 82% rename from resources/variants/ultimaker2_extended_0.25.inst.cfg rename to resources/variants/ultimaker2_extended_olsson_0.25.inst.cfg index e1ee26fe52..a18cf745f7 100644 --- a/resources/variants/ultimaker2_extended_0.25.inst.cfg +++ b/resources/variants/ultimaker2_extended_olsson_0.25.inst.cfg @@ -1,7 +1,7 @@ [general] name = 0.25 mm version = 4 -definition = ultimaker2_extended +definition = ultimaker2_extended_olsson [metadata] setting_version = 10 diff --git a/resources/variants/ultimaker2_extended_0.4.inst.cfg b/resources/variants/ultimaker2_extended_olsson_0.4.inst.cfg similarity index 82% rename from resources/variants/ultimaker2_extended_0.4.inst.cfg rename to resources/variants/ultimaker2_extended_olsson_0.4.inst.cfg index 3e008cc4c4..65d86c419d 100644 --- a/resources/variants/ultimaker2_extended_0.4.inst.cfg +++ b/resources/variants/ultimaker2_extended_olsson_0.4.inst.cfg @@ -1,7 +1,7 @@ [general] name = 0.4 mm version = 4 -definition = ultimaker2_extended +definition = ultimaker2_extended_olsson [metadata] setting_version = 10 diff --git a/resources/variants/ultimaker2_extended_0.6.inst.cfg b/resources/variants/ultimaker2_extended_olsson_0.6.inst.cfg similarity index 82% rename from resources/variants/ultimaker2_extended_0.6.inst.cfg rename to resources/variants/ultimaker2_extended_olsson_0.6.inst.cfg index 8cde95416a..274b371448 100644 --- a/resources/variants/ultimaker2_extended_0.6.inst.cfg +++ b/resources/variants/ultimaker2_extended_olsson_0.6.inst.cfg @@ -1,7 +1,7 @@ [general] name = 0.6 mm version = 4 -definition = ultimaker2_extended +definition = ultimaker2_extended_olsson [metadata] setting_version = 10 diff --git a/resources/variants/ultimaker2_extended_0.8.inst.cfg b/resources/variants/ultimaker2_extended_olsson_0.8.inst.cfg similarity index 82% rename from resources/variants/ultimaker2_extended_0.8.inst.cfg rename to resources/variants/ultimaker2_extended_olsson_0.8.inst.cfg index b1d6acb100..9b43296950 100644 --- a/resources/variants/ultimaker2_extended_0.8.inst.cfg +++ b/resources/variants/ultimaker2_extended_olsson_0.8.inst.cfg @@ -1,7 +1,7 @@ [general] name = 0.8 mm version = 4 -definition = ultimaker2_extended +definition = ultimaker2_extended_olsson [metadata] setting_version = 10 From 1aa6708677d3355a802900182b851eaa7b1edf0f Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 23 Sep 2019 10:59:31 +0200 Subject: [PATCH 10/10] Fix typing --- cura/Machines/Models/MaterialManagementModel.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cura/Machines/Models/MaterialManagementModel.py b/cura/Machines/Models/MaterialManagementModel.py index 16ef4b81e8..b4f3bb9889 100644 --- a/cura/Machines/Models/MaterialManagementModel.py +++ b/cura/Machines/Models/MaterialManagementModel.py @@ -39,7 +39,7 @@ class MaterialManagementModel(QObject): # \param material_node The ContainerTree node of the material to check. # \return Whether or not the material can be removed. @pyqtSlot("QVariant", result = bool) - def canMaterialBeRemoved(self, material_node: "MaterialNode"): + def canMaterialBeRemoved(self, material_node: "MaterialNode") -> bool: container_registry = CuraContainerRegistry.getInstance() ids_to_remove = {metadata.get("id", "") for metadata in container_registry.findInstanceContainersMetadata(base_file = material_node.base_file)} for extruder_stack in container_registry.findContainerStacks(type = "extruder_train"): @@ -85,7 +85,8 @@ class MaterialManagementModel(QObject): # \param new_metadata Metadata for the new material. If not provided, this # will be duplicated from the original material. # \return The root material ID of the duplicate material. - def duplicateMaterialByBaseFile(self, base_file: str, new_base_id: Optional[str] = None, new_metadata: Dict[str, Any] = None) -> Optional[str]: + def duplicateMaterialByBaseFile(self, base_file: str, new_base_id: Optional[str] = None, + new_metadata: Optional[Dict[str, Any]] = None) -> Optional[str]: container_registry = CuraContainerRegistry.getInstance() root_materials = container_registry.findContainers(id = base_file) @@ -149,7 +150,8 @@ class MaterialManagementModel(QObject): # will be duplicated from the original material. # \return The root material ID of the duplicate material. @pyqtSlot("QVariant", result = str) - def duplicateMaterial(self, material_node: "MaterialNode", new_base_id: Optional[str] = None, new_metadata: Dict[str, Any] = None) -> Optional[str]: + def duplicateMaterial(self, material_node: "MaterialNode", new_base_id: Optional[str] = None, + new_metadata: Optional[Dict[str, Any]] = None) -> Optional[str]: return self.duplicateMaterialByBaseFile(material_node.base_file, new_base_id, new_metadata) ## Create a new material by cloning the preferred material for the current @@ -210,4 +212,4 @@ class MaterialManagementModel(QObject): application.saveSettings() self.favoritesChanged.emit(material_base_file) except ValueError: # Material was not in the favorites list. - Logger.log("w", "Material {material_base_file} was already not a favorite material.".format(material_base_file = material_base_file)) \ No newline at end of file + Logger.log("w", "Material {material_base_file} was already not a favorite material.".format(material_base_file = material_base_file))