Просмотр исходного кода

Merge branch 'master' of github.com:Ultimaker/Cura into transparent_limit_to_extruder

Arjen Hiemstra 7 лет назад
Родитель
Сommit
9686df285d

+ 3 - 2
cura/BuildVolume.py

@@ -433,7 +433,8 @@ class BuildVolume(SceneNode):
                 self._global_container_stack.getProperty("raft_interface_thickness", "value") +
                 self._global_container_stack.getProperty("raft_surface_layers", "value") *
                     self._global_container_stack.getProperty("raft_surface_thickness", "value") +
-                self._global_container_stack.getProperty("raft_airgap", "value"))
+                self._global_container_stack.getProperty("raft_airgap", "value") -
+                self._global_container_stack.getProperty("layer_0_z_overlap", "value"))
 
         # Rounding errors do not matter, we check if raft_thickness has changed at all
         if old_raft_thickness != self._raft_thickness:
@@ -951,7 +952,7 @@ class BuildVolume(SceneNode):
         return max(min(value, max_value), min_value)
 
     _skirt_settings = ["adhesion_type", "skirt_gap", "skirt_line_count", "skirt_brim_line_width", "brim_width", "brim_line_count", "raft_margin", "draft_shield_enabled", "draft_shield_dist"]
-    _raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap"]
+    _raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap", "layer_0_z_overlap"]
     _extra_z_settings = ["retraction_hop_enabled", "retraction_hop"]
     _prime_settings = ["extruder_prime_pos_x", "extruder_prime_pos_y", "extruder_prime_pos_z", "prime_blob_enable"]
     _tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y"]

+ 1 - 2
cura/ConvexHullDecorator.py

@@ -328,8 +328,7 @@ class ConvexHullDecorator(SceneNodeDecorator):
         return self.__isDescendant(root, node.getParent())
 
     _affected_settings = [
-        "adhesion_type", "raft_base_thickness", "raft_interface_thickness", "raft_surface_layers",
-        "raft_surface_thickness", "raft_airgap", "raft_margin", "print_sequence",
+        "adhesion_type", "raft_margin", "print_sequence",
         "skirt_gap", "skirt_line_count", "skirt_brim_line_width", "skirt_distance", "brim_line_count"]
 
     ##  Settings that change the convex hull.

+ 7 - 2
cura/CuraApplication.py

@@ -99,6 +99,11 @@ if not MYPY:
 
 
 class CuraApplication(QtApplication):
+    # SettingVersion represents the set of settings available in the machine/extruder definitions.
+    # You need to make sure that this version number needs to be increased if there is any non-backwards-compatible
+    # changes of the settings.
+    SettingVersion = 1
+
     class ResourceTypes:
         QmlFiles = Resources.UserType + 1
         Firmware = Resources.UserType + 2
