diff --git a/blender-addon/__init__.py b/blender-addon/__init__.py index 0c269b3..fa82451 100644 --- a/blender-addon/__init__.py +++ b/blender-addon/__init__.py @@ -37,6 +37,19 @@ "category": "3D View" } + +def _add_dependencies_to_sys_path(): + """ Add the dependencies of Mastodon Blender View addon to the pythons system path. """ + import sys + import os + addon_dir = os.path.dirname(__file__) + addon_libs_dir = os.path.join(addon_dir, "libs") + if addon_libs_dir not in sys.path: + sys.path.insert(0, addon_libs_dir) + + +_add_dependencies_to_sys_path() + from . import mb_panel from . import mb_server diff --git a/src/main/resources/blender-scripts/install_addon.py b/src/main/resources/blender-scripts/install_addon.py index 1e42041..f24c72f 100644 --- a/src/main/resources/blender-scripts/install_addon.py +++ b/src/main/resources/blender-scripts/install_addon.py @@ -33,56 +33,81 @@ import sys import addon_utils -# install pip -def get_python_path(): - try: - # 2.92 and older - path = bpy.app.binary_path_python - except AttributeError: - # 2.93 and later - path = sys.executable - return os.path.abspath(path) +def main(): + print("start installing mastodon blender view addon...") + install_mastodon_blender_view_addon() + print("mastodon blender view addon installed") + print("install pip if needed...") + install_pip() + print("pip is installed") + addon_dir = get_mastodon_blender_view_addon_dir() + print(f"Installation directory of the Mastodon Blender View addon: {addon_dir}") + install_dependencies(packages=['grpcio', 'bidict', 'grpcio-tools', 'pandas'], target=os.path.join(addon_dir, "libs")) + import_dependencies() + print("dependencies installed") + compile_grpc_protocol(addon_dir) + print("google RPC code compiled") + + +def install_mastodon_blender_view_addon(): + argv = sys.argv + addon_zip = argv[argv.index('--') + 1] + bpy.ops.preferences.addon_install(filepath=addon_zip) + + +def install_pip(): + os.environ.pop("PIP_REQ_TRACKER", None) + ensurepip.bootstrap() + os.environ.pop("PIP_REQ_TRACKER", None) -os.environ.pop("PIP_REQ_TRACKER", None) -ensurepip.bootstrap() -os.environ.pop("PIP_REQ_TRACKER", None) +def get_mastodon_blender_view_addon_dir() -> str: + filename_init_py = [m.__file__ for m in addon_utils.modules() if m.__name__ == "mastodon_blender_view"][0] + addon_dir = os.path.dirname(filename_init_py) + return addon_dir -# install dependencies -python_path = get_python_path() -packages = {'grpcio', 'bidict', 'grpcio-tools', 'pandas'} -subprocess.check_output([python_path, '-m', 'pip', 'install', *packages]) +def install_dependencies(packages: list[str], target: str): + print(f"Install dependencies into folder: {target}") -# test if dependencies are installed + subprocess.check_call([get_python_path(), "-m", "pip", "install", "--target", target, *packages]) -try: + if target not in sys.path: # add addon libs dir to system path + sys.path.insert(0, target) + + +def import_dependencies(): import bidict import grpc import google.protobuf import pandas -except ModuleNotFoundError: - raise Exception("dependency installation failed") -print("dependencies installed") -# install addon +def compile_grpc_protocol(addon_dir): + cmd = [get_python_path(), '-m', 'grpc_tools.protoc', '-I.', '--python_out=.', '--grpc_python_out=.', + 'mastodon_blender_view/mastodon-blender-view.proto'] + cwd = os.path.dirname(addon_dir) + env = os.environ.copy() + addon_libs_dir = os.path.join(addon_dir, "libs") + env["PYTHONPATH"] = addon_libs_dir + os.pathsep + env.get("PYTHONPATH") if "PYTHONPATH" in env else addon_libs_dir + subprocess.check_output(cmd, cwd=cwd, env=env) -argv = sys.argv -addon_zip = argv[argv.index('--') + 1] -bpy.ops.preferences.addon_install(filepath=addon_zip) + try: + from mastodon_blender_view import mastodon_blender_view_pb2 + from mastodon_blender_view import mastodon_blender_view_pb2_grpc + except ModuleNotFoundError: + raise Exception("installing google RPC generated code failed") -print("mastodon blender view addon installed") -filename_init_py = [m.__file__ for m in addon_utils.modules() if m.__name__ == "mastodon_blender_view"][0] -addon_dir = os.path.dirname(filename_init_py) -subprocess.check_output([python_path, '-m', 'grpc_tools.protoc', '-I.', '--python_out=.', '--grpc_python_out=.', 'mastodon_blender_view/mastodon-blender-view.proto'], cwd=os.path.dirname(addon_dir)) +def get_python_path(): + try: + # 2.92 and older + path = bpy.app.binary_path_python + except AttributeError: + # 2.93 and later + path = sys.executable + return os.path.abspath(path) -try: - from mastodon_blender_view import mastodon_blender_view_pb2 - from mastodon_blender_view import mastodon_blender_view_pb2_grpc -except ModuleNotFoundError: - raise Exception("installing google RPC generated code failed") -print("google RPC code compiled") +main() \ No newline at end of file diff --git a/src/main/resources/csv/read_csv.py b/src/main/resources/csv/read_csv.py index 46e5ca9..08e36e7 100644 --- a/src/main/resources/csv/read_csv.py +++ b/src/main/resources/csv/read_csv.py @@ -28,6 +28,9 @@ ### import os import bpy + +bpy.ops.preferences.addon_enable(module='mastodon_blender_view') # "pandas" can only be imported after enabling the addon + import pandas as pd import csv from collections import defaultdict