1 # SPDX-License-Identifier: GPL-2.0-or-later
5 # ----------------------------------------------------------
7 # Modified by: Alan Odom (Clockmender) & Rune Morling (ermo)
8 # ----------------------------------------------------------
13 from . import pdt_cad_module
as cm
14 from .pdt_msg_strings
import (
19 from .pdt_functions
import debug
, oops
22 def add_line_to_bisection(context
):
23 """Computes Bisector of 2 Co-Planar Edges.
26 context: Blender bpy.context instance
33 if all([bool(obj
), obj
.type == "MESH", obj
.mode
== "EDIT"]):
34 pg
= context
.scene
.pdt_pg
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")
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")
62 # get intersect_point and pick farthest vertex from (projected) intersections
63 intersect_point
= cm
.get_intersection(edge1
, edge2
)
66 if (vector_a
- intersect_point
).length
< (vector_b
- intersect_point
).length
71 if (vector_c
- intersect_point
).length
< (vector_d
- intersect_point
).length
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
)
90 pg
.error
= f
"{PDT_ERR_EDOB_MODE},{obj.mode})"
91 context
.window_manager
.popup_menu(oops
, title
="Error", icon
="ERROR")
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"}
103 def poll(cls
, context
):
104 """Only allow operation on a mesh object in EDIT mode.
107 context: Blender bpy.context instance.
113 obj
= context
.active_object
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.
122 Requires an Active Object
123 Active Object must be Mesh type
124 Active Object must be in Edit Mode.
127 context: Blender bpy.context instance.
133 pg
= context
.scene
.pdt_pg