Cleanup: trailing space
[blender-addons.git] / precision_drawing_tools / pdt_bix.py
blob2d5886fd9e2b396e886f1e94340969518f6abdef
1 # SPDX-License-Identifier: GPL-2.0-or-later
3 # <pep8 compliant>
5 # ----------------------------------------------------------
6 # Author: Zeffii
7 # Modified by: Alan Odom (Clockmender) & Rune Morling (ermo)
8 # ----------------------------------------------------------
11 import bpy
12 import bmesh
13 from . import pdt_cad_module as cm
14 from .pdt_msg_strings import (
15 PDT_ERR_2CPNPE,
16 PDT_ERR_NCEDGES,
17 PDT_ERR_EDOB_MODE,
19 from .pdt_functions import debug, oops
22 def add_line_to_bisection(context):
23 """Computes Bisector of 2 Co-Planar Edges.
25 Args:
26 context: Blender bpy.context instance
28 Returns:
29 Nothing.
30 """
32 obj = context.object
33 if all([bool(obj), obj.type == "MESH", obj.mode == "EDIT"]):
34 pg = context.scene.pdt_pg
35 obj_data = obj.data
36 bm = bmesh.from_edit_mesh(obj_data)
38 bm.verts.ensure_lookup_table()
39 bm.edges.ensure_lookup_table()
41 edges = [e for e in bm.edges if e.select and not e.hide]
43 if not len(edges) == 2:
44 pg.error = f"{PDT_ERR_2CPNPE}"
45 context.window_manager.popup_menu(oops, title="Error", icon="ERROR")
46 return
48 [[vector_a, vector_b], [vector_c, vector_d]] = [[v.co for v in e.verts] for e in edges]
49 debug(f"vectors found:\n {vector_a}\n {vector_b}\n {vector_c}\n {vector_d}")
51 dist1 = (vector_a - vector_b).length
52 dist2 = (vector_c - vector_d).length
53 bdist = min([dist1, dist2])
54 edge1 = (vector_a, vector_b)
55 edge2 = (vector_c, vector_d)
57 if not cm.test_coplanar(edge1, edge2):
58 pg.error = PDT_ERR_NCEDGES
59 context.window_manager.popup_menu(oops, title="Error", icon="ERROR")
60 return
62 # get intersect_point and pick farthest vertex from (projected) intersections
63 intersect_point = cm.get_intersection(edge1, edge2)
64 far1 = (
65 vector_b
66 if (vector_a - intersect_point).length < (vector_b - intersect_point).length
67 else vector_a
69 far2 = (
70 vector_d
71 if (vector_c - intersect_point).length < (vector_d - intersect_point).length
72 else vector_c
75 dex1 = far1 - intersect_point
76 dex2 = far2 - intersect_point
77 dex1 = dex1 * (bdist / dex1.length)
78 dex2 = dex2 * (bdist / dex2.length)
79 intersect_point2 = intersect_point + (dex1).lerp(dex2, 0.5)
80 intersect_point3 = intersect_point2.lerp(intersect_point, 2.0)
82 vec1 = bm.verts.new(intersect_point2)
83 vec2 = bm.verts.new(intersect_point)
84 vec3 = bm.verts.new(intersect_point3)
85 bm.edges.new((vec1, vec2))
86 bm.edges.new((vec2, vec3))
87 bmesh.ops.remove_doubles(bm, verts=bm.verts, dist=0.0001)
88 bmesh.update_edit_mesh(obj_data)
89 else:
90 pg.error = f"{PDT_ERR_EDOB_MODE},{obj.mode})"
91 context.window_manager.popup_menu(oops, title="Error", icon="ERROR")
92 return
95 class PDT_OT_LineOnBisection(bpy.types.Operator):
96 """Create Bisector between 2 Selected Edges"""
98 bl_idname = "pdt.linetobisect"
99 bl_label = "Add Edges Bisector"
100 bl_options = {"REGISTER", "UNDO"}
102 @classmethod
103 def poll(cls, context):
104 """Only allow operation on a mesh object in EDIT mode.
106 Args:
107 context: Blender bpy.context instance.
109 Returns:
110 Boolean.
113 obj = context.active_object
114 if obj is None:
115 return False
116 return all([obj is not None, obj.type == "MESH", obj.mode == "EDIT"])
118 def execute(self, context):
119 """Computes Bisector of 2 Co-Planar Edges.
121 Note:
122 Requires an Active Object
123 Active Object must be Mesh type
124 Active Object must be in Edit Mode.
126 Args:
127 context: Blender bpy.context instance.
129 Returns:
130 Status Set.
133 pg = context.scene.pdt_pg
134 pg.command = f"bis"
135 return {"FINISHED"}