modify the python context access so invalid names will raise an exception rather...
[blender-staging.git] / release / scripts / modules / bpy_types.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 import bpy
20
21 StructRNA = bpy.types.Struct.__bases__[0]
22 # StructRNA = bpy.types.Struct
23
24
25 class Context(StructRNA):
26     
27     def copy(self):
28         new_context = {}
29         for item in dir(self):
30             if item not in StructRNA.__dict__ and item != "id_data":
31                 new_context[item] = getattr(self, item)
32             
33         return new_context
34
35
36 class Object(bpy.types.ID):
37
38     def _get_children(self):
39         return [child for child in bpy.data.objects if child.parent == self]
40
41     children = property(_get_children)
42
43
44 def ord_ind(i1,i2):
45     if i1<i2: return i1,i2
46     return i2,i1
47
48 class Mesh(bpy.types.ID):
49     
50     def _get_edge_keys(self):
51         return [edge_key for face in self.faces for edge_key in face.edge_keys]
52
53     edge_keys = property(_get_edge_keys)
54
55     def _get_edge_face_count_dict(self):
56         face_edge_keys = [face.edge_keys for face in self.faces]
57         face_edge_count = {}
58         for face_keys in face_edge_keys:
59             for key in face_keys:
60                 try:
61                     face_edge_count[key] += 1
62                 except:
63                     face_edge_count[key] = 1
64
65         return face_edge_count
66
67     edge_face_count_dict = property(_get_edge_face_count_dict)
68
69     def _get_edge_face_count(self):
70         edge_face_count_dict = self.edge_face_count_dict
71         return [edge_face_count_dict.get(ed.key, 0) for ed in mesh.edges]
72
73     edge_face_count = property(_get_edge_face_count)
74
75
76 class MeshEdge(StructRNA):
77
78     def _get_key(self):
79         return ord_ind(*tuple(self.verts))
80
81     key = property(_get_key)
82
83
84 class MeshFace(StructRNA):
85
86     def _get_edge_keys(self):
87         verts = tuple(self.verts)
88         if len(verts)==3:
89             return ord_ind(verts[0], verts[1]),  ord_ind(verts[1], verts[2]),  ord_ind(verts[2], verts[0])
90
91         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])
92
93     edge_keys = property(_get_edge_keys)