diff --git a/src/bonsai/bonsai/tool/snap.py b/src/bonsai/bonsai/tool/snap.py index 43d0492d38..e6f21aca24 100644 --- a/src/bonsai/bonsai/tool/snap.py +++ b/src/bonsai/bonsai/tool/snap.py @@ -360,15 +360,6 @@ class Snap(bonsai.core.tool.Snap): plane_normal = tool.Polyline.use_transform_orientations(plane_normal) return plane_origin, plane_normal - def handle_snap_points_in_xray_mode(closest_snaps, detected_snaps, snap_obj, is_xray): - for snap in closest_snaps: - if snap_obj.obj == snap["object"]: - if "face_index" in snap and snap["face_index"]: - points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj) - for point in points: - point["group"] = "Object" - detected_snaps.append(point) - return detected_snaps # Polyline polyline_props = tool.Model.get_polyline_props() @@ -401,17 +392,28 @@ class Snap(bonsai.core.tool.Snap): closest_snaps = tool.Raycast.ray_cast_and_get_closest_to_camera_snaps(context, event, objs_to_raycast) detected_snaps.extend(closest_snaps) - xray_conditions = (space.shading.type == "SOLID" and space.shading.show_xray) or (space.shading.type == "WIREFRAME" and space.shading.show_xray_wireframe) + xray_mode = (space.shading.type == "SOLID" and space.shading.show_xray) or (space.shading.type == "WIREFRAME" and space.shading.show_xray_wireframe) - if xray_conditions: - for snap_obj in objs_to_raycast: - detected_snaps = handle_snap_points_in_xray_mode(closest_snaps, detected_snaps, snap_obj, is_xray=True) - else: - for snap_obj in objs_to_raycast: - for snap in closest_snaps: - if "is_closest_to_camera" in snap and snap["is_closest_to_camera"]: - detected_snaps = handle_snap_points_in_xray_mode([snap], detected_snaps, snap_obj, is_xray=False) - + for snap_obj in objs_to_raycast: + for snap in closest_snaps: + if snap_obj.obj == snap["object"]: + if xray_mode: + if "face_index" in snap and snap["face_index"]: + snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj) + for point in snap_points: + point["group"] = "Object" + detected_snaps.append(point) + else: + # If it is a solid object that is closest to camera it ignores all the rest + if "is_closest_to_camera" in snap and snap["is_closest_to_camera"] and snap["group"] == "Object": + closest_snap = [snap] # discards objects that aren't the closest + if "face_index" in snap and snap["face_index"]: + snap_points = tool.Raycast.ray_cast_by_proximity_2d(context, event, snap_obj) + for point in snap_points: + point["group"] = "Object" + closest_snap.append(point) + detected_snaps = closest_snap + # snap to cut geometry (e.g. in plan view) if CutDecorator.installed: cut_snaps = []