adds lookup tests to support older versions of blender too
[blender-addons-contrib.git] / mesh_tinyCAD / CCEN.py
1 '''
2 BEGIN GPL LICENSE BLOCK
3
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.    See the
12 GNU General Public License for more details.
13
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
17
18 END GPL LICENCE BLOCK
19 '''
20
21 import math
22
23 import bpy
24 import bmesh
25 import mathutils
26 from mathutils import geometry
27 from mathutils import Vector
28
29
30 def generate_3PT_mode_1(pts=[]):
31     V = Vector
32
33     # construction
34     v1, v2, v3, v4 = V(pts[0]), V(pts[1]), V(pts[1]), V(pts[2])
35     edge1_mid = v1.lerp(v2, 0.5)
36     edge2_mid = v3.lerp(v4, 0.5)
37     axis = geometry.normal(v1, v2, v4)
38     mat_rot = mathutils.Matrix.Rotation(math.radians(90.0), 4, axis)
39
40     # triangle edges
41     v1_ = ((v1 - edge1_mid) * mat_rot) + edge1_mid
42     v2_ = ((v2 - edge1_mid) * mat_rot) + edge1_mid
43     v3_ = ((v3 - edge2_mid) * mat_rot) + edge2_mid
44     v4_ = ((v4 - edge2_mid) * mat_rot) + edge2_mid
45
46     r = geometry.intersect_line_line(v1_, v2_, v3_, v4_)
47     if r:
48         p1, _ = r
49         bpy.context.scene.cursor_location = p1
50
51     else:
52         print('not on a circle')
53
54
55 def get_three_verts_from_selection(obj):
56     me = obj.data
57     bm = bmesh.from_edit_mesh(me)
58
59     if hasattr(bm.verts, "ensure_lookup_table"):
60         bm.verts.ensure_lookup_table()
61         bm.edges.ensure_lookup_table()
62
63     return [v.co[:] for v in bm.verts if v.select]
64
65
66 class CircleCenter(bpy.types.Operator):
67
68     bl_idname = 'mesh.circlecenter'
69     bl_label = 'circle center from selected'
70     bl_options = {'REGISTER', 'UNDO'}
71
72     @classmethod
73     def poll(self, context):
74         obj = context.active_object
75         return obj is not None and obj.type == 'MESH' and obj.mode == 'EDIT'
76
77     def execute(self, context):
78         obj = bpy.context.object
79         pts = get_three_verts_from_selection(obj)
80         generate_3PT_mode_1(pts)
81         return {'FINISHED'}