diff options
author | j.delarago <joeydelarago@gmail.com> | 2022-06-08 11:22:24 +0300 |
---|---|---|
committer | j.delarago <joeydelarago@gmail.com> | 2022-06-08 11:22:24 +0300 |
commit | 71a817697bd3a0c5cb941efa9c4c7f3c944593af (patch) | |
tree | d6bbeb1ed80e410f6d3baf1845ca0bbf05c0c46a /cura/CuraPackageManager.py | |
parent | de8a58f0d7e2ca5cc9e4b7966d6a7d6201118b0b (diff) |
Before this change packages were only being checked if they were bundled after loading the package_id. However only installed packages were being loaded so this would always be false.
The solution here is to check first if a material file is inside "secure_paths" (these are install directory resource paths). If it is, it must be a bundled material.
CURA-8610
Diffstat (limited to 'cura/CuraPackageManager.py')
-rw-r--r-- | cura/CuraPackageManager.py | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/cura/CuraPackageManager.py b/cura/CuraPackageManager.py index e23ed47ffa..a153906005 100644 --- a/cura/CuraPackageManager.py +++ b/cura/CuraPackageManager.py @@ -1,7 +1,9 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import glob import os +from pathlib import Path from typing import Any, cast, Dict, List, Set, Tuple, TYPE_CHECKING, Optional from UM.Logger import Logger @@ -55,6 +57,24 @@ class CuraPackageManager(PackageManager): super().initialize() + def isMaterialBundled(self, file_name: str, guid: str): + """ Check if there is a bundled material name with file_name and guid """ + for path in Resources.getSecureSearchPaths(): + paths = [Path(p) for p in glob.glob(path + '/**/*.xml.fdm_material')] + for material in paths: + if material.name == file_name: + with open(str(material), 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. + parsed_guid = PluginRegistry.getInstance().getPluginObject( + "XmlMaterialProfile").getMetadataFromSerialized( + f.read(), "GUID") + if guid == parsed_guid: + # The material we found matches both filename and GUID + return True + + return False + def getMaterialFilePackageId(self, file_name: str, guid: str) -> str: """Get the id of the installed material package that contains file_name""" for material_package in [f for f in os.scandir(self._installation_dirs_dict["materials"]) if f.is_dir()]: |