diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 8e3298597c..6c70930bae 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -52,16 +52,8 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): def serialize(self): registry = UM.Settings.ContainerRegistry.getInstance() - all_containers = registry.findInstanceContainers(GUID = self.getMetaDataEntry("GUID")) - most_generic = all_containers[0] - for container in all_containers: - # Find the "most generic" version of this material - # This is a bit of a nasty implementation because of the naive assumption that anything with a shorter - # id is more generic. It holds for the current implementation though. - if len(most_generic.id) > len(container.id): - most_generic = container - - if most_generic and self.id != most_generic.id: + base_file = self.getMetaDataEntry("base_file", "") + if base_file and self.id != base_file: # Since we create an instance of XmlMaterialProfile for each machine and nozzle in the profile, # we should only serialize the "base" material definition, since that can then take care of # serializing the machine/nozzle specific profiles. @@ -81,6 +73,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): metadata.pop("status", "") metadata.pop("variant", "") metadata.pop("type", "") + metadata.pop("base_file", "") ## Begin Name Block builder.start("name") @@ -129,6 +122,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): machine_container_map = {} machine_nozzle_map = {} + all_containers = registry.findInstanceContainers(GUID = self.getMetaDataEntry("GUID")) for container in all_containers: definition_id = container.getDefinition().id if definition_id == "fdmprinter": @@ -136,8 +130,6 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): if definition_id not in machine_container_map: machine_container_map[definition_id] = container - elif len(container.id) < len(machine_container_map[definition_id].id): - machine_container_map[definition_id] = container if definition_id not in machine_nozzle_map: machine_nozzle_map[definition_id] = {} @@ -145,6 +137,9 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): variant = container.getMetaDataEntry("variant") if variant: machine_nozzle_map[definition_id][variant] = container + continue + + machine_container_map[definition_id] = container for definition_id, container in machine_container_map.items(): definition = container.getDefinition() @@ -278,6 +273,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): new_material.setName(self.getName()) new_material.setMetaData(copy.deepcopy(self.getMetaData())) new_material.setDefinition(definition) + new_material.addMetaDataEntry("base_file", self.id) for key, value in global_setting_values.items(): new_material.setProperty(key, "value", value, definition) @@ -308,6 +304,7 @@ class XmlMaterialProfile(UM.Settings.InstanceContainer): new_hotend_material.setName(self.getName()) new_hotend_material.setMetaData(copy.deepcopy(self.getMetaData())) new_hotend_material.setDefinition(definition) + new_hotend_material.addMetaDataEntry("base_file", self.id) new_hotend_material.addMetaDataEntry("variant", variant_containers[0].id)