Merge branch 'blender-v4.0-release'
[blender-addons.git] / mesh_tiny_cad / BIX.py
blob949f5fb5dc5fc0f063d462f2203a2011d1b8251a
1 # SPDX-FileCopyrightText: 2016-2022 Blender Foundation
3 # SPDX-License-Identifier: GPL-2.0-or-later
6 import bpy
7 import bmesh
8 from . import cad_module as cm
11 def add_line_to_bisection(self):
13 obj = bpy.context.object
14 me = obj.data
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)
25 return
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])
33 edge1 = (v1, v2)
34 edge2 = (v3, v4)
36 if not cm.test_coplanar(edge1, edge2):
37 msg = "edges must be coplanar non parallel edges"
38 self.report({"WARNING"}, msg)
39 return
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)
47 dex1 = far1 - pt
48 dex2 = far2 - 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)
62 # print("done")
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'}
71 @classmethod
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)
78 return {'FINISHED'}