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]):