Improve GUID check by parsing xml and getting GUID specifically inside the metadata tag.

Remove exporting materials from disabled extruders

CURA-8610
This commit is contained in:
j.delarago 2022-05-31 10:00:25 +02:00
parent 3dec025cb8
commit cdc08b5d54
3 changed files with 19 additions and 3 deletions

View file

@ -10,6 +10,8 @@ from cura.Settings.GlobalStack import GlobalStack
from UM.PackageManager import PackageManager # The class we're extending. from UM.PackageManager import PackageManager # The class we're extending.
from UM.Resources import Resources # To find storage paths for some resource types. from UM.Resources import Resources # To find storage paths for some resource types.
from UM.i18n import i18nCatalog from UM.i18n import i18nCatalog
from plugins.XmlMaterialProfile.XmlMaterialProfile import XmlMaterialProfile
catalog = i18nCatalog("cura") catalog = i18nCatalog("cura")
if TYPE_CHECKING: if TYPE_CHECKING:
@ -65,7 +67,8 @@ class CuraPackageManager(PackageManager):
with open(root + "/" + file_name, encoding="utf-8") as f: with open(root + "/" + file_name, encoding="utf-8") as f:
# Make sure the file we found has the same guid as our material # Make sure the file we found has the same guid as our material
# Parsing this xml would be better but the namespace is needed to search it. # Parsing this xml would be better but the namespace is needed to search it.
if guid in f.read(): parsed_guid = XmlMaterialProfile.getMetadataFromSerialized(f.read(), "GUID")
if guid == parsed_guid:
return package_id return package_id
continue continue

View file

@ -201,10 +201,14 @@ class UFPWriter(MeshWriter):
package_manager = cast(CuraPackageManager, CuraApplication.getInstance().getPackageManager()) package_manager = cast(CuraPackageManager, CuraApplication.getInstance().getPackageManager())
for extruder in CuraApplication.getInstance().getExtruderManager().getActiveExtruderStacks(): for extruder in CuraApplication.getInstance().getExtruderManager().getActiveExtruderStacks():
if not extruder.isEnabled:
# Don't export materials not in use
continue
package_id = package_manager.getMaterialFilePackageId(extruder.material.getFileName(), extruder.material.getMetaDataEntry("GUID")) package_id = package_manager.getMaterialFilePackageId(extruder.material.getFileName(), extruder.material.getMetaDataEntry("GUID"))
package_data = package_manager.getInstalledPackageInfo(package_id) package_data = package_manager.getInstalledPackageInfo(package_id)
if package_data.get("is_bundled"): if not package_data or package_data.get("is_bundled"):
continue continue
material_metadata = {"id": package_id, material_metadata = {"id": package_id,

View file

@ -480,6 +480,15 @@ class XmlMaterialProfile(InstanceContainer):
return version * 1000000 + setting_version return version * 1000000 + setting_version
@classmethod
def getMetadataFromSerialized(cls, serialized: str, property_name: str) -> str:
data = ET.fromstring(serialized)
metadata = data.find("./um:metadata", cls.__namespaces)
property = metadata.find("./um:" + property_name, cls.__namespaces)
# This is a necessary property != None check, xml library overrides __bool__ to return False in cases when Element is not None.
return property.text if property != None else ""
def deserialize(self, serialized, file_name = None): def deserialize(self, serialized, file_name = None):
"""Overridden from InstanceContainer""" """Overridden from InstanceContainer"""