CURA-4606 reimplemented duplicate profile

This commit is contained in:
Jack Ha 2018-02-19 16:47:04 +01:00
parent 7a78f9821f
commit bd10f23311
3 changed files with 46 additions and 92 deletions

View file

@ -1,4 +1,4 @@
from typing import Optional from typing import List, Optional
from PyQt5.Qt import QObject, pyqtSlot from PyQt5.Qt import QObject, pyqtSlot
@ -25,3 +25,11 @@ class ContainerGroup(QObject):
for key in node.getContainer().getAllKeys(): for key in node.getContainer().getAllKeys():
result.add(key) result.add(key)
return result return result
def getAllNodes(self) -> List[ContainerNode]:
result = []
if self.node_for_global is not None:
result.append(self.node_for_global)
for extruder_node in self.nodes_for_extruders.values():
result.append(extruder_node)
return result

View file

@ -424,7 +424,8 @@ class ContainerManager(QObject):
continue continue
extruder_id = None if stack is global_stack else QualityManager.getInstance().getParentMachineDefinition(stack.getBottom()).getId() extruder_id = None if stack is global_stack else QualityManager.getInstance().getParentMachineDefinition(stack.getBottom()).getId()
new_changes = self._createQualityChanges(quality_container, unique_name, quality_type = quality_container.getMetaDataEntry("quality_type")
new_changes = self._createQualityChanges(quality_type, unique_name,
Application.getInstance().getGlobalContainerStack().getBottom(), Application.getInstance().getGlobalContainerStack().getBottom(),
extruder_id) extruder_id)
self._performMerge(new_changes, quality_changes_container, clear_settings = False) self._performMerge(new_changes, quality_changes_container, clear_settings = False)
@ -526,91 +527,22 @@ class ContainerManager(QObject):
self._machine_manager.activeQualityChanged.emit() self._machine_manager.activeQualityChanged.emit()
return True return True
## Duplicate a specified set of quality or quality_changes containers. @pyqtSlot(str, dict)
# def duplicateQualityChanges(self, quality_changes_name, quality_model_item):
# This will search for containers matching the specified name. If the container is a "quality" type container, a new quality_group = quality_model_item["quality_group"]
# quality_changes container will be created with the specified quality as base. If the container is a "quality_changes" quality_changes_group = quality_model_item["quality_changes_group"]
# container, it is simply duplicated and renamed. if quality_changes_group is None:
# # create global quality changes only
# \param quality_name The name of the quality to duplicate. new_quality_changes = self._createQualityChanges(
# quality_group.quality_type, quality_changes_name,
# \return A string containing the name of the duplicated containers, or an empty string if it failed. Application.getInstance().getGlobalContainerStack().definition,
@pyqtSlot(str, str, result = str) extruder_id = None)
def duplicateQualityOrQualityChanges(self, quality_name, base_name): self._container_registry.addContainer(new_quality_changes)
global_stack = Application.getInstance().getGlobalContainerStack() else:
if not global_stack or not quality_name: for node in quality_changes_group.getAllNodes():
return "" container = node.getContainer()
machine_definition = global_stack.definition new_id = self._container_registry.uniqueName(container.getId())
self._container_registry.addContainer(container.duplicate(new_id, quality_changes_name))
active_stacks = ExtruderManager.getInstance().getActiveGlobalAndExtruderStacks()
if active_stacks is None:
return ""
material_metadatas = [stack.material.getMetaData() for stack in active_stacks]
result = self._duplicateQualityOrQualityChangesForMachineType(quality_name, base_name,
QualityManager.getInstance().getParentMachineDefinition(machine_definition),
material_metadatas)
return result[0].getName() if result else ""
## Duplicate a quality or quality changes profile specific to a machine type
#
# \param quality_name The name of the quality or quality changes container to duplicate.
# \param base_name The desired name for the new container.
# \param machine_definition The machine with the specific machine type.
# \param material_metadatas Metadata of materials
# \return List of duplicated quality profiles.
def _duplicateQualityOrQualityChangesForMachineType(self, quality_name: str, base_name: str, machine_definition: DefinitionContainer, material_metadatas: List[Dict[str, Any]]) -> List[InstanceContainer]:
Logger.log("d", "Attempting to duplicate the quality %s", quality_name)
if base_name is None:
base_name = quality_name
# Try to find a Quality with the name.
container = QualityManager.getInstance().findQualityByName(quality_name, machine_definition, material_metadatas)
if container:
Logger.log("d", "We found a quality to duplicate.")
return self._duplicateQualityForMachineType(container, base_name, machine_definition)
Logger.log("d", "We found a quality_changes to duplicate.")
# Assume it is a quality changes.
return self._duplicateQualityChangesForMachineType(quality_name, base_name, machine_definition)
# Duplicate a quality profile
def _duplicateQualityForMachineType(self, quality_container, base_name, machine_definition) -> List[InstanceContainer]:
if base_name is None:
base_name = quality_container.getName()
new_name = self._container_registry.uniqueName(base_name)
new_change_instances = []
# Handle the global stack first.
global_changes = self._createQualityChanges(quality_container, new_name, machine_definition, None)
new_change_instances.append(global_changes)
self._container_registry.addContainer(global_changes)
# Handle the extruders if present.
extruders = machine_definition.getMetaDataEntry("machine_extruder_trains")
if extruders:
for extruder_id in extruders:
extruder = extruders[extruder_id]
new_changes = self._createQualityChanges(quality_container, new_name, machine_definition, extruder)
new_change_instances.append(new_changes)
self._container_registry.addContainer(new_changes)
return new_change_instances
# Duplicate a quality changes container
def _duplicateQualityChangesForMachineType(self, quality_changes_name, base_name, machine_definition) -> List[InstanceContainer]:
new_change_instances = []
for container in QualityManager.getInstance().findQualityChangesByName(quality_changes_name,
machine_definition):
base_id = container.getMetaDataEntry("extruder")
if not base_id:
base_id = container.getDefinition().getId()
new_unique_id = self._createUniqueId(base_id, base_name)
new_container = container.duplicate(new_unique_id, base_name)
new_change_instances.append(new_container)
self._container_registry.addContainer(new_container)
return new_change_instances
@pyqtSlot("QVariant") @pyqtSlot("QVariant")
def removeMaterial(self, material_node): def removeMaterial(self, material_node):
@ -832,14 +764,14 @@ class ContainerManager(QObject):
# \param extruder_id # \param extruder_id
# #
# \return A new quality_changes container with the specified container as base. # \return A new quality_changes container with the specified container as base.
def _createQualityChanges(self, quality_container, new_name, machine_definition, extruder_id): def _createQualityChanges(self, quality_type, new_name, machine_definition, extruder_id):
base_id = machine_definition.getId() if extruder_id is None else extruder_id base_id = machine_definition.getId() if extruder_id is None else extruder_id
# Create a new quality_changes container for the quality. # Create a new quality_changes container for the quality.
quality_changes = InstanceContainer(self._createUniqueId(base_id, new_name)) quality_changes = InstanceContainer(self._createUniqueId(base_id, new_name))
quality_changes.setName(new_name) quality_changes.setName(new_name)
quality_changes.addMetaDataEntry("type", "quality_changes") quality_changes.addMetaDataEntry("type", "quality_changes")
quality_changes.addMetaDataEntry("quality_type", quality_container.getMetaDataEntry("quality_type")) quality_changes.addMetaDataEntry("quality_type", quality_type)
# If we are creating a container for an extruder, ensure we add that to the container # If we are creating a container for an extruder, ensure we add that to the container
if extruder_id is not None: if extruder_id is not None:

View file

@ -103,7 +103,9 @@ Item
visible: !base.canCreateProfile visible: !base.canCreateProfile
onClicked: { onClicked: {
// TODO newDuplicateNameDialog.object = Cura.ContainerManager.makeUniqueName(base.currentItem.name);
newDuplicateNameDialog.open();
newDuplicateNameDialog.selectText();
} }
} }
@ -154,8 +156,7 @@ Item
} }
} }
// Dialog to request a name when creating a new profile
// Dialog to request a name when creating a new profile
UM.RenameDialog UM.RenameDialog
{ {
title: catalog.i18nc("@title:window", "Create Profile") title: catalog.i18nc("@title:window", "Create Profile")
@ -168,6 +169,19 @@ Item
} }
} }
// Dialog to request a name when duplicating a new profile
UM.RenameDialog
{
title: catalog.i18nc("@title:window", "Duplicate Profile")
id: newDuplicateNameDialog;
object: "<new name>";
onAccepted:
{
Cura.ContainerManager.duplicateQualityChanges(newName, base.currentItem);
objectList.currentIndex = -1 //Reset selection.
}
}
Item { Item {
id: contentsItem id: contentsItem