mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 14:37:29 -06:00
Hide materials belong to a to-be-removed package
This commit is contained in:
parent
5255d6ca2a
commit
76417b7fb2
6 changed files with 46 additions and 10 deletions
|
@ -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))
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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] = {}
|
||||
|
||||
|
|
|
@ -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"],
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue