From bb91416c4e316254c48bef2dff2ff71d31354b7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Fri, 4 Apr 2025 20:19:25 -0300 Subject: [PATCH] Snap - Fix creation of 2D bounding boxes Previously, objects with 2D bounding boxes outside the view were still being added. This issue is now resolved. Additionally, implement simple AABB detection to check if the bounding box is within the viewport. --- .../bonsai/bim/module/model/polyline.py | 6 +++-- src/bonsai/bonsai/tool/raycast.py | 22 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/model/polyline.py b/src/bonsai/bonsai/bim/module/model/polyline.py index 8d0429dd00..2431eb57e5 100644 --- a/src/bonsai/bonsai/bim/module/model/polyline.py +++ b/src/bonsai/bonsai/bim/module/model/polyline.py @@ -899,7 +899,8 @@ class PolylineOperator: if self.mousemove_count == 2: self.objs_2d_bbox = [] for obj in self.visible_objs: - self.objs_2d_bbox.append(tool.Raycast.get_on_screen_2d_bounding_boxes(context, obj)) + if bbox_2d := tool.Raycast.get_on_screen_2d_bounding_boxes(context, obj): + self.objs_2d_bbox.append(bbox_2d) if self.mousemove_count > 3: detected_snaps = tool.Snap.detect_snapping_points(context, event, self.objs_2d_bbox, self.tool_state) @@ -988,7 +989,8 @@ class PolylineOperator: self.tool_state.mode = "Mouse" self.visible_objs = tool.Raycast.get_visible_objects(context) for obj in self.visible_objs: - self.objs_2d_bbox.append(tool.Raycast.get_on_screen_2d_bounding_boxes(context, obj)) + if bbox_2d := tool.Raycast.get_on_screen_2d_bounding_boxes(context, obj): + self.objs_2d_bbox.append(bbox_2d) detected_snaps = tool.Snap.detect_snapping_points(context, event, self.objs_2d_bbox, self.tool_state) self.snapping_points = tool.Snap.select_snapping_points(context, event, self.tool_state, detected_snaps) tool.Polyline.calculate_distance_and_angle(context, self.input_ui, self.tool_state) diff --git a/src/bonsai/bonsai/tool/raycast.py b/src/bonsai/bonsai/tool/raycast.py index 47997562b3..71f35cd559 100644 --- a/src/bonsai/bonsai/tool/raycast.py +++ b/src/bonsai/bonsai/tool/raycast.py @@ -75,18 +75,24 @@ class Raycast(bonsai.core.tool.Raycast): transposed_bbox.append(coord_2d) region = context.region - borders = (region.width, region.height) + borders = (0, region.width, 0, region.height) for i, axis in enumerate(zip(*transposed_bbox)): min_point = min(axis) max_point = max(axis) - if min_point == max_point: - min_point = 0 - if min_point < borders[i] and max_point > 0: - bbox_2d.extend([min_point, max_point]) - else: - return (obj, None) + bbox_2d.extend([min_point, max_point]) + + if len(bbox_2d) == 0: + return None + # AABB + if ( + bbox_2d[0] <= borders[1] + and bbox_2d[1] >= borders[0] + and bbox_2d[2] <= borders[3] + and bbox_2d[3] >= borders[2] + ): + return (obj, bbox_2d) + return None - return (obj, bbox_2d) @classmethod def intersect_mouse_2d_bounding_box(cls, mouse_pos: tuple[int, int], bbox: list[float, float, float, float]):