fixes matrix_world issue
[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, obj):
31     origin = obj.location
32     transform_matrix = obj.matrix_local
33     V = Vector
34
35     # construction
36     v1, v2, v3, v4 = V(pts[0]), V(pts[1]), V(pts[1]), V(pts[2])
37     edge1_mid = v1.lerp(v2, 0.5)
38     edge2_mid = v3.lerp(v4, 0.5)
39     axis = geometry.normal(v1, v2, v4)
40     mat_rot = mathutils.Matrix.Rotation(math.radians(90.0), 4, axis)
41
42     # triangle edges
43     v1_ = ((v1 - edge1_mid) * mat_rot) + edge1_mid
44     v2_ = ((v2 - edge1_mid) * mat_rot) + edge1_mid
45     v3_ = ((v3 - edge2_mid) * mat_rot) + edge2_mid
46     v4_ = ((v4 - edge2_mid) * mat_rot) + edge2_mid
47
48     r = geometry.intersect_line_line(v1_, v2_, v3_, v4_)
49     if r:
50         p1, _ = r
51         # cp = transform_matrix * (p1 + origin)
52         cp = transform_matrix * p1
53         bpy.context.scene.cursor_location = cp
54         # generate_gp3d_stroke(cp, axis, obj, radius=(p1-v1).length)
55     else:
56         print('not on a circle')
57
58
59 def get_three_verts_from_selection(obj):
60     me = obj.data
61     bm = bmesh.from_edit_mesh(me)
62
63     if hasattr(bm.verts, "ensure_lookup_table"):
64         bm.verts.ensure_lookup_table()
65         bm.edges.ensure_lookup_table()
66
67     return [v.co[:] for v in bm.verts if v.select]
68
69
70 class CircleCenter(bpy.types.Operator):
71
72     bl_idname = 'mesh.circlecenter'
73     bl_label = 'circle center from selected'
74     bl_options = {'REGISTER', 'UNDO'}
75
76     @classmethod
77     def poll(self, context):
78         obj = context.active_object
79         return obj is not None and obj.type == 'MESH' and obj.mode == 'EDIT'
80
81     def execute(self, context):
82         obj = bpy.context.object
83         pts = get_three_verts_from_selection(obj)
84         generate_3PT_mode_1(pts, obj)
85         return {'FINISHED'}