Update scripts to account for removal of the context override to bpy.ops
[blender-addons.git] / mesh_tiny_cad / BIX.py
blob5db3fdda55b073421957762c0a7b43530c47e145
1 # SPDX-License-Identifier: GPL-2.0-or-later
4 import bpy
5 import bmesh
6 from . import cad_module as cm
9 def add_line_to_bisection(self):
11 obj = bpy.context.object
12 me = obj.data
13 bm = bmesh.from_edit_mesh(me)
15 bm.verts.ensure_lookup_table()
16 bm.edges.ensure_lookup_table()
18 edges = [e for e in bm.edges if e.select and not e.hide]
20 if not len(edges) == 2:
21 msg = "select two coplanar non parallel edges"
22 self.report({"WARNING"}, msg)
23 return
25 [[v1, v2], [v3, v4]] = [[v.co for v in e.verts] for e in edges]
26 print('vectors found:\n', v1, '\n', v2, '\n', v3, '\n', v4)
28 dist1 = (v1 - v2).length
29 dist2 = (v3 - v4).length
30 bdist = min([dist1, dist2])
31 edge1 = (v1, v2)
32 edge2 = (v3, v4)
34 if not cm.test_coplanar(edge1, edge2):
35 msg = "edges must be coplanar non parallel edges"
36 self.report({"WARNING"}, msg)
37 return
39 # get pt and pick fartest vertex from (projected) intersections
40 pt = cm.get_intersection(edge1, edge2)
41 far1 = v2 if (v1 - pt).length < (v2 - pt).length else v1
42 far2 = v4 if (v3 - pt).length < (v4 - pt).length else v3
43 # print('intersection: ', pt)
45 dex1 = far1 - pt
46 dex2 = far2 - pt
47 dex1 = dex1 * (bdist / dex1.length)
48 dex2 = dex2 * (bdist / dex2.length)
49 pt2 = pt + (dex1).lerp(dex2, 0.5)
50 # print('bisector point:', pt2)
52 pt3 = pt2.lerp(pt, 2.0)
54 vec1 = bm.verts.new(pt2)
55 vec2 = bm.verts.new(pt)
56 vec3 = bm.verts.new(pt3)
57 bm.edges.new((vec1, vec2))
58 bm.edges.new((vec2, vec3))
59 bmesh.update_edit_mesh(me)
60 # print("done")
63 class TCLineOnBisection(bpy.types.Operator):
64 '''Generate the bisector of two selected edges'''
65 bl_idname = 'tinycad.linetobisect'
66 bl_label = 'BIX line to bisector'
67 bl_options = {'REGISTER', 'UNDO'}
69 @classmethod
70 def poll(cls, context):
71 obj = context.active_object
72 return all([obj is not None, obj.type == 'MESH', obj.mode == 'EDIT'])
74 def execute(self, context):
75 add_line_to_bisection(self)
76 return {'FINISHED'}