From 2a1bc30f1900f7b992555b5c5333b48a559e679a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Mon, 26 Aug 2024 15:39:19 -0300 Subject: [PATCH] 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. --- .../bonsai/bim/module/project/operator.py | 7 ++++ src/bonsai/bonsai/tool/snap.py | 33 ++++++++++++++----- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/project/operator.py b/src/bonsai/bonsai/bim/module/project/operator.py index 9b7b73cc7d..ab5b2107cc 100644 --- a/src/bonsai/bonsai/bim/module/project/operator.py +++ b/src/bonsai/bonsai/bim/module/project/operator.py @@ -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: diff --git a/src/bonsai/bonsai/tool/snap.py b/src/bonsai/bonsai/tool/snap.py index 80ce36ac58..f72581963c 100644 --- a/src/bonsai/bonsai/tool/snap.py +++ b/src/bonsai/bonsai/tool/snap.py @@ -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):