@@ -169,11 +174,11 @@ class CuraApplication(QtApplication):
 
         UM.VersionUpgradeManager.VersionUpgradeManager.getInstance().setCurrentVersions(
             {
-                ("quality", InstanceContainer.Version):    (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"),
+                ("quality_changes", InstanceContainer.Version * 1000000 + self.SettingVersion):    (self.ResourceTypes.QualityInstanceContainer, "application/x-uranium-instancecontainer"),
                 ("machine_stack", ContainerStack.Version): (self.ResourceTypes.MachineStack, "application/x-uranium-containerstack"),
                 ("extruder_train", ContainerStack.Version): (self.ResourceTypes.ExtruderStack, "application/x-uranium-extruderstack"),
                 ("preferences", Preferences.Version):               (Resources.Preferences, "application/x-uranium-preferences"),
-                ("user", InstanceContainer.Version):       (self.ResourceTypes.UserInstanceContainer, "application/x-uranium-instancecontainer")
+                ("user", InstanceContainer.Version * 1000000 + self.SettingVersion):       (self.ResourceTypes.UserInstanceContainer, "application/x-uranium-instancecontainer")
             }
         )
 

+ 2 - 1
cura/Settings/ContainerManager.py

@@ -918,7 +918,8 @@ class ContainerManager(QObject):
             quality_changes.setDefinition(self._container_registry.findContainers(id = "fdmprinter")[0])
         else:
             quality_changes.setDefinition(QualityManager.getInstance().getParentMachineDefinition(machine_definition))
-        quality_changes.addMetaDataEntry("setting_version", quality_changes.getDefinition().getMetaDataEntry("setting_version", default = 0))
+        from cura.CuraApplication import CuraApplication
+        quality_changes.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
         return quality_changes
 
 

+ 3 - 1
cura/Settings/CuraContainerRegistry.py

@@ -22,6 +22,8 @@ from . import GlobalStack
 from .ContainerManager import ContainerManager
 from .ExtruderManager import ExtruderManager
 
+from cura.CuraApplication import CuraApplication
+
 from UM.i18n import i18nCatalog
 catalog = i18nCatalog("cura")
 
@@ -43,7 +45,7 @@ class CuraContainerRegistry(ContainerRegistry):
 
         if isinstance(container, InstanceContainer) and type(container) != type(self.getEmptyInstanceContainer()):
             #Check against setting version of the definition.
-            required_setting_version = int(container.getDefinition().getMetaDataEntry("setting_version", default = 0))
+            required_setting_version = CuraApplication.SettingVersion
             actual_setting_version = int(container.getMetaDataEntry("setting_version", default = 0))
             if required_setting_version != actual_setting_version:
                 Logger.log("w", "Instance container {container_id} is outdated. Its setting version is {actual_setting_version} but it should be {required_setting_version}.".format(container_id = container.getId(), actual_setting_version = actual_setting_version, required_setting_version = required_setting_version))

+ 4 - 3
cura/Settings/CuraStackBuilder.py

@@ -9,7 +9,6 @@ from UM.Settings.ContainerRegistry import ContainerRegistry
 
 from .GlobalStack import GlobalStack
 from .ExtruderStack import ExtruderStack
-from .CuraContainerStack import CuraContainerStack
 from typing import Optional
 
 
@@ -76,7 +75,8 @@ class CuraStackBuilder:
         user_container = InstanceContainer(new_stack_id + "_user")
         user_container.addMetaDataEntry("type", "user")
         user_container.addMetaDataEntry("extruder", new_stack_id)
-        user_container.addMetaDataEntry("setting_version", machine_definition.getMetaDataEntry("setting_version", default = 0))
+        from cura.CuraApplication import CuraApplication
+        user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
         user_container.setDefinition(machine_definition)
 
         stack.setUserChanges(user_container)
@@ -125,7 +125,8 @@ class CuraStackBuilder:
         user_container = InstanceContainer(new_stack_id + "_user")
         user_container.addMetaDataEntry("type", "user")
         user_container.addMetaDataEntry("machine", new_stack_id)
-        user_container.addMetaDataEntry("setting_version", definition.getMetaDataEntry("setting_version", default = 0))
+        from cura.CuraApplication import CuraApplication
+        user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
         user_container.setDefinition(definition)
 
         stack.setUserChanges(user_container)

+ 4 - 2
cura/Settings/ExtruderManager.py

@@ -20,6 +20,7 @@ from typing import Optional, List, TYPE_CHECKING, Union
 
 if TYPE_CHECKING:
     from cura.Settings.ExtruderStack import ExtruderStack
+    from cura.Settings.GlobalStack import GlobalStack
 
 
 ##  Manages all existing extruder stacks.
@@ -362,7 +363,8 @@ class ExtruderManager(QObject):
             user_profile = InstanceContainer(extruder_stack_id + "_current_settings")  # Add an empty user profile.
             user_profile.addMetaDataEntry("type", "user")
             user_profile.addMetaDataEntry("extruder", extruder_stack_id)
-            user_profile.addMetaDataEntry("setting_version", machine_definition.getMetaDataEntry("setting_version", default = 0))
+            from cura.CuraApplication import CuraApplication
+            user_profile.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
             user_profile.setDefinition(machine_definition)
             container_registry.addContainer(user_profile)
         container_stack.addContainer(user_profile)
@@ -458,7 +460,7 @@ class ExtruderManager(QObject):
     #   \param machine_id The machine to remove the extruders for.
     def removeMachineExtruders(self, machine_id: str):
         for extruder in self.getMachineExtruders(machine_id):
-            ContainerRegistry.getInstance().removeContainer(extruder.user.getId())
+            ContainerRegistry.getInstance().removeContainer(extruder.userChanges.getId())
             ContainerRegistry.getInstance().removeContainer(extruder.getId())
 
     ##  Returns extruders for a specific machine.

+ 49 - 9
plugins/3MFReader/ThreeMFWorkspaceReader.py

@@ -46,6 +46,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
         self._extruder_stack_suffix = "." + ContainerRegistry.getMimeTypeForContainer(ExtruderStack).preferredSuffix
         self._global_stack_suffix = "." + ContainerRegistry.getMimeTypeForContainer(GlobalStack).preferredSuffix
 
+        # Certain instance container types are ignored because we make the assumption that only we make those types
+        # of containers. They are:
+        #  - quality
+        #  - variant
+        self._ignored_instance_container_types = {"quality", "variant"}
+
         self._resolve_strategies = {}
 
         self._id_mapping = {}
@@ -183,6 +189,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
         num_user_settings = 0
         quality_changes_conflict = False
         definition_changes_conflict = False
+
         for each_instance_container_file in instance_container_files:
             container_id = self._stripFileToId(each_instance_container_file)
             instance_container = InstanceContainer(container_id)
@@ -208,14 +215,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
                 if definition_changes:
                     if definition_changes[0] != instance_container:
                         definition_changes_conflict = True
-            elif container_type == "quality":
-                # If the quality name is not set (either by quality or changes, set it now)
-                # Quality changes should always override this (as they are "on top")
-                if quality_name == "":
-                    quality_name = instance_container.getName()
-                quality_type = instance_container.getName()
             elif container_type == "user":
                 num_user_settings += len(instance_container._instances)
+            elif container_type in self._ignored_instance_container_types:
+                # Ignore certain instance container types
+                Logger.log("w", "Ignoring instance container [%s] with type [%s]", container_id, container_type)
+                continue
 
             Job.yieldThread()
 
@@ -417,13 +422,29 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
         quality_and_definition_changes_instance_containers = []
         for instance_container_file in instance_container_files:
             container_id = self._stripFileToId(instance_container_file)
+            serialized = archive.open(instance_container_file).read().decode("utf-8")
+
+            # HACK! we ignore the "metadata/type = quality" instance containers!
+            parser = configparser.ConfigParser()
+            parser.read_string(serialized)
+            if not parser.has_option("metadata", "type"):
+                Logger.log("w", "Cannot find metadata/type in %s, ignoring it", instance_container_file)
+                continue
+            if parser.get("metadata", "type") == "quality":
+                continue
+
             instance_container = InstanceContainer(container_id)
 
             # Deserialize InstanceContainer by converting read data from bytes to string
-            instance_container.deserialize(archive.open(instance_container_file).read().decode("utf-8"))
+            instance_container.deserialize(serialized)
             container_type = instance_container.getMetaDataEntry("type")
             Job.yieldThread()
-            if container_type == "user":
+
+            if container_type in self._ignored_instance_container_types:
+                # Ignore certain instance container types
+                Logger.log("w", "Ignoring instance container [%s] with type [%s]", container_id, container_type)
+                continue
+            elif container_type == "user":
                 # Check if quality changes already exists.
                 user_containers = self._container_registry.findInstanceContainers(id = container_id)
                 if not user_containers:
@@ -571,8 +592,27 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
                 if container_stacks:
                     # this container stack already exists, try to resolve
                     stack = container_stacks[0]
+
                     if self._resolve_strategies["machine"] == "override":
-                        pass  # do nothing
+                        # NOTE: This is the same code as those in the lower part
+                        global_stacks = self._container_registry.findContainerStacks(id = global_stack_id_original)
+                        # deserialize new extruder stack over the current ones
+                        if global_stacks:
+                            old_extruder_stack_id = global_stacks[0].extruders[index].getId()
+                            # HACK delete file
+                            self._container_registry._deleteFiles(global_stacks[0].extruders[index])
+                            global_stacks[0].extruders[index].deserialize(archive.open(extruder_stack_file).read().decode("utf-8"))
+                            # HACK
+                            global_stacks[0]._extruders = global_stacks[0]._extruders[:2]
+                            # HACK update cache
+                            del self._container_registry._id_container_cache[old_extruder_stack_id]
+                            new_extruder_stack_id = global_stacks[0].extruders[index].getId()
+                            self._container_registry._id_container_cache[new_extruder_stack_id] = global_stacks[0].extruders[index]
+
+                            stack = global_stacks[0].extruders[index]
+                        else:
+                            Logger.log("w", "Could not find global stack, while I expected it: %s" % global_stack_id_original)
+
                     elif self._resolve_strategies["machine"] == "new":
                         # create a new extruder stack from this one
                         new_id = self.getNewId(container_id)

+ 11 - 0
plugins/3MFWriter/ThreeMFWorkspaceWriter.py

@@ -7,6 +7,7 @@ from cura.Settings.ExtruderManager import ExtruderManager
 import zipfile
 from io import StringIO
 import copy
+import configparser
 
 
 class ThreeMFWorkspaceWriter(WorkspaceWriter):
@@ -48,6 +49,16 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter):
         Preferences.getInstance().writeToFile(preferences_string)
         archive.writestr(preferences_file, preferences_string.getvalue())
 
