Support loading BlenderBIM in Blender 4.2+ as an extension

1) Used a hack to bring `blenderbim` into the main namespace instead of `bl_ext.repository.blenderbim`. This is not an official way to do it but this works for testing stuff (official way is to create a stub wheel that would redirect all `blenderbim` requests to `bl_ext.repository.blenderbim`).
2) AddonPreferences now require blender package name as it's bl_idname (e.g. bl_ext.repository.blenderbim)
3) Addressing preferences now also works through the blender package name. Created method in tool/Blender.py to incapsulate those details.
This commit is contained in:
Andrej730
2024-06-28 17:30:51 +05:00
parent d1be0e8c1c
commit 1fc56585dd
16 changed files with 59 additions and 33 deletions
+14 -1
View File
@@ -33,6 +33,8 @@ import traceback
import webbrowser
from collections import deque
# NOTE: bl_info is superseded by blender_manifest.toml
# if addon is installed as an extension (Blender 4.2+)
bl_info = {
"name": "BlenderBIM",
"description": "Transforms Blender into a native Building Information Model authoring platform using IFC.",
@@ -92,7 +94,6 @@ if IN_BLENDER:
sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)), "libs", "site", "packages"))
try:
import blenderbim.bim
import ifcopenshell.api
def log_api(usecase_path, ifc_file, settings):
@@ -107,9 +108,21 @@ if IN_BLENDER:
ifcopenshell.api.add_pre_listener("*", "action_logger", log_api)
def register():
global BLENDER_PACKAGE_NAME, __name__, __package__
BLENDER_PACKAGE_NAME = __name__
if bpy.app.version >= (4, 2, 0):
sys.modules["blenderbim"] = sys.modules[__name__]
__name__ = "blenderbim"
# Only renaming __name__ is actually required to make imports work.
# We renaming __package__ just for consistency.
__package__ = "blenderbim"
import blenderbim.bim
blenderbim.bim.register()
def unregister():
import blenderbim.bim
blenderbim.bim.unregister()
except:
+4 -3
View File
@@ -291,12 +291,13 @@ def load_post(scene):
ifcopenshell.api.owner.settings.get_application = get_application
AuthoringData.type_thumbnails = {}
if not bpy.context.preferences.addons["blenderbim"].preferences.should_setup_toolbar:
preferences = tool.Blender.get_addon_preferences()
if not preferences.should_setup_toolbar:
tool.Blender.unregister_toolbar()
if bpy.context.preferences.addons["blenderbim"].preferences.should_setup_workspace:
if preferences.should_setup_workspace:
if "BIM" in bpy.data.workspaces:
if bpy.context.preferences.addons["blenderbim"].preferences.activate_workspace:
if preferences.activate_workspace:
bpy.context.window.workspace = bpy.data.workspaces["BIM"]
else:
bpy.ops.workspace.append_activate(idname="BIM", filepath=os.path.join(cwd, "data", "workspace.blend"))
+3 -3
View File
@@ -538,7 +538,7 @@ class IfcImporter:
shape = tool.Loader.create_generic_shape(grid)
grid_obj = self.create_product(grid, shape)
grid_placement = self.get_element_matrix(grid)
if bpy.context.preferences.addons["blenderbim"].preferences.lock_grids_on_import:
if tool.Blender.get_addon_preferences().lock_grids_on_import:
grid_obj.lock_location = (True, True, True)
grid_obj.lock_rotation = (True, True, True)
self.create_grid_axes(grid.UAxes, grid_obj, grid_placement)
@@ -551,7 +551,7 @@ class IfcImporter:
shape = tool.Loader.create_generic_shape(axis.AxisCurve)
mesh = self.create_mesh(axis, shape)
obj = bpy.data.objects.new(f"IfcGridAxis/{axis.AxisTag}", mesh)
if bpy.context.preferences.addons["blenderbim"].preferences.lock_grids_on_import:
if tool.Blender.get_addon_preferences().lock_grids_on_import:
obj.lock_location = (True, True, True)
obj.lock_rotation = (True, True, True)
self.link_element(axis, obj)
@@ -620,7 +620,7 @@ class IfcImporter:
print("Done creating geometry")
def create_spatial_elements(self) -> None:
if bpy.context.preferences.addons["blenderbim"].preferences.spatial_elements_unselectable:
if tool.Blender.get_addon_preferences().spatial_elements_unselectable:
self.create_generic_elements(self.spatial_elements, unselectable=True)
else:
self.create_generic_elements(self.spatial_elements, unselectable=False)
@@ -49,7 +49,7 @@ class BoundaryDecorator:
batch.draw(shader)
def __call__(self, context):
self.addon_prefs = context.preferences.addons["blenderbim"].preferences
self.addon_prefs = tool.Blender.get_addon_preferences()
selected_elements_color = self.addon_prefs.decorator_color_selected
unselected_elements_color = self.addon_prefs.decorator_color_unselected
special_elements_color = self.addon_prefs.decorator_color_special
@@ -55,7 +55,7 @@ class ClashDecorator:
batch.draw(shader)
def draw_text(self, context):
self.addon_prefs = context.preferences.addons["blenderbim"].preferences
self.addon_prefs = tool.Blender.get_addon_preferences()
selected_elements_color = self.addon_prefs.decorator_color_selected
unselected_elements_color = self.addon_prefs.decorator_color_unselected
special_elements_color = self.addon_prefs.decorator_color_special
@@ -75,7 +75,7 @@ class ClashDecorator:
blf.draw(font_id, text) # Set your text here
def draw_geometry(self, context):
self.addon_prefs = context.preferences.addons["blenderbim"].preferences
self.addon_prefs = tool.Blender.get_addon_preferences()
selected_elements_color = self.addon_prefs.decorator_color_selected
unselected_elements_color = self.addon_prefs.decorator_color_unselected
special_elements_color = self.addon_prefs.decorator_color_special
@@ -335,7 +335,7 @@ class BaseDecorator:
"""`verts` should be in winspace with `(0,0,0)` in the screen left bottom corner, not in the center"""
region = context.region
if not color:
color = context.preferences.addons["blenderbim"].preferences.decorations_colour
color = tool.Blender.get_addon_preferences().decorations_colour
self.line_shader.bind()
# POLYLINE_UNIFORM_COLOR specific uniforms
@@ -404,7 +404,7 @@ class BaseDecorator:
font_id = self.font_id
color = context.preferences.addons["blenderbim"].preferences.decorations_colour
color = tool.Blender.get_addon_preferences().decorations_colour
ang = -Vector((1, 0)).angle_signed(text_dir)
cos = math.cos(ang)
@@ -812,7 +812,7 @@ class AngleDecorator(BaseDecorator):
arcs_color = None
edges_color = UNSPECIAL_ELEMENT_COLOR
if context.active_object == obj and obj.data.is_editmode:
arcs_color = context.preferences.addons["blenderbim"].preferences.decorator_color_special
arcs_color = tool.Blender.get_addon_preferences().decorator_color_special
edges_color = None
self.draw_lines(
@@ -1093,7 +1093,7 @@ class HiddenDecorator(BaseDecorator):
else:
verts, idxs = self.get_mesh_geom(obj)
winspace_verts = worldspace_to_winspace(verts, context)
color = [i for i in context.preferences.addons["blenderbim"].preferences.decorations_colour]
color = [i for i in tool.Blender.get_addon_preferences().decorations_colour]
color[3] = 0.5
self.draw_lines(context, obj, winspace_verts, idxs, color)
@@ -1409,7 +1409,7 @@ class GridDecorator(BaseDecorator):
# stem with gaps for circles
add_verts_sequence([v0 + gap, v1 - gap], start_i, **out_kwargs)
color = [i for i in context.preferences.addons["blenderbim"].preferences.decorations_colour]
color = [i for i in tool.Blender.get_addon_preferences().decorations_colour]
color[3] = 0.5
self.draw_lines(context, obj, output_verts, output_edges, color)
self.draw_labels(context, obj, verts)
@@ -1591,7 +1591,7 @@ class CutDecorator:
cls.installed = None
def __call__(self, context):
self.addon_prefs = context.preferences.addons["blenderbim"].preferences
self.addon_prefs = tool.Blender.get_addon_preferences()
selected_elements_color = self.addon_prefs.decorator_color_selected
all_vertices = []
@@ -279,7 +279,7 @@ class CreateDrawing(bpy.types.Operator):
svg_path = self.combine_svgs(context, underlay_svg, linework_svg, annotation_svg)
tool.Drawing.open_with_user_command(
context.preferences.addons["blenderbim"].preferences.svg_command, svg_path
tool.Blender.get_addon_preferences().svg_command, svg_path
)
if self.print_all:
@@ -1374,8 +1374,8 @@ class CreateSheets(bpy.types.Operator, Operator):
),
)
svg2pdf_command = context.preferences.addons["blenderbim"].preferences.svg2pdf_command
svg2dxf_command = context.preferences.addons["blenderbim"].preferences.svg2dxf_command
svg2pdf_command = tool.Blender.get_addon_preferences().svg2pdf_command
svg2dxf_command = tool.Blender.get_addon_preferences().svg2dxf_command
if svg2pdf_command:
# With great power comes great responsibility. Example:
@@ -1393,9 +1393,9 @@ class CreateSheets(bpy.types.Operator, Operator):
subprocess.run([replacements.get(c, c) for c in command])
if svg2pdf_command:
tool.Drawing.open_with_user_command(context.preferences.addons["blenderbim"].preferences.pdf_command, pdf)
tool.Drawing.open_with_user_command(tool.Blender.get_addon_preferences().pdf_command, pdf)
else:
tool.Drawing.open_with_user_command(context.preferences.addons["blenderbim"].preferences.svg_command, svg)
tool.Drawing.open_with_user_command(tool.Blender.get_addon_preferences().svg_command, svg)
class SelectAllDrawings(bpy.types.Operator):
@@ -1463,7 +1463,7 @@ class OpenDrawing(bpy.types.Operator):
for drawing_uri in drawing_uris:
tool.Drawing.open_with_user_command(
context.preferences.addons["blenderbim"].preferences.svg_command, drawing_uri
tool.Blender.get_addon_preferences().svg_command, drawing_uri
)
return {"FINISHED"}
@@ -78,7 +78,7 @@ class ProfileDecorator:
self.draw_batch("TRIS", vertices_coords, faces_color, face_indices)
def __call__(self, context, get_custom_bmesh=None, draw_faces=False, exit_edit_mode_callback=None):
self.addon_prefs = context.preferences.addons["blenderbim"].preferences
self.addon_prefs = tool.Blender.get_addon_preferences()
selected_elements_color = self.addon_prefs.decorator_color_selected
unselected_elements_color = self.addon_prefs.decorator_color_unselected
special_elements_color = self.addon_prefs.decorator_color_special
@@ -904,7 +904,7 @@ class DecorationsHandler:
batch.draw(shader)
def __call__(self, context):
self.addon_prefs = context.preferences.addons["blenderbim"].preferences
self.addon_prefs = tool.Blender.get_addon_preferences()
selected_elements_color = self.addon_prefs.decorator_color_selected
unselected_elements_color = self.addon_prefs.decorator_color_unselected
special_elements_color = self.addon_prefs.decorator_color_special
@@ -64,7 +64,7 @@ class ProjectDecorator:
batch.draw(shader)
def __call__(self, context):
self.addon_prefs = context.preferences.addons["blenderbim"].preferences
self.addon_prefs = tool.Blender.get_addon_preferences()
selected_elements_color = self.addon_prefs.decorator_color_selected
unselected_elements_color = self.addon_prefs.decorator_color_unselected
special_elements_color = self.addon_prefs.decorator_color_special
@@ -128,7 +128,7 @@ class ClippingPlaneDecorator:
batch.draw(shader)
def __call__(self, context):
self.addon_prefs = context.preferences.addons["blenderbim"].preferences
self.addon_prefs = tool.Blender.get_addon_preferences()
selected_elements_color = self.addon_prefs.decorator_color_selected
unselected_elements_color = self.addon_prefs.decorator_color_unselected
special_elements_color = self.addon_prefs.decorator_color_special
@@ -138,7 +138,7 @@ def draw_psetqto_ui(context, pset_id, pset, props, layout, obj_type, allow_remov
else:
has_props_displayed = False
for prop in pset["Properties"]:
if context.preferences.addons["blenderbim"].preferences.should_hide_empty_props and (
if tool.Blender.get_addon_preferences().should_hide_empty_props and (
prop["NominalValue"] is None or prop["NominalValue"] == ""
):
continue
@@ -89,7 +89,7 @@ class SystemDecorator:
self.draw_batch("TRIS", vertices_coords, faces_color, face_indices)
def __call__(self, context, get_custom_bmesh=None, draw_faces=False, exit_edit_mode_callback=None):
self.addon_prefs = context.preferences.addons["blenderbim"].preferences
self.addon_prefs = tool.Blender.get_addon_preferences()
selected_elements_color = self.addon_prefs.decorator_color_selected
unselected_elements_color = self.addon_prefs.decorator_color_unselected
special_elements_color = self.addon_prefs.decorator_color_special
+1 -1
View File
@@ -191,7 +191,7 @@ class BIM_UL_topics(bpy.types.UIList):
class BIM_ADDON_preferences(bpy.types.AddonPreferences):
bl_idname = "blenderbim"
bl_idname = tool.Blender.get_blender_addon_package_name()
svg2pdf_command: StringProperty(name="SVG to PDF Command", description='E.g. [["inkscape", "svg", "-o", pdf]]')
svg2dxf_command: StringProperty(
name="SVG to DXF Command",
+12
View File
@@ -16,6 +16,7 @@
# You should have received a copy of the GNU General Public License
# along with BlenderBIM Add-on. If not, see <http://www.gnu.org/licenses/>.
from __future__ import annotations
import bpy
import bmesh
import json
@@ -1132,3 +1133,14 @@ class Blender(blenderbim.core.tool.Blender):
@classmethod
def clear_recent_ifc_projects(cls) -> None:
cls.write_recent_ifc_projects([])
@classmethod
def get_blender_addon_package_name(cls) -> str:
if bpy.app.version >= (4, 2, 0):
return blenderbim.BLENDER_PACKAGE_NAME
return "blenderbim"
@classmethod
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
+1 -1
View File
@@ -96,7 +96,7 @@ class Cost(blenderbim.core.tool.Cost):
@classmethod
def play_sound(cls):
if bpy.context.preferences.addons["blenderbim"].preferences.should_play_chaching_sound:
if tool.Blender.get_addon_preferences().should_play_chaching_sound:
cls.play_chaching_sound() # lol
@classmethod
+3 -3
View File
@@ -889,15 +889,15 @@ class Drawing(blenderbim.core.tool.Drawing):
@classmethod
def open_spreadsheet(cls, uri):
cls.open_with_user_command(bpy.context.preferences.addons["blenderbim"].preferences.spreadsheet_command, uri)
cls.open_with_user_command(tool.Blender.get_addon_preferences().spreadsheet_command, uri)
@classmethod
def open_svg(cls, uri):
cls.open_with_user_command(bpy.context.preferences.addons["blenderbim"].preferences.svg_command, uri)
cls.open_with_user_command(tool.Blender.get_addon_preferences().svg_command, uri)
@classmethod
def open_layout_svg(cls, uri):
cls.open_with_user_command(bpy.context.preferences.addons["blenderbim"].preferences.layout_svg_command, uri)
cls.open_with_user_command(tool.Blender.get_addon_preferences().layout_svg_command, uri)
@classmethod
def run_root_assign_class(