Browse Source

CURA-5138 generate unique name for each per object setting container, fix per object settings being lost when multiplying

Jack Ha 7 years ago
parent
commit
c7a3d33411
1 changed files with 9 additions and 1 deletions
  1. 9 1
      cura/Settings/SettingOverrideDecorator.py

+ 9 - 1
cura/Settings/SettingOverrideDecorator.py

@@ -2,6 +2,7 @@
 # Cura is released under the terms of the LGPLv3 or higher.
 
 import copy
+import uuid
 
 from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
 from UM.Signal import Signal, signalemitter
@@ -34,7 +35,7 @@ class SettingOverrideDecorator(SceneNodeDecorator):
         super().__init__()
         self._stack = PerObjectContainerStack(container_id = "per_object_stack_" + str(id(self)))
         self._stack.setDirty(False)  # This stack does not need to be saved.
-        user_container = InstanceContainer(container_id = "SettingOverrideInstanceContainer")
+        user_container = InstanceContainer(container_id = self._generateUniqueName())
         user_container.addMetaDataEntry("type", "user")
         self._stack.userChanges = user_container
         self._extruder_stack = ExtruderManager.getInstance().getExtruderStack(0).getId()
@@ -49,12 +50,19 @@ class SettingOverrideDecorator(SceneNodeDecorator):
         self.activeExtruderChanged.connect(self._updateNextStack)
         self._updateNextStack()
 
+    def _generateUniqueName(self):
+        return "SettingOverrideInstanceContainer-%s" % uuid.uuid1()
+
     def __deepcopy__(self, memo):
         ## Create a fresh decorator object
         deep_copy = SettingOverrideDecorator()
+
         ## Copy the instance
         instance_container = copy.deepcopy(self._stack.getContainer(0), memo)
 
+        # A unique name must be added, or replaceContainer will not replace it
+        instance_container.setMetaDataEntry("id", self._generateUniqueName)
+
         ## Set the copied instance as the first (and only) instance container of the stack.
         deep_copy._stack.replaceContainer(0, instance_container)