+        # Save Cura version
+        version_file = zipfile.ZipInfo("Cura/version.ini")
+        version_config_parser = configparser.ConfigParser()
+        version_config_parser.add_section("versions")
+        version_config_parser.set("versions", "cura_version", Application.getStaticVersion())
+
+        version_file_string = StringIO()
+        version_config_parser.write(version_file_string)
+        archive.writestr(version_file, version_file_string.getvalue())
+
         # Close the archive & reset states.
         archive.close()
         mesh_writer.setStoreArchive(False)

+ 2 - 2
plugins/MachineSettingsAction/MachineSettingsAction.py

@@ -14,7 +14,7 @@ from UM.Settings.DefinitionContainer import DefinitionContainer
 from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
 from UM.Logger import Logger
 
-from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
+from cura.CuraApplication import CuraApplication
 from cura.Settings.ExtruderManager import ExtruderManager
 
 import UM.i18n
@@ -99,7 +99,7 @@ class MachineSettingsAction(MachineAction):
         definition = container_stack.getBottom()
         definition_changes_container.setDefinition(definition)
         definition_changes_container.addMetaDataEntry("type", "definition_changes")
-        definition_changes_container.addMetaDataEntry("setting_version", definition.getMetaDataEntry("setting_version", default = 0))
+        definition_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
 
         self._container_registry.addContainer(definition_changes_container)
         container_stack.definitionChanges = definition_changes_container

Некоторые файлы не были показаны из-за большого количества измененных файлов