From 2a3eed30abf43d09cf74ee99bc0bcc3f1f9a7741 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 8 Jun 2018 11:21:17 +0200 Subject: [PATCH 1/2] CURA-5444 Always create the instance of the material even if it is not compatible, otherwise it will never show as incompatible if the material profile doesn't define hotends in the machine. --- .../XmlMaterialProfile/XmlMaterialProfile.py | 49 ++++++++++--------- plugins/XmlMaterialProfile/product_to_id.json | 1 + 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 148471fb6d..241ec2a711 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -632,35 +632,36 @@ class XmlMaterialProfile(InstanceContainer): machine_manufacturer = identifier.get("manufacturer", definition.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. - if machine_compatibility: - new_material_id = self.getId() + "_" + machine_id + # Always create the instance of the material even if it is not compatible, otherwise it will never + # show as incompatible if the material profile doesn't define hotends in the machine - CURA-5444 + new_material_id = self.getId() + "_" + machine_id - # The child or derived material container may already exist. This can happen when a material in a - # project file and the a material in Cura have the same ID. - # In the case if a derived material already exists, override that material container because if - # the data in the parent material has been changed, the derived ones should be updated too. - if ContainerRegistry.getInstance().isLoaded(new_material_id): - new_material = ContainerRegistry.getInstance().findContainers(id = new_material_id)[0] - is_new_material = False - else: - new_material = XmlMaterialProfile(new_material_id) - is_new_material = True + # The child or derived material container may already exist. This can happen when a material in a + # project file and the a material in Cura have the same ID. + # In the case if a derived material already exists, override that material container because if + # the data in the parent material has been changed, the derived ones should be updated too. + if ContainerRegistry.getInstance().isLoaded(new_material_id): + new_material = ContainerRegistry.getInstance().findContainers(id = new_material_id)[0] + is_new_material = False + else: + new_material = XmlMaterialProfile(new_material_id) + is_new_material = True - new_material.setMetaData(copy.deepcopy(self.getMetaData())) - new_material.getMetaData()["id"] = new_material_id - new_material.getMetaData()["name"] = self.getName() - 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 - new_material.getMetaData()["definition"] = machine_id + new_material.setMetaData(copy.deepcopy(self.getMetaData())) + new_material.getMetaData()["id"] = new_material_id + new_material.getMetaData()["name"] = self.getName() + 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 + new_material.getMetaData()["definition"] = machine_id - new_material.setCachedValues(cached_machine_setting_properties) + new_material.setCachedValues(cached_machine_setting_properties) - new_material._dirty = False + new_material._dirty = False - if is_new_material: - containers_to_add.append(new_material) + if is_new_material: + containers_to_add.append(new_material) # Find the buildplates compatibility buildplates = machine.iterfind("./um:buildplate", self.__namespaces) diff --git a/plugins/XmlMaterialProfile/product_to_id.json b/plugins/XmlMaterialProfile/product_to_id.json index d6b8f3bade..3e7ce9311f 100644 --- a/plugins/XmlMaterialProfile/product_to_id.json +++ b/plugins/XmlMaterialProfile/product_to_id.json @@ -8,5 +8,6 @@ "Ultimaker 3 Extended": "ultimaker3_extended", "Ultimaker Original": "ultimaker_original", "Ultimaker Original+": "ultimaker_original_plus", + "Ultimaker Original Dual Extrusion": "ultimaker_original_dual", "IMADE3D JellyBOX": "imade3d_jellybox" } \ No newline at end of file From e5699918ead6d3835b6c4fa54820003f8bbe3ec5 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Fri, 8 Jun 2018 12:03:46 +0200 Subject: [PATCH 2/2] CURA-5444 Also get the metadata even if the material was marked as not compatible. --- .../XmlMaterialProfile/XmlMaterialProfile.py | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py index 241ec2a711..4985c2fd87 100644 --- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py +++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py @@ -872,22 +872,23 @@ class XmlMaterialProfile(InstanceContainer): machine_manufacturer = identifier.get("manufacturer", definition_metadata.get("manufacturer", "Unknown")) #If the XML material doesn't specify a manufacturer, use the one in the actual printer definition. - if machine_compatibility: - new_material_id = container_id + "_" + machine_id + # Always create the instance of the material even if it is not compatible, otherwise it will never + # show as incompatible if the material profile doesn't define hotends in the machine - CURA-5444 + new_material_id = container_id + "_" + machine_id - # Do not look for existing container/container metadata with the same ID although they may exist. - # In project loading and perhaps some other places, we only want to get information (metadata) - # from a file without changing the current state of the system. If we overwrite the existing - # metadata here, deserializeMetadata() will not be safe for retrieving information. - new_material_metadata = {} + # Do not look for existing container/container metadata with the same ID although they may exist. + # In project loading and perhaps some other places, we only want to get information (metadata) + # from a file without changing the current state of the system. If we overwrite the existing + # metadata here, deserializeMetadata() will not be safe for retrieving information. + new_material_metadata = {} - new_material_metadata.update(base_metadata) - new_material_metadata["id"] = new_material_id - new_material_metadata["compatible"] = machine_compatibility - new_material_metadata["machine_manufacturer"] = machine_manufacturer - new_material_metadata["definition"] = machine_id + new_material_metadata.update(base_metadata) + new_material_metadata["id"] = new_material_id + new_material_metadata["compatible"] = machine_compatibility + new_material_metadata["machine_manufacturer"] = machine_manufacturer + new_material_metadata["definition"] = machine_id - result_metadata.append(new_material_metadata) + result_metadata.append(new_material_metadata) buildplates = machine.iterfind("./um:buildplate", cls.__namespaces) buildplate_map = {}