From 76417b7fb2069cca39f774c7fbf47c7120afa480 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 11 Jul 2018 10:57:55 +0200 Subject: [PATCH] Hide materials belong to a to-be-removed package --- cura/CuraPackageManager.py | 5 ++-- cura/Machines/MaterialGroup.py | 13 ++++++---- cura/Machines/Models/BrandMaterialsModel.py | 4 +++ cura/Machines/Models/GenericMaterialsModel.py | 5 ++++ plugins/Toolbox/src/Toolbox.py | 26 +++++++++++++++++-- .../XmlMaterialProfile/XmlMaterialProfile.py | 3 +++ 6 files changed, 46 insertions(+), 10 deletions(-) diff --git a/cura/CuraPackageManager.py b/cura/CuraPackageManager.py index 95b381989f..363b8034ec 100644 --- a/cura/CuraPackageManager.py +++ b/cura/CuraPackageManager.py @@ -6,7 +6,6 @@ from cura.Settings.GlobalStack import GlobalStack from UM.PackageManager import PackageManager #The class we're extending. from UM.Resources import Resources #To find storage paths for some resource types. -from UM.Settings.ContainerRegistry import ContainerRegistry class CuraPackageManager(PackageManager): @@ -25,14 +24,14 @@ class CuraPackageManager(PackageManager): # The list consists of 3-tuples: (global_stack, extruder_nr, container_id) def getMachinesUsingPackage(self, package_id: str): ids = self.getPackageContainerIds(package_id) - container_stacks = ContainerRegistry.getInstance().findContainerStacks() + container_stacks = self._application.getContainerRegistry().findContainerStacks() global_stacks = [container_stack for container_stack in container_stacks if isinstance(container_stack, GlobalStack)] machine_with_materials = [] machine_with_qualities = [] for container_id in ids: for global_stack in global_stacks: for extruder_nr, extruder_stack in global_stack.extruders.items(): - if container_id == extruder_stack.material.getId() or container_id == extruder_stack.material.getMetaData().get("base_file"): + if container_id in (extruder_stack.material.getId(), extruder_stack.material.getMetaData().get("base_file")): machine_with_materials.append((global_stack, extruder_nr, container_id)) if container_id == extruder_stack.quality.getId(): machine_with_qualities.append((global_stack, extruder_nr, container_id)) diff --git a/cura/Machines/MaterialGroup.py b/cura/Machines/MaterialGroup.py index b57e0e1808..e05647e674 100644 --- a/cura/Machines/MaterialGroup.py +++ b/cura/Machines/MaterialGroup.py @@ -1,8 +1,11 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import List -from cura.Machines.MaterialNode import MaterialNode #For type checking. +from typing import List, TYPE_CHECKING + +if TYPE_CHECKING: + from cura.Machines.MaterialNode import MaterialNode + ## A MaterialGroup represents a group of material InstanceContainers that are derived from a single material profile. # The main InstanceContainer which has the ID of the material profile file name is called the "root_material". For @@ -18,11 +21,11 @@ from cura.Machines.MaterialNode import MaterialNode #For type checking. class MaterialGroup: __slots__ = ("name", "is_read_only", "root_material_node", "derived_material_node_list") - def __init__(self, name: str, root_material_node: MaterialNode) -> None: + def __init__(self, name: str, root_material_node: "MaterialNode") -> None: self.name = name self.is_read_only = False - self.root_material_node = root_material_node # type: MaterialNode - self.derived_material_node_list = [] #type: List[MaterialNode] + self.root_material_node = root_material_node # type: MaterialNode + self.derived_material_node_list = [] # type: List[MaterialNode] def __str__(self) -> str: return "%s[%s]" % (self.__class__.__name__, self.name) diff --git a/cura/Machines/Models/BrandMaterialsModel.py b/cura/Machines/Models/BrandMaterialsModel.py index 236f105d12..ad48b3ea21 100644 --- a/cura/Machines/Models/BrandMaterialsModel.py +++ b/cura/Machines/Models/BrandMaterialsModel.py @@ -109,6 +109,10 @@ class BrandMaterialsModel(ListModel): if brand.lower() == "generic": continue + # Do not include the materials from a to-be-removed package + if bool(metadata.get("removed", False)): + continue + if brand not in brand_group_dict: brand_group_dict[brand] = {} diff --git a/cura/Machines/Models/GenericMaterialsModel.py b/cura/Machines/Models/GenericMaterialsModel.py index 2fac919f3e..f14b039c91 100644 --- a/cura/Machines/Models/GenericMaterialsModel.py +++ b/cura/Machines/Models/GenericMaterialsModel.py @@ -41,10 +41,15 @@ class GenericMaterialsModel(BaseMaterialsModel): item_list = [] for root_material_id, container_node in available_material_dict.items(): metadata = container_node.metadata + # Only add results for generic materials if metadata["brand"].lower() != "generic": continue + # Do not include the materials from a to-be-removed package + if bool(metadata.get("removed", False)): + continue + item = {"root_material_id": root_material_id, "id": metadata["id"], "name": metadata["name"], diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 3fec67c96e..31b9dda9f4 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -360,16 +360,38 @@ class Toolbox(QObject, Extension): material_manager = application.getMaterialManager() quality_manager = application.getQualityManager() machine_manager = application.getMachineManager() - for global_stack, extruder_nr, _ in self._package_used_materials: + + 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()) machine_manager.setMaterial(extruder_nr, default_material_node, global_stack = global_stack) - for global_stack, extruder_nr, _ in self._package_used_qualities: + for global_stack, extruder_nr, container_id in self._package_used_qualities: default_quality_group = quality_manager.getDefaultQualityType(global_stack) machine_manager.setQualityGroup(default_quality_group, global_stack = global_stack) + + self._markPackageMaterialsAsRemove(self._package_id_to_uninstall) + self.uninstall(self._package_id_to_uninstall) self._resetUninstallVariables() self.closeConfirmResetDialog() + def _markPackageMaterialsAsRemove(self, package_id: str) -> None: + container_registry = self._application.getContainerRegistry() + + all_containers = self._package_manager.getPackageContainerIds(package_id) + for container_id in all_containers: + containers = container_registry.findInstanceContainers(id = container_id) + if not containers: + continue + container = containers[0] + if container.getMetaDataEntry("type") != "material": + continue + root_material_id = container.getMetaDataEntry("base_file") + root_material_containers = container_registry.findInstanceContainers(id = root_material_id) + if not root_material_containers: + continue + root_material_container = root_material_containers[0] + root_material_container.setMetaDataEntry("removed", True) + @pyqtSlot(str) def uninstall(self, package_id: str) -> None: self._package_manager.removePackage(package_id, force_add = True) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index eac6646197..ca6271391e 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -63,6 +63,7 @@ class XmlMaterialProfile(InstanceContainer): # Prevent recursion if not apply_to_all: + super().addMetaDataEntry(key, value) super().setMetaDataEntry(key, value) return @@ -74,12 +75,14 @@ class XmlMaterialProfile(InstanceContainer): # Update the root material container root_material_container = material_group.root_material_node.getContainer() if root_material_container is not None: + root_material_container.addMetaDataEntry(key, value) root_material_container.setMetaDataEntry(key, value, apply_to_all = False) # Update all containers derived from it for node in material_group.derived_material_node_list: container = node.getContainer() if container is not None: + container.addMetaDataEntry(key, value) container.setMetaDataEntry(key, value, apply_to_all = False) ## Overridden from InstanceContainer, similar to setMetaDataEntry.