From 6fbb1a286c6428926ffd961fe556f190357bc05b Mon Sep 17 00:00:00 2001 From: Andrej730 Date: Wed, 17 Jul 2024 15:21:06 +0500 Subject: [PATCH] support sun position addon on blender 4.2 --- .../blenderbim/bim/module/light/decorator.py | 8 ++---- .../blenderbim/bim/module/light/prop.py | 8 ++---- .../blenderbim/bim/module/light/ui.py | 8 +++--- src/blenderbim/blenderbim/tool/blender.py | 27 +++++++++++++++++++ 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/light/decorator.py b/src/blenderbim/blenderbim/bim/module/light/decorator.py index b62a132ce0..2637967494 100644 --- a/src/blenderbim/blenderbim/bim/module/light/decorator.py +++ b/src/blenderbim/blenderbim/bim/module/light/decorator.py @@ -21,12 +21,6 @@ import blf import gpu import bmesh import blenderbim.tool as tool - -try: - import sun_position.sun_calc -except ImportError: - sun_position = None - from bpy.types import SpaceView3D from math import radians from mathutils import Vector, Matrix @@ -34,6 +28,8 @@ from gpu_extras.batch import batch_for_shader from bpy_extras.view3d_utils import location_3d_to_region_2d from blenderbim.bim.module.light.data import SolarData +sun_position = tool.Blender.get_sun_position_addon() + class SolarDecorator: is_installed = False diff --git a/src/blenderbim/blenderbim/bim/module/light/prop.py b/src/blenderbim/blenderbim/bim/module/light/prop.py index 7e91d36623..aefe832e22 100644 --- a/src/blenderbim/blenderbim/bim/module/light/prop.py +++ b/src/blenderbim/blenderbim/bim/module/light/prop.py @@ -20,12 +20,6 @@ import bpy import pytz import tzfpy import datetime - -try: - import sun_position.sun_calc -except ImportError: - sun_position = None - import blenderbim.tool as tool from math import radians, pi from mathutils import Euler, Vector, Matrix, Quaternion @@ -34,6 +28,8 @@ from bpy.types import PropertyGroup from blenderbim.bim.module.light.data import SolarData from blenderbim.bim.module.light.decorator import SolarDecorator +sun_position = tool.Blender.get_sun_position_addon() + def get_sites(self, context): if not SolarData.is_loaded: diff --git a/src/blenderbim/blenderbim/bim/module/light/ui.py b/src/blenderbim/blenderbim/bim/module/light/ui.py index 89c0ff4502..1ba4352522 100644 --- a/src/blenderbim/blenderbim/bim/module/light/ui.py +++ b/src/blenderbim/blenderbim/bim/module/light/ui.py @@ -17,13 +17,11 @@ # along with BlenderBIM Add-on. If not, see . import bpy +import blenderbim.tool as tool from blenderbim.bim.module.light.data import SolarData -try: - import sun_position - from sun_position.sun_calc import format_time, format_hms, sun -except ImportError: - sun_position = None + +sun_position = tool.Blender.get_sun_position_addon() class BIM_PT_radiance_exporter(bpy.types.Panel): diff --git a/src/blenderbim/blenderbim/tool/blender.py b/src/blenderbim/blenderbim/tool/blender.py index 8e0714d95e..6904f7c93a 100644 --- a/src/blenderbim/blenderbim/tool/blender.py +++ b/src/blenderbim/blenderbim/tool/blender.py @@ -27,6 +27,7 @@ import blenderbim.core.tool import blenderbim.tool as tool import blenderbim.bim import addon_utils +import types from mathutils import Vector from pathlib import Path from blenderbim.bim.ifc import IFC_CONNECTED_TYPE @@ -1116,3 +1117,29 @@ class Blender(blenderbim.core.tool.Blender): def get_addon_preferences(cls) -> blenderbim.bim.ui.BIM_ADDON_preferences: blender_package_name = cls.get_blender_addon_package_name() return bpy.context.preferences.addons[blender_package_name].preferences + + @classmethod + def get_sun_position_addon(cls) -> Union[types.ModuleType, None]: + # Check if it's installed as legacy Blender addon. + try: + import sun_position + except ImportError: + sun_position = None + + if sun_position: + return + + # No extensions prior to 4.2. + if bpy.app.version < (4, 2, 0): + return sun_position + + if sun_position: + return sun_position + + import importlib + + for package_name in bpy.context.preferences.addons.keys(): + if package_name.endswith(".sun_position"): + sun_position = importlib.import_module(package_name) + + return sun_position