From 481676e51b65cb93e520b9f073123f22a06b212b Mon Sep 17 00:00:00 2001 From: Gorgious Date: Sat, 22 Nov 2025 00:04:57 +0100 Subject: [PATCH] fix - recalculate normals for wall-mounted handrail railings Fixes inverted normals on SweptDiskSolid end caps by recalculating face normals after IFC geometry is loaded into Blender. Fixes #6483 --- src/bonsai/bonsai/bim/module/model/railing.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/bonsai/bonsai/bim/module/model/railing.py b/src/bonsai/bonsai/bim/module/model/railing.py index 5e8d7a70dc..7939758c2b 100644 --- a/src/bonsai/bonsai/bim/module/model/railing.py +++ b/src/bonsai/bonsai/bim/module/model/railing.py @@ -106,6 +106,13 @@ def update_railing_modifier_ifc_data(context: bpy.types.Context) -> None: model_representation = ifcopenshell.api.geometry.add_railing_representation(ifc_file, **representation_data) tool.Model.replace_object_ifc_representation(body, obj, model_representation) + # recalculate normals to ensure correct shading + mesh = obj.data + if isinstance(mesh, bpy.types.Mesh): + bm = tool.Blender.get_bmesh_for_mesh(mesh, clean=False) + bmesh.ops.recalc_face_normals(bm, faces=bm.faces[:]) + tool.Blender.apply_bmesh(mesh, bm) + elif props.railing_type == "FRAMELESS_PANEL": tool.Model.add_body_representation(obj)