From 97ee4eaef0b576a6d262be60254aeacb90968d7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Sat, 4 Apr 2026 14:29:54 -0300 Subject: [PATCH] See #7888 - Fix snap when object changes during modal operator. Handle cases where the snapped target is modified while a modal operator is active (e.g., adding a door or window that alters the wall geometry). --- src/bonsai/bonsai/tool/raycast.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/bonsai/bonsai/tool/raycast.py b/src/bonsai/bonsai/tool/raycast.py index 6b613aecaf..38882a5095 100644 --- a/src/bonsai/bonsai/tool/raycast.py +++ b/src/bonsai/bonsai/tool/raycast.py @@ -889,8 +889,19 @@ class Raycast(bonsai.core.tool.Raycast): def create_snap_obj(cls, obj): if obj.data is None or not isinstance(obj.data, bpy.types.Mesh): return None - for snap_obj in cls.snap_objs: + for i, snap_obj in enumerate(cls.snap_objs): if obj.name == snap_obj.obj.name: + # Handle objects modified while a modal operator is active. + # Example: adding a door or window alters the wall geometry. + if len(obj.data.vertices) != len(snap_obj.verts_3d): + cls.snap_objs.pop(i) + snap_obj = SnapObj(obj) + cls.snap_objs.append(snap_obj) + for v1, v2 in zip(obj.data.vertices, snap_obj.verts_3d): + if (obj.matrix_world @ v1.co) != v2: + cls.snap_objs.pop(i) + snap_obj = SnapObj(obj) + cls.snap_objs.append(snap_obj) return snap_obj snap_obj = SnapObj(obj) cls.snap_objs.append(snap_obj)