From efc6842a9d4081884df026e78450b90b96a23b50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Fri, 28 Feb 2025 13:44:00 -0300 Subject: [PATCH] Improve snapping for empty objects. --- src/bonsai/bonsai/tool/raycast.py | 18 ++++++++++++++++++ src/bonsai/bonsai/tool/snap.py | 23 +++++++---------------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/bonsai/bonsai/tool/raycast.py b/src/bonsai/bonsai/tool/raycast.py index 919efd94b9..1dcefd86d2 100644 --- a/src/bonsai/bonsai/tool/raycast.py +++ b/src/bonsai/bonsai/tool/raycast.py @@ -154,6 +154,24 @@ class Raycast(bonsai.core.tool.Raycast): except: loc = Vector((0, 0, 0)) + # For empty object we just get the object location and return + if obj.type == "EMPTY": + v = obj.location + intersection = tool.Cad.point_on_edge(v, (ray_target, loc)) + intersection = tool.Cad.point_on_edge(v, (ray_target, loc)) + distance = (v - intersection).length + if distance < snap_threshold: + snap_point = { + "object": obj, + "type": "Vertex", + "point": v.copy(), + "distance": distance, + } + points.append(snap_point) + print("empty", snap_point) + return points + + if not custom_bmesh: bm = bmesh.new() if face is None: # Object without faces diff --git a/src/bonsai/bonsai/tool/snap.py b/src/bonsai/bonsai/tool/snap.py index 01ce5ecaaf..0392acfad6 100644 --- a/src/bonsai/bonsai/tool/snap.py +++ b/src/bonsai/bonsai/tool/snap.py @@ -403,13 +403,13 @@ class Snap(bonsai.core.tool.Snap): # Edge-Vertex for obj in objs_to_raycast: - if obj.type == "MESH": - if len(obj.data.polygons) == 0: - snap_points = tool.Raycast.ray_cast_by_proximity(context, event, obj) - if snap_points: - for point in snap_points: - point["group"] = "Edge-Vertex" - detected_snaps.append(point) + if obj.type in {"MESH", "EMPTY"}: + # if len(obj.data.polygons) == 0: + snap_points = tool.Raycast.ray_cast_by_proximity(context, event, obj) + if snap_points: + for point in snap_points: + point["group"] = "Edge-Vertex" + detected_snaps.append(point) if obj.type == "CURVE": new_object = bpy.data.objects.new("new_object", obj.to_mesh().copy()) snap_points = tool.Raycast.ray_cast_by_proximity(context, event, new_object) @@ -417,15 +417,6 @@ class Snap(bonsai.core.tool.Snap): for point in snap_points: point["group"] = "Edge-Vertex" detected_snaps.append(point) - if obj.type == "EMPTY": - snap_point = { - "type": "Vertex", - "point": obj.location, - "distance": 10, # High value so it has low priority - "object": obj, - "group": "Edge-Vertex", - } - detected_snaps.append(snap_point) # Obj if (space.shading.type == "SOLID" and space.shading.show_xray) or (