Merge with -r 22620:23107.
[blender.git] / release / ui / bpy_ops.py
1 # for slightly faster access
2 from bpy.__ops__ import add             as op_add
3 from bpy.__ops__ import remove          as op_remove
4 from bpy.__ops__ import dir             as op_dir
5 from bpy.__ops__ import call            as op_call
6 from bpy.__ops__ import get_rna as op_get_rna
7
8 # Keep in sync with WM_types.h
9 context_dict = {
10         'INVOKE_DEFAULT':0,
11         'INVOKE_REGION_WIN':1,
12         'INVOKE_AREA':2,
13         'INVOKE_SCREEN':3,
14         'EXEC_DEFAULT':4,
15         'EXEC_REGION_WIN':5,
16         'EXEC_AREA':6,
17         'EXEC_SCREEN':7,
18 }
19
20 class bpy_ops(object):
21         '''
22         Fake module like class.
23         
24          bpy.ops
25         '''
26         def add(self, pyop):
27                 op_add(pyop)
28         
29         def remove(self, pyop):
30                 op_remove(pyop)
31         
32         def __getattr__(self, module):
33                 '''
34                 gets a bpy.ops submodule
35                 '''
36                 return bpy_ops_submodule(module)
37                 
38         def __dir__(self):
39                 
40                 submodules = set()
41                 
42                 # add this classes functions
43                 for id_name in dir(self.__class__):
44                         if not id_name.startswith('__'):
45                                 submodules.add(id_name)
46                 
47                 for id_name in op_dir():
48                         id_split = id_name.split('_OT_', 1)
49                         
50                         if len(id_split) == 2:
51                                 submodules.add(id_split[0].lower())
52                         else:
53                                 submodules.add(id_split[0])
54                 
55                 return list(submodules)
56                 
57         def __repr__(self):
58                 return "<module like class 'bpy.ops'>"
59
60
61 class bpy_ops_submodule(object):
62         '''
63         Utility class to fake submodules.
64         
65         eg. bpy.ops.object
66         '''
67         __keys__ = ('module',)
68         
69         def __init__(self, module):
70                 self.module = module
71                 
72         def __getattr__(self, func):
73                 '''
74                 gets a bpy.ops.submodule function
75                 '''
76                 return bpy_ops_submodule_op(self.module, func)
77                 
78         def __dir__(self):
79                 
80                 functions = set()
81                 
82                 module_upper = self.module.upper()
83                 
84                 for id_name in op_dir():
85                         id_split = id_name.split('_OT_', 1)
86                         if len(id_split) == 2 and module_upper == id_split[0]:
87                                 functions.add(id_split[1])
88                 
89                 return list(functions)
90         
91         def __repr__(self):
92                 return "<module like class 'bpy.ops.%s'>" % self.module
93
94 class bpy_ops_submodule_op(object):
95         '''
96         Utility class to fake submodule operators.
97         
98         eg. bpy.ops.object.somefunc
99         '''
100         __keys__ = ('module', 'func')
101         def __init__(self, module, func):
102                 self.module = module
103                 self.func = func
104         
105         def idname(self):
106                 # submod.foo -> SUBMOD_OT_foo
107                 return self.module.upper() + '_OT_' + self.func
108         
109         def __call__(self, *args, **kw):
110                 
111                 # Get the operator from blender
112                 if len(args) > 1:
113                         raise ValueError("only one argument for the execution context is supported ")
114                 
115                 if args:
116                         try:
117                                 context = context_dict[args[0]]
118                         except:
119                                 raise ValueError("Expected a single context argument in: " + str(list(context_dict.keys())))
120                         
121                         return op_call(self.idname(), kw, context)
122                 
123                 else:
124                         return op_call(self.idname(), kw)
125         
126         def get_rna(self):
127                 '''
128                 currently only used for '__rna__'
129                 '''
130                 return op_get_rna(self.idname())
131                         
132         
133         def __repr__(self):
134                 return "<function bpy.ops.%s.%s at 0x%x'>" % (self.module, self.func, id(self))
135
136 import bpy
137 bpy.ops = bpy_ops()