Browse Source

Set definition by their ID

The new function for setting the definition just adds the ID to the metadata.

Contributes to issue CURA-4243.
Ghostkeeper 7 years ago
parent
commit
ebe766a7c8

+ 2 - 2
cura/Settings/ContainerManager.py

@@ -1001,9 +1001,9 @@ class ContainerManager(QObject):
 
         # If the machine specifies qualities should be filtered, ensure we match the current criteria.
         if not machine_definition.getMetaDataEntry("has_machine_quality"):
-            quality_changes.setDefinition(self._container_registry.findDefinitionContainers(id = "fdmprinter")[0])
+            quality_changes.setDefinition("fdmprinter")
         else:
-            quality_changes.setDefinition(QualityManager.getInstance().getParentMachineDefinition(machine_definition))
+            quality_changes.setDefinition(QualityManager.getInstance().getParentMachineDefinition(machine_definition).getId())
 
         from cura.CuraApplication import CuraApplication
         quality_changes.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)

+ 2 - 2
cura/Settings/CuraContainerRegistry.py

@@ -284,7 +284,7 @@ class CuraContainerRegistry(ContainerRegistry):
 
         quality_type_criteria = {"quality_type": quality_type}
         if self._machineHasOwnQualities():
-            profile.setDefinition(self._activeQualityDefinition())
+            profile.setDefinition(self._activeQualityDefinition().getId())
             if self._machineHasOwnMaterials():
                 active_material_id = self._activeMaterialId()
                 if active_material_id and active_material_id != "empty":  # only update if there is an active material
@@ -294,7 +294,7 @@ class CuraContainerRegistry(ContainerRegistry):
             quality_type_criteria["definition"] = profile.getDefinition().getId()
 
         else:
-            profile.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0])
+            profile.setDefinition(fdmprinter)
             quality_type_criteria["definition"] = "fdmprinter"
 
         machine_definition = Application.getInstance().getGlobalContainerStack().getBottom()

+ 7 - 7
cura/Settings/CuraStackBuilder.py

@@ -56,7 +56,7 @@ class CuraStackBuilder:
             new_extruder = cls.createExtruderStack(
                 new_extruder_id,
                 definition = extruder_definition,
-                machine_definition = machine_definition,
+                machine_definition_id = machine_definition.getId(),
                 quality = "default",
                 material = "default",
                 variant = "default",
@@ -69,12 +69,13 @@ class CuraStackBuilder:
     #
     #   \param new_stack_id The ID of the new stack.
     #   \param definition The definition to base the new stack on.
-    #   \param machine_definition The machine definition to use for the user container.
+    #   \param machine_definition_id The ID of the machine definition to use for
+    #   the user container.
     #   \param kwargs You can add keyword arguments to specify IDs of containers to use for a specific type, for example "variant": "0.4mm"
     #
     #   \return A new Global stack instance with the specified parameters.
     @classmethod
-    def createExtruderStack(cls, new_stack_id: str, definition: DefinitionContainerInterface, machine_definition: DefinitionContainerInterface, **kwargs) -> ExtruderStack:
+    def createExtruderStack(cls, new_stack_id: str, definition: DefinitionContainerInterface, machine_definition_id: str, **kwargs) -> ExtruderStack:
         stack = ExtruderStack(new_stack_id)
         stack.setName(definition.getName())
         stack.setDefinition(definition)
@@ -87,7 +88,7 @@ class CuraStackBuilder:
         user_container.addMetaDataEntry("extruder", new_stack_id)
         from cura.CuraApplication import CuraApplication
         user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
-        user_container.setDefinition(machine_definition)
+        user_container.setDefinition(machine_definition_id)
 
         stack.setUserChanges(user_container)
 
@@ -136,7 +137,7 @@ class CuraStackBuilder:
         user_container.addMetaDataEntry("machine", new_stack_id)
         from cura.CuraApplication import CuraApplication
         user_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
-        user_container.setDefinition(definition)
+        user_container.setDefinition(definition.getId())
 
         stack.setUserChanges(user_container)
 
@@ -172,8 +173,7 @@ class CuraStackBuilder:
         unique_container_name = ContainerRegistry.getInstance().uniqueName(container_name)
 
         definition_changes_container = InstanceContainer(unique_container_name)
-        definition = container_stack.getBottom()
-        definition_changes_container.setDefinition(definition)
+        definition_changes_container.setDefinition(container_stack.getBottom().getId())
         definition_changes_container.addMetaDataEntry("type", "definition_changes")
         definition_changes_container.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
 

+ 1 - 1
cura/Settings/ExtruderManager.py

@@ -379,7 +379,7 @@ class ExtruderManager(QObject):
             user_profile.addMetaDataEntry("extruder", extruder_stack_id)
             from cura.CuraApplication import CuraApplication
             user_profile.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
-            user_profile.setDefinition(machine_definition)
+            user_profile.setDefinition(machine_definition.getId())
             container_registry.addContainer(user_profile)
         container_stack.addContainer(user_profile)
 

+ 1 - 1
plugins/3MFReader/ThreeMFReader.py

@@ -124,7 +124,7 @@ class ThreeMFReader(MeshReader):
 
                 # Get the definition & set it
                 definition = QualityManager.getInstance().getParentMachineDefinition(global_container_stack.getBottom())
-                um_node.callDecoration("getStack").getTop().setDefinition(definition)
+                um_node.callDecoration("getStack").getTop().setDefinition(definition.getId())
 
             setting_container = um_node.callDecoration("getStack").getTop()
 

+ 2 - 2
plugins/GCodeWriter/GCodeWriter.py

@@ -75,9 +75,9 @@ class GCodeWriter(MeshWriter):
     def _createFlattenedContainerInstance(self, instance_container1, instance_container2):
         flat_container = InstanceContainer(instance_container2.getName())
         if instance_container1.getDefinition():
-            flat_container.setDefinition(instance_container1.getDefinition())
+            flat_container.setDefinition(instance_container1.getDefinition().getId())
         else:
-            flat_container.setDefinition(instance_container2.getDefinition())
+            flat_container.setDefinition(instance_container2.getDefinition().getId())
         flat_container.setMetaData(copy.deepcopy(instance_container2.getMetaData()))
 
         for key in instance_container2.getAllKeys():

+ 1 - 1
plugins/LegacyProfileReader/LegacyProfileReader.py

@@ -121,7 +121,7 @@ class LegacyProfileReader(ProfileReader):
             Logger.log("e", "Dictionary of Doom has no translation. Is it the correct JSON file?")
             return None
         current_printer_definition = global_container_stack.getBottom()
-        profile.setDefinition(current_printer_definition)
+        profile.setDefinition(current_printer_definition.getId())
         for new_setting in dict_of_doom["translation"]:  # Evaluate all new settings that would get a value from the translations.
             old_setting_expression = dict_of_doom["translation"][new_setting]
             compiled = compile(old_setting_expression, new_setting, "eval")

+ 5 - 3
plugins/XmlMaterialProfile/XmlMaterialProfile.py

@@ -496,8 +496,9 @@ class XmlMaterialProfile(InstanceContainer):
 
         meta_data["approximate_diameter"] = str(round(float(property_values.get("diameter", 2.85)))) # In mm
         meta_data["properties"] = property_values
+        meta_data["definition"] = "fdmprinter"
 
-        self.setDefinition(ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")[0])
+        self.setDefinition("fdmprinter")
 
         common_compatibility = True
         settings = data.iterfind("./um:settings/um:setting", self.__namespaces)
@@ -569,7 +570,7 @@ class XmlMaterialProfile(InstanceContainer):
                         is_new_material = True
 
                     new_material.setMetaData(copy.deepcopy(self.getMetaData()))
-                    new_material.setDefinition(definition)
+                    new_material.setDefinition(machine_id)
                     # Don't use setMetadata, as that overrides it for all materials with same base file
                     new_material.getMetaData()["compatible"] = machine_compatibility
                     new_material.getMetaData()["machine_manufacturer"] = machine_manufacturer
@@ -623,7 +624,7 @@ class XmlMaterialProfile(InstanceContainer):
                     # Update the private directly, as we want to prevent the lookup that is done when using setName
                     new_hotend_material.setName(self.getName())
                     new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData()))
