From 009795f7dca80c2a5694b441c119302a8ff5d3fa Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Fri, 23 Aug 2024 11:55:51 +0500 Subject: [PATCH] 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'). --- src/bonsai/bonsai/__init__.py | 5 +++++ src/bonsai/bonsai/tool/blender.py | 11 ++++++----- src/ifcsverchok/__init__.py | 15 +++++++++------ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/bonsai/bonsai/__init__.py b/src/bonsai/bonsai/__init__.py index f4d1bd28cc..dce3b696ef 100644 --- a/src/bonsai/bonsai/__init__.py +++ b/src/bonsai/bonsai/__init__.py @@ -59,6 +59,7 @@ last_error = None last_actions: deque = deque(maxlen=10) FIRST_INSTALLED_BBIM_VERSION: Union[str, None] = None REINSTALLED_BBIM_VERSION: Union[str, None] = None +REGISTERED_BBIM_PACKAGE: str def initialize_bbim_semver(): @@ -238,6 +239,10 @@ if IN_BLENDER: if platform.system() == "Windows": clean_up_dlls_safe_links() + import bonsai + + bonsai.REGISTERED_BBIM_PACKAGE = __package__ + import bonsai.bim current_version = bbim_semver["version"] diff --git a/src/bonsai/bonsai/tool/blender.py b/src/bonsai/bonsai/tool/blender.py index cba3e52567..cbec92a46f 100644 --- a/src/bonsai/bonsai/tool/blender.py +++ b/src/bonsai/bonsai/tool/blender.py @@ -1114,10 +1114,7 @@ class Blender(bonsai.core.tool.Blender): @classmethod def get_blender_addon_package_name(cls) -> str: - for package_name in bpy.context.preferences.addons.keys(): - if package_name.endswith(".bonsai"): - return package_name - return "bonsai" + return bonsai.REGISTERED_BBIM_PACKAGE @classmethod def get_bbim_extension_package(cls) -> types.ModuleType: @@ -1151,6 +1148,10 @@ class Blender(bonsai.core.tool.Blender): for package_name in bpy.context.preferences.addons.keys(): if package_name.endswith(".sun_position"): - sun_position = importlib.import_module(package_name) + try: + sun_position = importlib.import_module(package_name) + return sun_position + except ModuleNotFoundError: + pass return sun_position diff --git a/src/ifcsverchok/__init__.py b/src/ifcsverchok/__init__.py index 71b683eb54..19f072dc77 100644 --- a/src/ifcsverchok/__init__.py +++ b/src/ifcsverchok/__init__.py @@ -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.")