From 34652aa2b740f9757242c2272c440922682310fc Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 17 Jul 2024 18:08:48 +0500 Subject: [PATCH] Create blenderbim_redirect.py --- src/blenderbim/scripts/blenderbim_redirect.py | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/blenderbim/scripts/blenderbim_redirect.py diff --git a/src/blenderbim/scripts/blenderbim_redirect.py b/src/blenderbim/scripts/blenderbim_redirect.py new file mode 100644 index 0000000000..51be4016d6 --- /dev/null +++ b/src/blenderbim/scripts/blenderbim_redirect.py @@ -0,0 +1,51 @@ +import importlib +import bpy +import types +from typing import Any + + +BBIM = None +MODULE_CACHE = {} + + +def __getattr__(name: str): + bbim = find_blenderbim_package() + return getattr(bbim, name) + + +class Wrapper: + def __init__(self, module): + self.module = module + + def __getattribute__(self, name: str): + module = object.__getattribute__(self, "module") + try: + attr = getattr(module, name) + return attr + except AttributeError: + pass + + # I guess it's a submodule. + name = f"{module.__name__}.{name}" + return get_wrapped_module(name) + + def __dir__(self): + return dir(self.module) + + +def get_wrapped_module(name: str) -> Wrapper: + module = MODULE_CACHE.get(name) + if module: + return module + return Wrapper(importlib.import_module(name)) + + +def find_blenderbim_package() -> types.ModuleType: + global BBIM + if BBIM is not None: + return BBIM + for package_name in bpy.context.preferences.addons.keys(): + if package_name.endswith(".blenderbim"): + BBIM = Wrapper(importlib.import_module(package_name)) + return BBIM + raise Exception("blenderbim is not found.")