Implement complete code for currentAvailableIntents

Slightly more complex than the original pseudocode was indicating: It needs to filter on the available quality types first in order to only show the quality types that can be printed with all extruders, but still show the union of all intents for those quality types.

Contributes to issue CURA-6091.
This commit is contained in:
Ghostkeeper 2019-06-20 14:48:18 +02:00
parent c83b9d158b
commit 28e2569c86
No known key found for this signature in database
GPG key ID: 86BEF881AE2CF276
2 changed files with 16 additions and 8 deletions

View file

@ -194,9 +194,9 @@ class QualityManager(QObject):
return quality_changes_group_dict
#
# Gets all quality groups for the given machine. Both available and none available ones will be included.
# Gets all quality groups for the given machine. Both available and unavailable ones will be included.
# It returns a dictionary with "quality_type"s as keys and "QualityGroup"s as values.
# Whether a QualityGroup is available can be unknown via the field QualityGroup.is_available.
# Whether a QualityGroup is available can be known via the field QualityGroup.is_available.
# For more details, see QualityGroup.
#
def getQualityGroups(self, machine: "GlobalStack") -> Dict[str, QualityGroup]:

View file

@ -5,6 +5,7 @@ from PyQt5.QtCore import pyqtProperty, pyqtSignal
from typing import Any, Dict, List, Tuple, TYPE_CHECKING
from cura.CuraApplication import CuraApplication
from cura.Machines.QualityManager import QualityManager
from cura.Settings.ExtruderManager import ExtruderManager
from cura.Settings.MachineManager import MachineManager
from UM.Settings.ContainerRegistry import ContainerRegistry
@ -59,15 +60,22 @@ class IntentManager:
# \return A list of tuples of intent_category and quality_type. The actual
# instance may vary per extruder.
def currentAvailableIntents(self) -> List[Tuple[str, str]]:
final_intent_ids = {metadata["id"] for metadata in ContainerRegistry.getInstance().findContainersMetadata(type = "intent", definition = current_definition_id)} #All intents that match the global stack.
for extruder in all_extruders:
extruder_intent_ids = {metadata["id"] for metadata in self.intentMetadatas(current_definition_id, extruder_nozzle_id, extruder_material_id)}
final_intent_ids = final_intent_ids.intersection(extruder_intent_ids)
application = CuraApplication.getInstance()
quality_groups = application.getQualityManager().getQualityGroups(application.getGlobalContainerStack())
available_quality_types = {quality_group.quality_type for quality_group in quality_groups if quality_group.node_for_global is not None}
final_intent_ids = set()
global_stack = application.getGlobalContainerStack()
current_definition_id = global_stack.definition.getMetaDataEntry("id")
for extruder_stack in ExtruderManager.getInstance().getUsedExtruderStacks():
nozzle_name = extruder_stack.variant.getMetaDataEntry("name")
material_id = extruder_stack.material.getMetaDataEntry("base_file")
final_intent_ids |= {metadata["id"] for metadata in self.intentMetadatas(current_definition_id, nozzle_name, material_id) if metadata["quality_type"] in available_quality_types}
result = set()
for intent_id in final_intent_ids:
intent = ContainerRegistry.getInstance().findContainers(id = intent_id)[0]
result.add((intent.getMetaDataEntry("intent_category"), intent.getMetaDataEntry("quality_type")))
intent_metadata = ContainerRegistry.getInstance().findContainersMetadata(id = intent_id)[0]
result.add((intent_metadata["intent_category"], intent_metadata["quality_type"]))
return list(result)
## List of intent categories to be displayed in the interface.