Fix project loading for version upgrade

CURA-5054
This commit is contained in:
Lipu Fei 2018-03-09 17:16:24 +01:00
parent a81981a27a
commit e09325bf82
2 changed files with 15 additions and 30 deletions

View file

@ -386,7 +386,7 @@ class QualityManager(QObject):
if quality_changes_group is None: if quality_changes_group is None:
# create global quality changes only # create global quality changes only
new_quality_changes = self._createQualityChanges(quality_group.quality_type, quality_changes_name, new_quality_changes = self._createQualityChanges(quality_group.quality_type, quality_changes_name,
global_stack, extruder_id = None) global_stack, None)
self._container_registry.addContainer(new_quality_changes) self._container_registry.addContainer(new_quality_changes)
else: else:
new_name = self._container_registry.uniqueName(quality_changes_name) new_name = self._container_registry.uniqueName(quality_changes_name)

View file

@ -216,11 +216,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
archive = zipfile.ZipFile(file_name, "r") archive = zipfile.ZipFile(file_name, "r")
cura_file_names = [name for name in archive.namelist() if name.startswith("Cura/")] cura_file_names = [name for name in archive.namelist() if name.startswith("Cura/")]
# A few lists of containers in this project files.
# When loading the global stack file, it may be associated with those containers, which may or may not be
# in Cura already, so we need to provide them as alternative search lists.
instance_container_list = []
resolve_strategy_keys = ["machine", "material", "quality_changes"] resolve_strategy_keys = ["machine", "material", "quality_changes"]
self._resolve_strategies = {k: None for k in resolve_strategy_keys} self._resolve_strategies = {k: None for k in resolve_strategy_keys}
containers_found_dict = {k: False for k in resolve_strategy_keys} containers_found_dict = {k: False for k in resolve_strategy_keys}
@ -307,13 +302,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
container_info = ContainerInfo(instance_container_file_name, serialized, parser) container_info = ContainerInfo(instance_container_file_name, serialized, parser)
instance_container_info_dict[container_id] = container_info instance_container_info_dict[container_id] = container_info
instance_container = InstanceContainer(container_id) container_type = parser["metadata"]["type"]
# Deserialize InstanceContainer by converting read data from bytes to string
instance_container.deserialize(serialized, file_name = instance_container_file_name)
instance_container_list.append(instance_container)
container_type = instance_container.getMetaDataEntry("type")
if container_type == "quality_changes": if container_type == "quality_changes":
quality_changes_info_list.append(container_info) quality_changes_info_list.append(container_info)
@ -321,20 +310,22 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._machine_info.quality_changes_info.name = parser["general"]["name"] self._machine_info.quality_changes_info.name = parser["general"]["name"]
self._machine_info.quality_changes_info.global_info = container_info self._machine_info.quality_changes_info.global_info = container_info
quality_name = instance_container.getName() quality_name = parser["general"]["name"]
num_settings_overriden_by_quality_changes += len(instance_container._instances) num_settings_overriden_by_quality_changes += len(parser.get("values", {}))
# Check if quality changes already exists. # Check if quality changes already exists.
quality_changes = self._container_registry.findInstanceContainers(id = container_id) quality_changes = self._container_registry.findInstanceContainers(id = container_id)
if quality_changes: if quality_changes:
containers_found_dict["quality_changes"] = True containers_found_dict["quality_changes"] = True
# Check if there really is a conflict by comparing the values # Check if there really is a conflict by comparing the values
instance_container = InstanceContainer(container_id)
instance_container.deserialize(serialized, file_name = instance_container_file_name)
if quality_changes[0] != instance_container: if quality_changes[0] != instance_container:
quality_changes_conflict = True quality_changes_conflict = True
elif container_type == "quality": elif container_type == "quality":
if not quality_name: if not quality_name:
quality_name = instance_container.getName() quality_name = parser["general"]["name"]
elif container_type == "user": elif container_type == "user":
num_user_settings += len(instance_container._instances) num_user_settings += len(parser["values"])
elif container_type in self._ignored_instance_container_types: elif container_type in self._ignored_instance_container_types:
# Ignore certain instance container types # Ignore certain instance container types
Logger.log("w", "Ignoring instance container [%s] with type [%s]", container_id, container_type) Logger.log("w", "Ignoring instance container [%s] with type [%s]", container_id, container_type)
@ -739,7 +730,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
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)
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]
extruder_dict_for_quality = machine_definition_for_quality.getMetaDataEntry("machine_extruder_trains")
quality_changes_info = self._machine_info.quality_changes_info quality_changes_info = self._machine_info.quality_changes_info
quality_changes_quality_type = quality_changes_info.global_info.parser["metadata"]["quality_type"] quality_changes_quality_type = quality_changes_info.global_info.parser["metadata"]["quality_type"]
@ -752,13 +742,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
quality_changes_name = self._container_registry.uniqueName(quality_changes_name) quality_changes_name = self._container_registry.uniqueName(quality_changes_name)
for position, container_info in container_info_dict.items(): for position, container_info in container_info_dict.items():
extruder_definition_id = None extruder_stack = None
if position is not None: if position is not None:
extruder_definition_id = extruder_dict_for_quality[position] extruder_stack = global_stack.extruders[position]
container = quality_manager._createQualityChanges(quality_changes_quality_type, container = quality_manager._createQualityChanges(quality_changes_quality_type,
quality_changes_name, quality_changes_name,
global_stack, extruder_definition_id) global_stack, extruder_stack)
container_info.container = container container_info.container = container
container.setDirty(True) container.setDirty(True)
self._container_registry.addContainer(container) self._container_registry.addContainer(container)
@ -781,18 +770,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
container_info = quality_changes_info.extruder_info_dict[position] container_info = quality_changes_info.extruder_info_dict[position]
container_info.container = container container_info.container = container
for position, container_info in quality_changes_info.extruder_info_dict.items():
container_info.definition_id = extruder_dict_for_quality[position]
# If there is no quality changes for any extruder, create one. # If there is no quality changes for any extruder, create one.
if not quality_changes_info.extruder_info_dict: if not quality_changes_info.extruder_info_dict:
container_info = ContainerInfo(None, None, None) container_info = ContainerInfo(None, None, None)
quality_changes_info.extruder_info_dict["0"] = container_info quality_changes_info.extruder_info_dict["0"] = container_info
extruder_definition_id = extruder_dict_for_quality["0"] extruder_stack = global_stack.extruders["0"]
container_info.definition_id = extruder_definition_id
container = quality_manager._createQualityChanges(quality_changes_quality_type, quality_changes_name, container = quality_manager._createQualityChanges(quality_changes_quality_type, quality_changes_name,
global_stack, extruder_definition_id) global_stack, extruder_stack)
container_info.container = container container_info.container = container
container.setDirty(True) container.setDirty(True)
self._container_registry.addContainer(container) self._container_registry.addContainer(container)
@ -818,9 +803,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
continue continue
if container_info.container is None: if container_info.container is None:
extruder_definition_id = extruder_dict_for_quality[position] extruder_stack = global_stack.extruders[position]
container = quality_manager._createQualityChanges(quality_changes_quality_type, quality_changes_name, container = quality_manager._createQualityChanges(quality_changes_quality_type, quality_changes_name,
global_stack, extruder_definition_id) global_stack, extruder_stack)
container_info.container = container container_info.container = container
for key, value in container_info.parser["values"].items(): for key, value in container_info.parser["values"].items():