c8abb15ae69efcbfa1693c1478fc1e3f0765db4d
[blender-staging.git] / release / scripts / modules / bpy_ext / Mesh.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 def ord_ind(i1,i2):
20     if i1<i2: return i1,i2
21     return i2,i1
22
23 def edge_key(ed):
24     v1, v2 = tuple(ed.verts)
25     return ord_ind(v1, v2)
26
27 def face_edge_keys(face):
28     verts = tuple(face.verts)
29     if len(verts)==3:
30         return ord_ind(verts[0], verts[1]),  ord_ind(verts[1], verts[2]),  ord_ind(verts[2], verts[0])
31
32     return ord_ind(verts[0], verts[1]),  ord_ind(verts[1], verts[2]),  ord_ind(verts[2], verts[3]),  ord_ind(verts[3], verts[0])
33
34 def mesh_edge_keys(mesh):
35     return [edge_key for face in mesh.faces for edge_key in face.edge_keys()]
36
37 def mesh_edge_face_count_dict(mesh, face_edge_keys=None):
38
39     # Optional speedup
40     if face_edge_keys==None:
41         face_edge_keys = [face.edge_keys() for face in face_list]
42
43     face_edge_count = {}
44     for face_keys in face_edge_keys:
45         for key in face_keys:
46             try:
47                 face_edge_count[key] += 1
48             except:
49                 face_edge_count[key] = 1
50
51
52     return face_edge_count
53
54 def mesh_edge_face_count(mesh, face_edge_keys=None):
55     edge_face_count_dict = mesh.edge_face_count_dict(face_edge_keys)
56     return [edge_face_count_dict.get(ed.key(), 0) for ed in mesh.edges]
57
58 import bpy
59
60 # * Edge *
61 class_obj = bpy.types.MeshEdge
62 class_obj.key = edge_key
63
64 # * Face *
65 class_obj = bpy.types.MeshFace
66 class_obj.edge_keys = face_edge_keys
67
68 # * Mesh *
69 class_obj = bpy.types.Mesh
70 class_obj.edge_keys = mesh_edge_keys
71 class_obj.edge_face_count = mesh_edge_face_count
72 class_obj.edge_face_count_dict = mesh_edge_face_count_dict