mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-06-04 11:14:21 +08:00
Fix quality definition comparison in quality importing
CURA-4946
This commit is contained in:
parent
877d061a1b
commit
22573a685d
@ -16,6 +16,7 @@ from .QualityGroup import QualityGroup
|
|||||||
from .QualityNode import QualityNode
|
from .QualityNode import QualityNode
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
from UM.Settings.DefinitionContainer import DefinitionContainer
|
||||||
from cura.Settings.GlobalStack import GlobalStack
|
from cura.Settings.GlobalStack import GlobalStack
|
||||||
from .QualityChangesGroup import QualityChangesGroup
|
from .QualityChangesGroup import QualityChangesGroup
|
||||||
|
|
||||||
@ -178,7 +179,7 @@ class QualityManager(QObject):
|
|||||||
|
|
||||||
# Returns a dict of "custom profile name" -> QualityChangesGroup
|
# Returns a dict of "custom profile name" -> QualityChangesGroup
|
||||||
def getQualityChangesGroups(self, machine: "GlobalStack") -> dict:
|
def getQualityChangesGroups(self, machine: "GlobalStack") -> dict:
|
||||||
machine_definition_id = getMachineDefinitionIDForQualitySearch(machine)
|
machine_definition_id = getMachineDefinitionIDForQualitySearch(machine.definition)
|
||||||
|
|
||||||
machine_node = self._machine_quality_type_to_quality_changes_dict.get(machine_definition_id)
|
machine_node = self._machine_quality_type_to_quality_changes_dict.get(machine_definition_id)
|
||||||
if not machine_node:
|
if not machine_node:
|
||||||
@ -206,7 +207,7 @@ class QualityManager(QObject):
|
|||||||
# For more details, see QualityGroup.
|
# For more details, see QualityGroup.
|
||||||
#
|
#
|
||||||
def getQualityGroups(self, machine: "GlobalStack") -> dict:
|
def getQualityGroups(self, machine: "GlobalStack") -> dict:
|
||||||
machine_definition_id = getMachineDefinitionIDForQualitySearch(machine)
|
machine_definition_id = getMachineDefinitionIDForQualitySearch(machine.definition)
|
||||||
|
|
||||||
# This determines if we should only get the global qualities for the global stack and skip the global qualities for the extruder stacks
|
# This determines if we should only get the global qualities for the global stack and skip the global qualities for the extruder stacks
|
||||||
has_variant_materials = parseBool(machine.getMetaDataEntry("has_variant_materials", False))
|
has_variant_materials = parseBool(machine.getMetaDataEntry("has_variant_materials", False))
|
||||||
@ -315,7 +316,7 @@ class QualityManager(QObject):
|
|||||||
return quality_group_dict
|
return quality_group_dict
|
||||||
|
|
||||||
def getQualityGroupsForMachineDefinition(self, machine: "GlobalStack") -> dict:
|
def getQualityGroupsForMachineDefinition(self, machine: "GlobalStack") -> dict:
|
||||||
machine_definition_id = getMachineDefinitionIDForQualitySearch(machine)
|
machine_definition_id = getMachineDefinitionIDForQualitySearch(machine.definition)
|
||||||
|
|
||||||
# To find the quality container for the GlobalStack, check in the following fall-back manner:
|
# To find the quality container for the GlobalStack, check in the following fall-back manner:
|
||||||
# (1) the machine-specific node
|
# (1) the machine-specific node
|
||||||
@ -460,7 +461,7 @@ class QualityManager(QObject):
|
|||||||
quality_changes.addMetaDataEntry("position", extruder_stack.getMetaDataEntry("position"))
|
quality_changes.addMetaDataEntry("position", extruder_stack.getMetaDataEntry("position"))
|
||||||
|
|
||||||
# If the machine specifies qualities should be filtered, ensure we match the current criteria.
|
# If the machine specifies qualities should be filtered, ensure we match the current criteria.
|
||||||
machine_definition_id = getMachineDefinitionIDForQualitySearch(machine)
|
machine_definition_id = getMachineDefinitionIDForQualitySearch(machine.definition)
|
||||||
quality_changes.setDefinition(machine_definition_id)
|
quality_changes.setDefinition(machine_definition_id)
|
||||||
|
|
||||||
quality_changes.addMetaDataEntry("setting_version", self._application.SettingVersion)
|
quality_changes.addMetaDataEntry("setting_version", self._application.SettingVersion)
|
||||||
@ -480,12 +481,13 @@ class QualityManager(QObject):
|
|||||||
# Example: for an Ultimaker 3 Extended, it has "quality_definition = ultimaker3". This means Ultimaker 3 Extended
|
# Example: for an Ultimaker 3 Extended, it has "quality_definition = ultimaker3". This means Ultimaker 3 Extended
|
||||||
# shares the same set of qualities profiles as Ultimaker 3.
|
# shares the same set of qualities profiles as Ultimaker 3.
|
||||||
#
|
#
|
||||||
def getMachineDefinitionIDForQualitySearch(machine: "GlobalStack", default_definition_id: str = "fdmprinter") -> str:
|
def getMachineDefinitionIDForQualitySearch(machine_definition: "DefinitionContainer",
|
||||||
|
default_definition_id: str = "fdmprinter") -> str:
|
||||||
machine_definition_id = default_definition_id
|
machine_definition_id = default_definition_id
|
||||||
if parseBool(machine.getMetaDataEntry("has_machine_quality", False)):
|
if parseBool(machine_definition.getMetaDataEntry("has_machine_quality", False)):
|
||||||
# Only use the machine's own quality definition ID if this machine has machine quality.
|
# Only use the machine's own quality definition ID if this machine has machine quality.
|
||||||
machine_definition_id = machine.getMetaDataEntry("quality_definition")
|
machine_definition_id = machine_definition.getMetaDataEntry("quality_definition")
|
||||||
if machine_definition_id is None:
|
if machine_definition_id is None:
|
||||||
machine_definition_id = machine.definition.getId()
|
machine_definition_id = machine_definition.getId()
|
||||||
|
|
||||||
return machine_definition_id
|
return machine_definition_id
|
||||||
|
@ -216,16 +216,21 @@ class CuraContainerRegistry(ContainerRegistry):
|
|||||||
# Make sure we have a profile_definition in the file:
|
# Make sure we have a profile_definition in the file:
|
||||||
if profile_definition is None:
|
if profile_definition is None:
|
||||||
break
|
break
|
||||||
|
machine_definition = self.findDefinitionContainers(id = profile_definition)
|
||||||
|
if not machine_definition:
|
||||||
|
Logger.log("e", "Incorrect profile [%s]. Unknown machine type [%s]", file_name, profile_definition)
|
||||||
|
return {"status": "error",
|
||||||
|
"message": catalog.i18nc("@info:status Don't translate the XML tags <filename> or <message>!", "This profile <filename>{0}</filename> contains incorrect data, could not import it.", file_name)
|
||||||
|
}
|
||||||
|
machine_definition = machine_definition[0]
|
||||||
|
|
||||||
# Get the expected machine definition.
|
# Get the expected machine definition.
|
||||||
# i.e.: We expect gcode for a UM2 Extended to be defined as normal UM2 gcode...
|
# i.e.: We expect gcode for a UM2 Extended to be defined as normal UM2 gcode...
|
||||||
|
profile_definition = getMachineDefinitionIDForQualitySearch(machine_definition)
|
||||||
expected_machine_definition = getMachineDefinitionIDForQualitySearch(global_container_stack.definition)
|
expected_machine_definition = getMachineDefinitionIDForQualitySearch(global_container_stack.definition)
|
||||||
|
|
||||||
# ...but that's not always the case for Cura 3.1 and older, so also get the current machine:
|
|
||||||
current_machine_definition = global_container_stack.definition.getId()
|
|
||||||
|
|
||||||
# And check if the profile_definition matches either one (showing error if not):
|
# And check if the profile_definition matches either one (showing error if not):
|
||||||
if profile_definition not in (expected_machine_definition, current_machine_definition):
|
if profile_definition != expected_machine_definition:
|
||||||
Logger.log("e", "Profile [%s] is for machine [%s] but the current active machine is [%s]. Will not import the profile", file_name, profile_definition, expected_machine_definition)
|
Logger.log("e", "Profile [%s] is for machine [%s] but the current active machine is [%s]. Will not import the profile", file_name, profile_definition, expected_machine_definition)
|
||||||
return { "status": "error",
|
return { "status": "error",
|
||||||
"message": catalog.i18nc("@info:status Don't translate the XML tags <filename> or <message>!", "The machine defined in profile <filename>{0}</filename> ({1}) doesn't match with your current machine ({2}), could not import it.", file_name, profile_definition, expected_machine_definition)}
|
"message": catalog.i18nc("@info:status Don't translate the XML tags <filename> or <message>!", "The machine defined in profile <filename>{0}</filename> ({1}) doesn't match with your current machine ({2}), could not import it.", file_name, profile_definition, expected_machine_definition)}
|
||||||
@ -345,9 +350,8 @@ class CuraContainerRegistry(ContainerRegistry):
|
|||||||
if not quality_type:
|
if not quality_type:
|
||||||
return catalog.i18nc("@info:status", "Profile is missing a quality type.")
|
return catalog.i18nc("@info:status", "Profile is missing a quality type.")
|
||||||
|
|
||||||
quality_type_criteria = {"quality_type": quality_type}
|
|
||||||
global_stack = Application.getInstance().getGlobalContainerStack()
|
global_stack = Application.getInstance().getGlobalContainerStack()
|
||||||
definition_id = getMachineDefinitionIDForQualitySearch(global_stack)
|
definition_id = getMachineDefinitionIDForQualitySearch(global_stack.definition)
|
||||||
profile.setDefinition(definition_id)
|
profile.setDefinition(definition_id)
|
||||||
|
|
||||||
# Check to make sure the imported profile actually makes sense in context of the current configuration.
|
# Check to make sure the imported profile actually makes sense in context of the current configuration.
|
||||||
|
@ -628,7 +628,7 @@ class MachineManager(QObject):
|
|||||||
@pyqtProperty(str, notify = globalContainerChanged)
|
@pyqtProperty(str, notify = globalContainerChanged)
|
||||||
def activeQualityDefinitionId(self) -> str:
|
def activeQualityDefinitionId(self) -> str:
|
||||||
if self._global_container_stack:
|
if self._global_container_stack:
|
||||||
return getMachineDefinitionIDForQualitySearch(self._global_container_stack)
|
return getMachineDefinitionIDForQualitySearch(self._global_container_stack.definition)
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
## Gets how the active definition calls variants
|
## Gets how the active definition calls variants
|
||||||
|
@ -122,7 +122,7 @@ class ThreeMFReader(MeshReader):
|
|||||||
um_node.callDecoration("setActiveExtruder", default_stack.getId())
|
um_node.callDecoration("setActiveExtruder", default_stack.getId())
|
||||||
|
|
||||||
# Get the definition & set it
|
# Get the definition & set it
|
||||||
definition_id = getMachineDefinitionIDForQualitySearch(global_container_stack)
|
definition_id = getMachineDefinitionIDForQualitySearch(global_container_stack.definition)
|
||||||
um_node.callDecoration("getStack").getTop().setDefinition(definition_id)
|
um_node.callDecoration("getStack").getTop().setDefinition(definition_id)
|
||||||
|
|
||||||
setting_container = um_node.callDecoration("getStack").getTop()
|
setting_container = um_node.callDecoration("getStack").getTop()
|
||||||
|
@ -719,7 +719,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
|
|
||||||
# Get the correct extruder definition IDs for quality changes
|
# Get the correct extruder definition IDs for quality changes
|
||||||
from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch
|
from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch
|
||||||
machine_definition_id_for_quality = getMachineDefinitionIDForQualitySearch(global_stack)
|
machine_definition_id_for_quality = getMachineDefinitionIDForQualitySearch(global_stack.definition)
|
||||||
machine_definition_for_quality = self._container_registry.findDefinitionContainers(id = machine_definition_id_for_quality)[0]
|
machine_definition_for_quality = self._container_registry.findDefinitionContainers(id = machine_definition_id_for_quality)[0]
|
||||||
|
|
||||||
quality_changes_info = self._machine_info.quality_changes_info
|
quality_changes_info = self._machine_info.quality_changes_info
|
||||||
|
Loading…
x
Reference in New Issue
Block a user