mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-08-09 14:55:03 -06:00
Merge branch 'feature_intent_container_tree' into feature_intent_upgrade
This commit is contained in:
commit
8d21f75c40
19 changed files with 78 additions and 200 deletions
|
@ -287,7 +287,8 @@ class MaterialManager(QObject):
|
|||
if root_material_id is not None:
|
||||
self.removeMaterialByRootId(root_material_id)
|
||||
|
||||
def duplicateMaterialByRootId(self, root_material_id, new_base_id: Optional[str] = None, new_metadata: Dict[str, Any] = None) -> Optional[str]:
|
||||
def duplicateMaterialByRootId(self, root_material_id: str, new_base_id: Optional[str] = None,
|
||||
new_metadata: Optional[Dict[str, Any]] = None) -> Optional[str]:
|
||||
container_registry = CuraContainerRegistry.getInstance()
|
||||
results = container_registry.findContainers(id=root_material_id)
|
||||
|
||||
|
@ -346,12 +347,14 @@ class MaterialManager(QObject):
|
|||
# Returns the root material ID of the duplicated material if successful.
|
||||
#
|
||||
@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) -> str:
|
||||
if material_node.container is None:
|
||||
Logger.log("e", "Material node {0} doesn't have container.".format(material_node.container_id))
|
||||
return "ERROR"
|
||||
root_material_id = cast(str, material_node.container.getMetaDataEntry("base_file", ""))
|
||||
return self.duplicateMaterialByRootId(root_material_id, new_base_id, new_metadata)
|
||||
new_material_id = self.duplicateMaterialByRootId(root_material_id, new_base_id, new_metadata)
|
||||
return new_material_id if new_material_id is not None else "ERROR"
|
||||
|
||||
# Create a new material by cloning Generic PLA for the current material diameter and generate a new GUID.
|
||||
# Returns the ID of the newly created material.
|
||||
|
|
|
@ -74,6 +74,8 @@ class IntentModel(ListModel):
|
|||
active_material_node = active_variant_node.materials[active_extruder.material.getMetaDataEntry("base_file")]
|
||||
layer_heights_added = []
|
||||
for quality_id, quality_node in active_material_node.qualities.items():
|
||||
if quality_node.quality_type not in quality_groups: # Don't add the empty quality type (or anything else that would crash, defensively).
|
||||
continue
|
||||
quality_group = quality_groups[quality_node.quality_type]
|
||||
layer_height = self._fetchLayerHeight(quality_group)
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ import cura.CuraApplication # Imported this way to prevent circular dependencie
|
|||
from cura.Machines.ContainerTree import ContainerTree
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from cura.Machines import QualityGroup
|
||||
from cura.Machines.QualityGroup import QualityGroup
|
||||
|
||||
|
||||
#
|
||||
|
|
|
@ -87,14 +87,15 @@ class ContainerManager(QObject):
|
|||
Logger.log("w", "Container node {0} doesn't have a container.".format(container_node.container_id))
|
||||
return False
|
||||
root_material_id = container_node.container.getMetaDataEntry("base_file", "")
|
||||
if cura.CuraApplication.CuraApplication.getInstance().getContainerRegistry().isReadOnly(root_material_id):
|
||||
container_registry = cura.CuraApplication.CuraApplication.getInstance().getContainerRegistry()
|
||||
if container_registry.isReadOnly(root_material_id):
|
||||
Logger.log("w", "Cannot set metadata of read-only container %s.", root_material_id)
|
||||
return False
|
||||
|
||||
material_group = MaterialManager.getInstance().getMaterialGroup(root_material_id)
|
||||
if material_group is None:
|
||||
Logger.log("w", "Unable to find material group for: %s.", root_material_id)
|
||||
root_material_query = container_registry.findContainers(id = root_material_id)
|
||||
if not root_material_query:
|
||||
Logger.log("w", "Unable to find root material: {root_material}.".format(root_material = root_material_id))
|
||||
return False
|
||||
root_material = root_material_query[0]
|
||||
|
||||
entries = entry_name.split("/")
|
||||
entry_name = entries.pop()
|
||||
|
@ -102,7 +103,7 @@ class ContainerManager(QObject):
|
|||
sub_item_changed = False
|
||||
if entries:
|
||||
root_name = entries.pop(0)
|
||||
root = material_group.root_material_node.container.getMetaDataEntry(root_name)
|
||||
root = root_material.getMetaDataEntry(root_name)
|
||||
|
||||
item = root
|
||||
for _ in range(len(entries)):
|
||||
|
@ -115,11 +116,9 @@ class ContainerManager(QObject):
|
|||
entry_name = root_name
|
||||
entry_value = root
|
||||
|
||||
container = material_group.root_material_node.container
|
||||
if container is not None:
|
||||
container.setMetaDataEntry(entry_name, entry_value)
|
||||
if sub_item_changed: #If it was only a sub-item that has changed then the setMetaDataEntry won't correctly notice that something changed, and we must manually signal that the metadata changed.
|
||||
container.metaDataChanged.emit(container)
|
||||
root_material.setMetaDataEntry(entry_name, entry_value)
|
||||
if sub_item_changed: #If it was only a sub-item that has changed then the setMetaDataEntry won't correctly notice that something changed, and we must manually signal that the metadata changed.
|
||||
root_material.metaDataChanged.emit(root_material)
|
||||
return True
|
||||
|
||||
@pyqtSlot(str, result = str)
|
||||
|
@ -355,11 +354,11 @@ class ContainerManager(QObject):
|
|||
if material_node.container is None:
|
||||
Logger.log("w", "Material node {0} doesn't have a container.".format(material_node.container_id))
|
||||
return
|
||||
material_group = MaterialManager.getInstance().getMaterialGroup(material_node.container.getMetaDataEntry("base_file", ""))
|
||||
|
||||
if material_group is None:
|
||||
root_material_query = cura.CuraApplication.CuraApplication.getInstance().getContainerRegistry().findInstanceContainers(id = material_node.getMetaDataEntry("base_file", ""))
|
||||
if not root_material_query:
|
||||
Logger.log("w", "Unable to find material group for %s", material_node)
|
||||
return
|
||||
root_material = root_material_query[0]
|
||||
|
||||
# Generate a new GUID
|
||||
new_guid = str(uuid.uuid4())
|
||||
|
@ -367,9 +366,7 @@ class ContainerManager(QObject):
|
|||
# Update the GUID
|
||||
# NOTE: We only need to set the root material container because XmlMaterialProfile.setMetaDataEntry() will
|
||||
# take care of the derived containers too
|
||||
container = material_group.root_material_node.container
|
||||
if container is not None:
|
||||
container.setMetaDataEntry("GUID", new_guid)
|
||||
root_material.setMetaDataEntry("GUID", new_guid)
|
||||
|
||||
def _performMerge(self, merge_into: InstanceContainer, merge: InstanceContainer, clear_settings: bool = True) -> None:
|
||||
if merge == merge_into:
|
||||
|
|
|
@ -25,6 +25,9 @@ EMPTY_MATERIAL_CONTAINER_ID = "empty_material"
|
|||
empty_material_container = copy.deepcopy(empty_container)
|
||||
empty_material_container.setMetaDataEntry("id", EMPTY_MATERIAL_CONTAINER_ID)
|
||||
empty_material_container.setMetaDataEntry("type", "material")
|
||||
empty_material_container.setMetaDataEntry("base_file", "empty_material")
|
||||
empty_material_container.setMetaDataEntry("GUID", "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF")
|
||||
empty_material_container.setMetaDataEntry("material", "empty")
|
||||
|
||||
# Empty quality
|
||||
EMPTY_QUALITY_CONTAINER_ID = "empty_quality"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue