1 # SPDX-License-Identifier: GPL-2.0-or-later
8 from . import cad_module
as cm
11 def add_line_to_bisection(self
):
13 obj
= bpy
.context
.object
15 bm
= bmesh
.from_edit_mesh(me
)
17 bm
.verts
.ensure_lookup_table()
18 bm
.edges
.ensure_lookup_table()
20 edges
= [e
for e
in bm
.edges
if e
.select
and not e
.hide
]
22 if not len(edges
) == 2:
23 msg
= "select two coplanar non parallel edges"
24 self
.report({"WARNING"}, msg
)
27 [[v1
, v2
], [v3
, v4
]] = [[v
.co
for v
in e
.verts
] for e
in edges
]
28 print('vectors found:\n', v1
, '\n', v2
, '\n', v3
, '\n', v4
)
30 dist1
= (v1
- v2
).length
31 dist2
= (v3
- v4
).length
32 bdist
= min([dist1
, dist2
])
36 if not cm
.test_coplanar(edge1
, edge2
):
37 msg
= "edges must be coplanar non parallel edges"
38 self
.report({"WARNING"}, msg
)
41 # get pt and pick fartest vertex from (projected) intersections
42 pt
= cm
.get_intersection(edge1
, edge2
)
43 far1
= v2
if (v1
- pt
).length
< (v2
- pt
).length
else v1
44 far2
= v4
if (v3
- pt
).length
< (v4
- pt
).length
else v3
45 # print('intersection: ', pt)
49 dex1
= dex1
* (bdist
/ dex1
.length
)
50 dex2
= dex2
* (bdist
/ dex2
.length
)
51 pt2
= pt
+ (dex1
).lerp(dex2
, 0.5)
52 # print('bisector point:', pt2)
54 pt3
= pt2
.lerp(pt
, 2.0)
56 vec1
= bm
.verts
.new(pt2
)
57 vec2
= bm
.verts
.new(pt
)
58 vec3
= bm
.verts
.new(pt3
)
59 bm
.edges
.new((vec1
, vec2
))
60 bm
.edges
.new((vec2
, vec3
))
61 bmesh
.update_edit_mesh(me
)
65 class TCLineOnBisection(bpy
.types
.Operator
):
66 '''Generate the bisector of two selected edges'''
67 bl_idname
= 'tinycad.linetobisect'
68 bl_label
= 'BIX line to bisector'
69 bl_options
= {'REGISTER', 'UNDO'}
72 def poll(cls
, context
):
73 obj
= context
.active_object
74 return all([obj
is not None, obj
.type == 'MESH', obj
.mode
== 'EDIT'])
76 def execute(self
, context
):
77 add_line_to_bisection(self
)