From 315b6060b0147833ee3936ff4b9a3bca4eb1f859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bruno=20Perdig=C3=A3o?= Date: Tue, 13 Aug 2024 17:35:36 -0300 Subject: [PATCH] WIP: Changed coordinates, distance and angles calculations to allow for 3d vectors --- .../bonsai/bim/module/model/decorator.py | 8 -------- src/bonsai/bonsai/tool/cad.py | 20 +++++++++++++++++++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/bonsai/bonsai/bim/module/model/decorator.py b/src/bonsai/bonsai/bim/module/model/decorator.py index 08f3155d5e..02d838dbec 100644 --- a/src/bonsai/bonsai/bim/module/model/decorator.py +++ b/src/bonsai/bonsai/bim/module/model/decorator.py @@ -343,14 +343,6 @@ class WallPolylineDecorator: @classmethod def calculate_distance_and_angle(cls, context, is_input_on): - def calculate_angle(snap_vector, last_point, second_to_last_point): - v1 = snap_vector - last_point - v2 = last_point - second_to_last_point - cos_angle = (v1.dot(v2)) / (v1.length * v2.length) - if cos_angle > 1: - cos_angle = 1 - angle = acos(cos_angle) - return degrees(angle) try: polyline_data = context.scene.BIMModelProperties.polyline_point diff --git a/src/bonsai/bonsai/tool/cad.py b/src/bonsai/bonsai/tool/cad.py index d7f114558a..cb5bfaa372 100644 --- a/src/bonsai/bonsai/tool/cad.py +++ b/src/bonsai/bonsai/tool/cad.py @@ -84,6 +84,26 @@ class Cad: a = (edge1[1] - edge1[0]).angle(edge2[1] - edge2[0]) return math.degrees(a) if degrees else a + @classmethod + def angle_3_vectors(cls, v1, v2, v3, degrees=False): + """ + > takes 3 vectors. The order matters, v2 is the center point. + < returns the potentially signed angle as degrees or radians + """ + d1 = v1 - v2 + d2 = v2 - v3 + cos_a = (d1.dot(d2)) / (d1.length * d2.length) + + cos_a = max(-1, min(1, cos_a)) + + print(v1, v2, v3) + print(cos_a) + a = math.acos(cos_a) + if degrees: + return math.degrees(a) + else: + return a + @classmethod def is_x(cls, value: float, x: float, tolerance: float | None = None) -> bool: """