Browse Source

Merge pull request #13888 from Ultimaker/CURA-9931_cache_product_id_table

[CURA-9931] Cache and genericize ID to Product table.
Joey de l'Arago 2 years ago
parent
commit
36fcc34bbd

+ 10 - 3
plugins/XmlMaterialProfile/XmlMaterialProfile.py

@@ -1125,21 +1125,28 @@ class XmlMaterialProfile(InstanceContainer):
         id_list = list(id_list)
         return id_list
 
+    __product_to_id_map: Optional[Dict[str, List[str]]] = None
+
     @classmethod
     def getProductIdMap(cls) -> Dict[str, List[str]]:
         """Gets a mapping from product names in the XML files to their definition IDs.
 
         This loads the mapping from a file.
         """
+        if cls.__product_to_id_map is not None:
+            return cls.__product_to_id_map
 
         plugin_path = cast(str, PluginRegistry.getInstance().getPluginPath("XmlMaterialProfile"))
         product_to_id_file = os.path.join(plugin_path, "product_to_id.json")
         with open(product_to_id_file, encoding = "utf-8") as f:
-            product_to_id_map = json.load(f)
-        product_to_id_map = {key: [value] for key, value in product_to_id_map.items()}
+            contents = ""
+            for line in f:
+                contents += line if "#" not in line else "".join([line.replace("#", str(n)) for n in range(1, 12)])
+            cls.__product_to_id_map = json.loads(contents)
+        cls.__product_to_id_map = {key: [value] for key, value in cls.__product_to_id_map.items()}
         #This also loads "Ultimaker S5" -> "ultimaker_s5" even though that is not strictly necessary with the default to change spaces into underscores.
         #However it is not always loaded with that default; this mapping is also used in serialize() without that default.
-        return product_to_id_map
+        return cls.__product_to_id_map
 
     @staticmethod
     def _parseCompatibleValue(value: str):

+ 7 - 10
plugins/XmlMaterialProfile/product_to_id.json

@@ -1,14 +1,11 @@
 {
-    "Ultimaker 2": "ultimaker2",
-    "Ultimaker 2 Extended": "ultimaker2_extended",
-    "Ultimaker 2 Extended+": "ultimaker2_extended_plus",
-    "Ultimaker 2 Go": "ultimaker2_go",
-    "Ultimaker 2+": "ultimaker2_plus",
-    "Ultimaker 2+ Connect": "ultimaker2_plus_connect",
-    "Ultimaker 3": "ultimaker3",
-    "Ultimaker 3 Extended": "ultimaker3_extended",
-    "Ultimaker S3": "ultimaker_s3",
-    "Ultimaker S5": "ultimaker_s5",
+    "Ultimaker #": "ultimaker#",
+    "Ultimaker # Extended": "ultimaker#_extended",
+    "Ultimaker # Extended+": "ultimaker#_extended_plus",
+    "Ultimaker # Go": "ultimaker#_go",
+    "Ultimaker #+": "ultimaker#_plus",
+    "Ultimaker #+ Connect": "ultimaker#_plus_connect",
+    "Ultimaker S#": "ultimaker_s#",
     "Ultimaker Original": "ultimaker_original",
     "Ultimaker Original+": "ultimaker_original_plus",
     "Ultimaker Original Dual Extrusion": "ultimaker_original_dual",