Просмотр исходного кода

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

Remove exporting materials from disabled extruders

CURA-8610
j.delarago 2 лет назад
Родитель
Сommit
cdc08b5d54

+ 5 - 2
cura/CuraPackageManager.py

@@ -10,6 +10,8 @@ from cura.Settings.GlobalStack import GlobalStack
 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.i18n import i18nCatalog
+from plugins.XmlMaterialProfile.XmlMaterialProfile import XmlMaterialProfile
+
 catalog = i18nCatalog("cura")
 
 if TYPE_CHECKING:
@@ -59,13 +61,14 @@ class CuraPackageManager(PackageManager):
 
             for root, _, file_names in os.walk(material_package.path):
                 if file_name not in file_names:
-                    #File with the name we are looking for is not in this directory
+                    # File with the name we are looking for is not in this directory
                     continue
 
                 with open(root + "/" + file_name, encoding="utf-8") as f:
                     # 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.
-                    if guid in f.read():
+                    parsed_guid = XmlMaterialProfile.getMetadataFromSerialized(f.read(), "GUID")
+                    if guid == parsed_guid:
                         return package_id
                     continue
 

+ 5 - 1
plugins/UFPWriter/UFPWriter.py

@@ -201,10 +201,14 @@ class UFPWriter(MeshWriter):
         package_manager = cast(CuraPackageManager, CuraApplication.getInstance().getPackageManager())
 
         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_data = package_manager.getInstalledPackageInfo(package_id)
 
-            if package_data.get("is_bundled"):
+            if not package_data or package_data.get("is_bundled"):
                 continue
 
             material_metadata = {"id": package_id,

+ 9 - 0
plugins/XmlMaterialProfile/XmlMaterialProfile.py

@@ -480,6 +480,15 @@ class XmlMaterialProfile(InstanceContainer):
 
         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):
         """Overridden from InstanceContainer"""