-                    new_hotend_material.setDefinition(definition)
+                    new_hotend_material.setDefinition(machine_id)
                     new_hotend_material.addMetaDataEntry("variant", variant_containers[0]["id"])
                     # Don't use setMetadata, as that overrides it for all materials with same base file
                     new_hotend_material.getMetaData()["compatible"] = hotend_compatibility
@@ -706,6 +707,7 @@ class XmlMaterialProfile(InstanceContainer):
 
         base_metadata["approximate_diameter"] = str(round(float(property_values.get("diameter", 2.85)))) # In mm
         base_metadata["properties"] = property_values
+        base_metadata["definition"] = "fdmprinter"
 
         compatible_entries = data.iterfind("./um:settings/um:setting[@key='hardware compatible']", cls.__namespaces)
         try:

+ 3 - 3
tests/Settings/TestCuraContainerRegistry.py

@@ -74,7 +74,7 @@ def test_addContainerGoodSettingVersion(container_registry, definition_container
 
     instance = UM.Settings.InstanceContainer.InstanceContainer(container_id = "Test Instance")
     instance.addMetaDataEntry("setting_version", CuraApplication.SettingVersion)
-    instance.setDefinition(definition_container)
+    instance.setDefinition(definition_container.getId())
 
     mock_super_add_container = unittest.mock.MagicMock() #Take the role of the Uranium-ContainerRegistry where the resulting containers get registered.
     with unittest.mock.patch("UM.Settings.ContainerRegistry.ContainerRegistry.addContainer", mock_super_add_container):
@@ -89,7 +89,7 @@ def test_addContainerNoSettingVersion(container_registry, definition_container):
 
     instance = UM.Settings.InstanceContainer.InstanceContainer(container_id = "Test Instance")
     #Don't add setting_version metadata.
-    instance.setDefinition(definition_container)
+    instance.setDefinition(definition_container.getId())
 
     mock_super_add_container = unittest.mock.MagicMock() #Take the role of the Uranium-ContainerRegistry where the resulting container should not get registered.
     with unittest.mock.patch("UM.Settings.ContainerRegistry.ContainerRegistry.addContainer", mock_super_add_container):
@@ -104,7 +104,7 @@ def test_addContainerBadSettingVersion(container_registry, definition_container)
 
     instance = UM.Settings.InstanceContainer.InstanceContainer(container_id = "Test Instance")
     instance.addMetaDataEntry("setting_version", 9001) #Wrong version!
-    instance.setDefinition(definition_container)
+    instance.setDefinition(definition_container.getId())
 
     mock_super_add_container = unittest.mock.MagicMock() #Take the role of the Uranium-ContainerRegistry where the resulting container should not get registered.
     with unittest.mock.patch("UM.Settings.ContainerRegistry.ContainerRegistry.addContainer", mock_super_add_container):