Polytool improved axis lock and mixed snapping

You can now lock into an axis while snapping to an object.
The result will be to closer point. In the future, there should
be a way for the user to select between different points.
This commit is contained in:
Bruno Perdigão
2024-08-26 15:39:19 -03:00
parent 6dcbd98769
commit 2a1bc30f19
2 changed files with 31 additions and 9 deletions
@@ -2478,16 +2478,22 @@ class MeasureTool(bpy.types.Operator):
tool.Snap.set_use_default_container(False)
PolylineDecorator.set_use_default_container(False)
tool.Snap.set_snap_plane_method("YZ")
tool.Snap.set_snap_axis_method(None)
tool.Blender.update_viewport()
if event.shift and event.value == "PRESS" and event.type == "Y":
tool.Snap.set_use_default_container(False)
PolylineDecorator.set_use_default_container(False)
tool.Snap.set_snap_plane_method("XZ")
tool.Snap.set_snap_axis_method(None)
tool.Blender.update_viewport()
if event.shift and event.value == "PRESS" and event.type == "Z":
tool.Snap.set_use_default_container(False)
PolylineDecorator.set_use_default_container(False)
tool.Snap.set_snap_plane_method("XY")
tool.Snap.set_snap_axis_method(None)
tool.Blender.update_viewport()
if event.type in {"MIDDLEMOUSE", "WHEELUPMOUSE", "WHEELDOWNMOUSE"}:
return {"PASS_THROUGH"}
@@ -2513,6 +2519,7 @@ class MeasureTool(bpy.types.Operator):
tool.Snap.set_use_default_container(False)
PolylineDecorator.set_use_default_container(False)
tool.Snap.set_snap_plane_method(None)
tool.Snap.set_snap_axis_method(None)
PolylineDecorator.set_input_panel(self.input_panel, self.input_type)
self.visible_objs = tool.Raycast.get_visible_objects(context)
for obj in self.visible_objs:
+24 -9
View File
@@ -192,7 +192,7 @@ class Snap(bonsai.core.tool.Snap):
def create_axis_line_data(rot_mat, origin):
length = 1000
direction = Vector((1, 0, 0))
if cls.snap_plane_method == "YZ" or cls.snap_axis_method == "Z":
if cls.snap_plane_method == "YZ":
direction = Vector((0, 0, 1))
rot_dir = rot_mat.inverted() @ direction
start = origin + rot_dir * length
@@ -452,7 +452,7 @@ class Snap(bonsai.core.tool.Snap):
else:
rot_intersection, cls.snap_angle, axis_start, axis_end = cls.snap_on_axis(intersection, None)
if rot_intersection:
detected_snaps.append({"Axis": rot_intersection})
detected_snaps.append({"Axis": (rot_intersection, axis_start, axis_end)})
detected_snaps.append({"Plane": intersection})
@@ -479,26 +479,41 @@ class Snap(bonsai.core.tool.Snap):
for op in options:
snapping_points.append(op)
elif "Edge-Vertex" in list(origin.keys()):
if "Edge-Vertex" in list(origin.keys()):
snap_obj, options = origin["Edge-Vertex"]
for op in options:
snapping_points.append(op)
elif "Polyline" in list(origin.keys()):
if "Polyline" in list(origin.keys()):
options = origin["Polyline"]
for op in options:
snapping_points.append(op)
elif "Axis" in list(origin.keys()):
if "Axis" in list(origin.keys()):
intersection = origin["Axis"]
snapping_points.append((intersection, "Axis"))
axis_start = intersection[1]
axis_end = intersection[2]
snapping_points.append((intersection[0], "Axis"))
elif "Plane" in list(origin.keys()):
if "Plane" in list(origin.keys()):
intersection = origin["Plane"]
snapping_points.append((intersection, "Plane"))
cls.update_snapping_point(snapping_points[0][0], snapping_points[0][1])
return snapping_points
# Make Axis first priority
if event.shift or cls.snap_axis_method in {"X", "Y", "Z"}:
cls.update_snapping_ref(snapping_points[0][0], snapping_points[0][1])
for point in snapping_points:
if point[1] == "Axis":
if snapping_points[0][1] not in {"Axis", "Plane"}:
mixed_snap = cls.mix_snap_and_axis(snapping_points[0], axis_start, axis_end, 0)
cls.update_snapping_point(mixed_snap[0], mixed_snap[1])
return snapping_points
cls.update_snapping_point(point[0], point[1])
return snapping_points
cls.update_snapping_point(snapping_points[0][0], snapping_points[0][1])
return snapping_points
@classmethod
def modify_snapping_point_selection(cls, snapping_points):