Fix resetting not supported profiles for project loading

CURA-4617
This commit is contained in:
Lipu Fei 2017-11-27 10:50:30 +01:00
parent 8082c092e5
commit 4a4f01f9eb

View file

@ -13,6 +13,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry
from UM.MimeTypeDatabase import MimeTypeDatabase from UM.MimeTypeDatabase import MimeTypeDatabase
from UM.Job import Job from UM.Job import Job
from UM.Preferences import Preferences from UM.Preferences import Preferences
from UM.Util import parseBool
from .WorkspaceDialog import WorkspaceDialog from .WorkspaceDialog import WorkspaceDialog
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
@ -793,6 +794,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0] empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0]
for stack in [global_stack] + extruder_stacks: for stack in [global_stack] + extruder_stacks:
stack.replaceContainer(_ContainerIndexes.Quality, empty_quality_container) stack.replaceContainer(_ContainerIndexes.Quality, empty_quality_container)
empty_quality_changes_container = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0]
for stack in [global_stack] + extruder_stacks:
stack.replaceContainer(_ContainerIndexes.QualityChanges, empty_quality_changes_container)
# Fix quality: # Fix quality:
# The quality specified in an old project file can be wrong, for example, for UM2, it should be "um2_normal" # The quality specified in an old project file can be wrong, for example, for UM2, it should be "um2_normal"
@ -800,22 +804,23 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# Note that this only seems to happen on single-extrusion machines on the global stack, so we only apply the # Note that this only seems to happen on single-extrusion machines on the global stack, so we only apply the
# fix for that # fix for that
quality = global_stack.quality quality = global_stack.quality
has_empty_quality = True
project_quality_is_not_supported = True
if quality.getId() not in ("empty", "empty_quality"): if quality.getId() not in ("empty", "empty_quality"):
has_empty_quality = False
quality_type = quality.getMetaDataEntry("quality_type") quality_type = quality.getMetaDataEntry("quality_type")
quality_containers = self._container_registry.findInstanceContainers(definition = global_stack.definition.getId(), search_criteria = {"type": "quality",
type = "quality", "quality_type": quality_type}
quality_type = quality_type) if parseBool(global_stack.definition.getMetaDataEntry("has_machine_quality", "False")):
quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] search_criteria["definition"] = global_stack.definition.getId()
if quality_containers:
global_stack.quality = quality_containers[0]
else: else:
# look for "fdmprinter" qualities if the machine-specific qualities cannot be found search_criteria["definition"] = "fdmprinter"
quality_containers = self._container_registry.findInstanceContainers(definition = "fdmprinter",
type = "quality", quality_containers = self._container_registry.findInstanceContainers(**search_criteria)
quality_type = quality_type)
quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""]
if quality_containers: if quality_containers:
global_stack.quality = quality_containers[0] global_stack.quality = quality_containers[0]
project_quality_is_not_supported = False
else: else:
# the quality_type of the quality profile cannot be found. # the quality_type of the quality profile cannot be found.
# this can happen if a quality_type has been removed in a newer version, for example: # this can happen if a quality_type has been removed in a newer version, for example:
@ -828,11 +833,41 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""] quality_containers = [q for q in quality_containers if q.getMetaDataEntry("material", "") == ""]
if quality_containers: if quality_containers:
global_stack.quality = quality_containers[0] global_stack.quality = quality_containers[0]
else:
if not quality_containers:
# This should not happen! # This should not happen!
Logger.log("e", "Cannot find quality normal for global stack [%s] [%s]", Logger.log("e", "Cannot find quality normal for global stack [%s] [%s]",
global_stack.getId(), global_stack.definition.getId()) global_stack.getId(), global_stack.definition.getId())
global_stack.quality = self._container_registry.findInstanceContainers(id = "empty_quality")[0] has_empty_quality = True
if project_quality_is_not_supported:
empty_quality_container = self._container_registry.findInstanceContainers(id = "empty_quality")[0]
empty_quality_changes_container = self._container_registry.findInstanceContainers(id = "empty_quality_changes")[0]
if has_empty_quality:
for stack in [global_stack] + extruder_stacks:
stack.quality = empty_quality_container
stack.qualityChanges = empty_quality_changes_container
else:
for stack in [global_stack] + extruder_stacks:
stack.qualityChanges = empty_quality_changes_container
# for extruder stacks, the quality containers also need to be switched
for stack in extruder_stacks:
search_criteria = {"type": "quality",
"quality_type": "normal"}
if parseBool(global_stack.definition.getMetaDataEntry("has_machine_quality", "False")):
search_criteria["definition"] = global_stack.definition.getId()
else:
search_criteria["definition"] = "fdmprinter"
if parseBool(global_stack.getMetaDataEntry("has_machine_material")):
search_criteria["material"] = stack.material.getId()
quality_containers = self._container_registry.findInstanceContainers(**search_criteria)
if quality_containers:
stack.quality = quality_containers[0]
else:
Logger.log("e", "Cannot find quality container for extruder stack [%s]", stack.getId())
# Replacing the old containers if resolve is "new". # Replacing the old containers if resolve is "new".
# When resolve is "new", some containers will get renamed, so all the other containers that reference to those # When resolve is "new", some containers will get renamed, so all the other containers that reference to those
@ -856,7 +891,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
global_stack.userChanges = container global_stack.userChanges = container
continue continue
for changes_container_type in ("quality_changes", "definition_changes"): changes_container_types = ("quality_changes", "definition_changes")
if project_quality_is_not_supported:
# DO NOT replace quality_changes if the current quality_type is not supported
changes_container_types = ("definition_changes",)
for changes_container_type in changes_container_types:
if self._resolve_strategies[changes_container_type] == "new": if self._resolve_strategies[changes_container_type] == "new":
# Quality changes needs to get a new ID, added to registry and to the right stacks # Quality changes needs to get a new ID, added to registry and to the right stacks
for each_changes_container in quality_and_definition_changes_instance_containers: for each_changes_container in quality_and_definition_changes_instance_containers: