Add "Edge Intersection" option to snapping points.

This commit is contained in:
Bruno Perdigão
2024-12-26 17:43:41 -03:00
parent a6a8a0f4b7
commit 5e77453d1d
2 changed files with 16 additions and 0 deletions
+1
View File
@@ -200,6 +200,7 @@ class Raycast(bonsai.core.tool.Raycast):
snap_point = {
"type": "Edge",
"point": intersection[1],
"edge_verts": (v1, v2),
}
points.append([(distance + 2 * stick_factor), snap_point])
+15
View File
@@ -481,6 +481,7 @@ class Snap(bonsai.core.tool.Snap):
@classmethod
def select_snapping_points(cls, context, event, tool_state, detected_snaps):
snapping_points = []
edges = [] # Get edges to create edge-intersection snap
for snap_group in detected_snaps:
snap_obj = None
if snap_group["group"] == "Polyline":
@@ -490,10 +491,14 @@ class Snap(bonsai.core.tool.Snap):
if snap_group["group"] == "Measure":
for p in snap_group["points"]:
snapping_points.append((p["point"], p["type"], None))
if p["type"] == "Edge":
edges.append(p)
break
if snap_group["group"] == "Edge-Vertex":
for p in snap_group["points"]:
snapping_points.append((p["point"], p["type"], snap_group["object"]))
if p["type"] == "Edge":
edges.append(p)
if snap_group["group"] == "Object":
matrix = snap_group["object"].matrix_world.copy()
@@ -507,6 +512,8 @@ class Snap(bonsai.core.tool.Snap):
else:
for p in snap_points:
snapping_points.append((p["point"], p["type"], snap_group["object"]))
if p["type"] == "Edge":
edges.append(p)
break
for snap_group in detected_snaps:
@@ -518,6 +525,14 @@ class Snap(bonsai.core.tool.Snap):
if snap_group["group"] == "Plane":
snapping_points.append((snap_group["point"], "Plane", snap_obj))
# Edges intersection snap
if edges:
for e1, e2 in zip(edges, edges[1:] + [edges[0]]):
if tool.Cad.are_vectors_equal(e1["point"], e2["point"], tolerance=0.1):
intersection = tool.Cad.intersect_edges_v2(e1["edge_verts"], e2["edge_verts"])
if intersection[1]:
snapping_points.insert(0, (intersection[1], "Edge-Intersection", None))
# Make Axis first priority
if tool_state.lock_axis or tool_state.axis_method in {"X", "Y", "Z"}:
cls.update_snapping_ref(snapping_points[0][0], snapping_points[0][1])