More reliable way to get bbim package name #5214

See #5214 for details, can't rely on 'bpy.context.preferences.addons' as it may contain a missing addons too (if addon was manually uninstalled and it won't be able to load but it will still appear in 'addons').
This commit is contained in:
Andrej730
2024-08-23 11:55:51 +05:00
parent a0792a4b93
commit 009795f7dc
3 changed files with 20 additions and 11 deletions
+9 -6
View File
@@ -36,7 +36,7 @@ import bpy
logger = logging.getLogger("sverchok.ifc")
def get_blender_addon_package_name(addon_name: str) -> types.ModuleType:
def get_blender_addon_package_by_name(addon_name: str) -> types.ModuleType:
# Check for legacy addons.
if addon_name in bpy.context.preferences.addons:
return importlib.import_module(addon_name)
@@ -44,20 +44,23 @@ def get_blender_addon_package_name(addon_name: str) -> types.ModuleType:
raise ModuleNotFoundError
# Check for Blender extensions.
bbim_package_name = None
addon_package = None
for package_name in bpy.context.preferences.addons.keys():
if package_name.endswith(f".{addon_name}"):
bbim_package_name = package_name
if bbim_package_name is None:
try:
addon_package = importlib.import_module(package_name)
except ModuleNotFoundError:
pass
if addon_package is None:
raise ModuleNotFoundError
return importlib.import_module(bbim_package_name)
return addon_package
def ensure_addons_are_enabled(*addon_names: str) -> None:
errors = []
for addon_name in addon_names:
try:
module = get_blender_addon_package_name(addon_name)
module = get_blender_addon_package_by_name(addon_name)
# `__addon_enabled__` is not present if addon wasn't enabled before
if not getattr(module, "__addon_enabled__", False):
errors.append(f"- Addon {addon_name} appears to be disabled, it should be enabled before IFC Sverchok.")