From 17a0face6e0a5e90c940e991adcfa54e9a3063c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Sat, 3 Aug 2024 14:32:24 -0300 Subject: [PATCH] Now the mouse snaps in angle axis in 30 degree intervals --- .../blenderbim/bim/module/model/wall.py | 46 ++----------------- src/blenderbim/blenderbim/tool/snaping.py | 28 +++++++++++ 2 files changed, 33 insertions(+), 41 deletions(-) diff --git a/src/blenderbim/blenderbim/bim/module/model/wall.py b/src/blenderbim/blenderbim/bim/module/model/wall.py index d12c227d96..d1fa81c248 100644 --- a/src/blenderbim/blenderbim/bim/module/model/wall.py +++ b/src/blenderbim/blenderbim/bim/module/model/wall.py @@ -464,51 +464,12 @@ class DrawPolylineWall(bpy.types.Operator): else: return None, None, None - - def get_snap_points(obj, face_index): - snap_points = {} - matrix = obj.matrix_world.copy() - face = obj.data.polygons[face_index] - vertices = [] - for i in face.vertices: - vertices.append(matrix @ obj.data.vertices[i].co) - - edges_center = [] - for v1, v2 in zip(vertices, vertices[1:] + [vertices[0]]): - middle_dist = (v2-v1) / 2 - edges_center.append(v1 + middle_dist) - - snap_points.update({tuple(vertex): "Vertices" for vertex in vertices}) - snap_points.update({tuple(edge_center): "Edge Center" for edge_center in edges_center}) - - return snap_points - - - def select_snap_point(snap_points, hit, threshold): - shortest_distance = None - snap_point = None - for point, snap_type in snap_points.items(): - point = Vector(point) - distance = (point - hit).length - if distance > threshold: - continue - if shortest_distance and distance < shortest_distance: - shortest_distance = distance - snap_point = (point, snap_type) - - elif not shortest_distance: - shortest_distance = distance - snap_point = (point, snap_type) - else: - pass - - return snap_point - snap_threshold = 0.3 ray_origin, ray_target, ray_direction = get_viewport_ray_data() obj, hit, face_index = cast_rays_and_get_best_object() intersection = ray_cast_to_plane(context, plane_origin, plane_normal) + rot_intersection = tool.Snaping.snap_on_axis(intersection) if obj is not None: @@ -524,7 +485,10 @@ class DrawPolylineWall(bpy.types.Operator): tool.Snaping.update_snaping_point(hit, "Face") else: - tool.Snaping.update_snaping_point(intersection, "Plane") + if rot_intersection: + tool.Snaping.update_snaping_point(rot_intersection, "Plane") + else: + tool.Snaping.update_snaping_point(intersection, "Plane") diff --git a/src/blenderbim/blenderbim/tool/snaping.py b/src/blenderbim/blenderbim/tool/snaping.py index 101964088a..e69b774c64 100644 --- a/src/blenderbim/blenderbim/tool/snaping.py +++ b/src/blenderbim/blenderbim/tool/snaping.py @@ -18,6 +18,7 @@ import bpy import blenderbim.core.tool +import math import mathutils from mathutils import Matrix, Vector @@ -98,3 +99,30 @@ class Snaping(blenderbim.core.tool.Snaping): def remove_last_polyline_point(cls): polyline_data = bpy.context.scene.BIMModelProperties.polyline_point polyline_data.remove(len(polyline_data) - 1) + + def snap_on_axis(intersection): + polyline_data = bpy.context.scene.BIMModelProperties.polyline_point + if polyline_data: + last_point_data =polyline_data[-1] + last_point = Vector((last_point_data.x, last_point_data.y, last_point_data.z)) + else: + last_point = Vector((0, 0, 0)) + + # translates intersection point based on last_point + translated_intersection = intersection - last_point + for i in range(12): + angle = 30 * i + rot_mat = Matrix.Rotation(math.radians(360 - angle), 3, 'Z') + rot_intersection = rot_mat @ translated_intersection + print("ROT_INT", rot_intersection) + is_on_rot_axis = abs(rot_intersection.y) <= 0.60 + if is_on_rot_axis: + # snap to axis + rot_intersection = Vector((rot_intersection.x, 0, rot_intersection.z)) + # convert it back + snap_intersection = rot_mat.inverted() @ rot_intersection + last_point + print('SNAP', snap_intersection) + return snap_intersection + + return None +