| 
									
										
										
										
											2009-11-01 15:21:20 +00:00
										 |  |  | # ##### BEGIN GPL LICENSE BLOCK ##### | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  | #  modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  | #  as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  | #  of the License, or (at your option) any later version. | 
					
						
							| 
									
										
										
										
											2009-11-07 22:07:46 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2009-11-01 15:21:20 +00:00
										 |  |  | #  This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  | #  but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  | #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  | #  GNU General Public License for more details. | 
					
						
							| 
									
										
										
										
											2009-11-07 22:07:46 +00:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2009-11-01 15:21:20 +00:00
										 |  |  | #  You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  | #  along with this program; if not, write to the Free Software Foundation, | 
					
						
							| 
									
										
										
										
											2010-02-12 13:34:04 +00:00
										 |  |  | #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							| 
									
										
										
										
											2009-11-01 15:21:20 +00:00
										 |  |  | # | 
					
						
							|  |  |  | # ##### END GPL LICENSE BLOCK ##### | 
					
						
							| 
									
										
										
										
											2009-10-31 20:16:59 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 23:35:56 +00:00
										 |  |  | # <pep8-80 compliant> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | # for slightly faster access | 
					
						
							| 
									
										
										
										
											2009-11-13 09:28:05 +00:00
										 |  |  | from _bpy import ops as ops_module | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-24 19:50:43 +00:00
										 |  |  | # op_add = ops_module.add | 
					
						
							| 
									
										
										
										
											2009-11-13 09:28:05 +00:00
										 |  |  | op_dir = ops_module.dir | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  | op_poll = ops_module.poll | 
					
						
							| 
									
										
										
										
											2009-11-13 09:28:05 +00:00
										 |  |  | op_call = ops_module.call | 
					
						
							|  |  |  | op_as_string = ops_module.as_string | 
					
						
							|  |  |  | op_get_rna = ops_module.get_rna | 
					
						
							| 
									
										
										
										
											2009-07-17 12:26:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-22 23:32:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-17 12:26:40 +00:00
										 |  |  | class bpy_ops(object): | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  |     '''
 | 
					
						
							|  |  |  |     Fake module like class. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      bpy.ops | 
					
						
							|  |  |  |     '''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __getattr__(self, module): | 
					
						
							|  |  |  |         '''
 | 
					
						
							|  |  |  |         gets a bpy.ops submodule | 
					
						
							|  |  |  |         '''
 | 
					
						
							|  |  |  |         if module.startswith('__'): | 
					
						
							|  |  |  |             raise AttributeError(module) | 
					
						
							|  |  |  |         return bpy_ops_submodule(module) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __dir__(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         submodules = set() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # add this classes functions | 
					
						
							|  |  |  |         for id_name in dir(self.__class__): | 
					
						
							|  |  |  |             if not id_name.startswith('__'): | 
					
						
							|  |  |  |                 submodules.add(id_name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for id_name in op_dir(): | 
					
						
							|  |  |  |             id_split = id_name.split('_OT_', 1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if len(id_split) == 2: | 
					
						
							|  |  |  |                 submodules.add(id_split[0].lower()) | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 submodules.add(id_split[0]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return list(submodules) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         return "<module like class 'bpy.ops'>" | 
					
						
							| 
									
										
										
										
											2009-07-17 12:26:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class bpy_ops_submodule(object): | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  |     '''
 | 
					
						
							|  |  |  |     Utility class to fake submodules. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     eg. bpy.ops.object | 
					
						
							|  |  |  |     '''
 | 
					
						
							|  |  |  |     __keys__ = ('module',) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, module): | 
					
						
							|  |  |  |         self.module = module | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __getattr__(self, func): | 
					
						
							|  |  |  |         '''
 | 
					
						
							|  |  |  |         gets a bpy.ops.submodule function | 
					
						
							|  |  |  |         '''
 | 
					
						
							| 
									
										
										
										
											2009-11-02 11:14:22 +00:00
										 |  |  |         if func.startswith('__'): | 
					
						
							|  |  |  |             raise AttributeError(func) | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  |         return bpy_ops_submodule_op(self.module, func) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __dir__(self): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         functions = set() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         module_upper = self.module.upper() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for id_name in op_dir(): | 
					
						
							|  |  |  |             id_split = id_name.split('_OT_', 1) | 
					
						
							|  |  |  |             if len(id_split) == 2 and module_upper == id_split[0]: | 
					
						
							|  |  |  |                 functions.add(id_split[1]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return list(functions) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __repr__(self): | 
					
						
							|  |  |  |         return "<module like class 'bpy.ops.%s'>" % self.module | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-17 12:26:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | class bpy_ops_submodule_op(object): | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  |     '''
 | 
					
						
							|  |  |  |     Utility class to fake submodule operators. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     eg. bpy.ops.object.somefunc | 
					
						
							|  |  |  |     '''
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     __keys__ = ('module', 'func') | 
					
						
							| 
									
										
										
										
											2009-11-07 22:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-06 22:42:15 +00:00
										 |  |  |     def _get_doc(self): | 
					
						
							|  |  |  |         return op_as_string(self.idname()) | 
					
						
							| 
									
										
										
										
											2009-11-07 22:07:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-04 12:59:03 +00:00
										 |  |  |     @staticmethod | 
					
						
							|  |  |  |     def _parse_args(args): | 
					
						
							|  |  |  |         C_dict = None | 
					
						
							|  |  |  |         C_exec = 'EXEC_DEFAULT' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if len(args) == 0: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         elif len(args) == 1: | 
					
						
							|  |  |  |             if type(args[0]) != str: | 
					
						
							|  |  |  |                 C_dict = args[0] | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 C_exec = args[0] | 
					
						
							|  |  |  |         elif len(args) == 2: | 
					
						
							|  |  |  |             C_exec, C_dict = args | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             raise ValueError("1 or 2 args execution context is supported") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return C_dict, C_exec | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-22 17:21:18 +00:00
										 |  |  |     @staticmethod | 
					
						
							|  |  |  |     def _scene_update(context): | 
					
						
							|  |  |  |         scene = context.scene | 
					
						
							| 
									
										
										
										
											2011-01-01 07:20:34 +00:00
										 |  |  |         if scene:  # None in backgroud mode | 
					
						
							| 
									
										
										
										
											2010-11-22 17:21:18 +00:00
										 |  |  |             scene.update() | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2010-11-22 23:41:00 +00:00
										 |  |  |             import bpy | 
					
						
							| 
									
										
										
										
											2010-11-22 17:21:18 +00:00
										 |  |  |             for scene in bpy.data.scenes: | 
					
						
							|  |  |  |                 scene.update() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-06 22:42:15 +00:00
										 |  |  |     __doc__ = property(_get_doc) | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, module, func): | 
					
						
							|  |  |  |         self.module = module | 
					
						
							|  |  |  |         self.func = func | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-04 12:59:03 +00:00
										 |  |  |     def poll(self, *args): | 
					
						
							|  |  |  |         C_dict, C_exec = __class__._parse_args(args) | 
					
						
							|  |  |  |         return op_poll(self.idname_py(), C_dict, C_exec) | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  |     def idname(self): | 
					
						
							|  |  |  |         # submod.foo -> SUBMOD_OT_foo | 
					
						
							| 
									
										
										
										
											2010-01-26 08:41:16 +00:00
										 |  |  |         return self.module.upper() + "_OT_" + self.func | 
					
						
							| 
									
										
										
										
											2010-01-31 14:46:28 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-26 08:41:16 +00:00
										 |  |  |     def idname_py(self): | 
					
						
							|  |  |  |         # submod.foo -> SUBMOD_OT_foo | 
					
						
							|  |  |  |         return self.module + "." + self.func | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def __call__(self, *args, **kw): | 
					
						
							| 
									
										
										
										
											2010-11-18 16:33:13 +00:00
										 |  |  |         import bpy | 
					
						
							|  |  |  |         context = bpy.context | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Get the operator from blender | 
					
						
							| 
									
										
										
										
											2010-11-18 16:33:13 +00:00
										 |  |  |         wm = context.window_manager | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-22 17:21:18 +00:00
										 |  |  |         # run to account for any rna values the user changes. | 
					
						
							|  |  |  |         __class__._scene_update(context) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  |         if args: | 
					
						
							| 
									
										
										
										
											2010-11-04 12:59:03 +00:00
										 |  |  |             C_dict, C_exec = __class__._parse_args(args) | 
					
						
							| 
									
										
										
										
											2010-02-10 11:10:38 +00:00
										 |  |  |             ret = op_call(self.idname_py(), C_dict, kw, C_exec) | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2010-11-04 12:59:03 +00:00
										 |  |  |             ret = op_call(self.idname_py(), None, kw) | 
					
						
							| 
									
										
										
										
											2010-01-26 08:41:16 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-18 16:33:13 +00:00
										 |  |  |         if 'FINISHED' in ret and context.window_manager == wm: | 
					
						
							| 
									
										
										
										
											2010-11-22 17:21:18 +00:00
										 |  |  |             __class__._scene_update(context) | 
					
						
							| 
									
										
										
										
											2010-01-26 08:41:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return ret | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_rna(self): | 
					
						
							|  |  |  |         '''
 | 
					
						
							| 
									
										
										
										
											2009-10-31 13:31:23 +00:00
										 |  |  |         currently only used for 'bl_rna' | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  |         '''
 | 
					
						
							|  |  |  |         return op_get_rna(self.idname()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |     def __repr__(self):  # useful display, repr(op) | 
					
						
							| 
									
										
										
										
											2010-02-19 20:09:42 +00:00
										 |  |  |         import bpy | 
					
						
							|  |  |  |         idname = self.idname() | 
					
						
							|  |  |  |         as_string = op_as_string(idname) | 
					
						
							| 
									
										
										
										
											2010-10-06 22:29:34 +00:00
										 |  |  |         op_class = getattr(bpy.types, idname) | 
					
						
							|  |  |  |         descr = op_class.bl_rna.description | 
					
						
							| 
									
										
										
										
											2011-01-01 07:20:34 +00:00
										 |  |  |         # XXX, workaround for not registering | 
					
						
							|  |  |  |         # every __doc__ to save time on load. | 
					
						
							| 
									
										
										
										
											2010-10-06 22:29:34 +00:00
										 |  |  |         if not descr: | 
					
						
							|  |  |  |             descr = op_class.__doc__ | 
					
						
							|  |  |  |             if not descr: | 
					
						
							|  |  |  |                 descr = "" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return "# %s\n%s" % (descr, as_string) | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-07 15:17:42 +00:00
										 |  |  |     def __str__(self):  # used for print(...) | 
					
						
							| 
									
										
										
										
											2009-10-31 01:23:49 +00:00
										 |  |  |         return "<function bpy.ops.%s.%s at 0x%x'>" % \ | 
					
						
							|  |  |  |                 (self.module, self.func, id(self)) | 
					
						
							| 
									
										
										
										
											2009-07-17 12:26:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 11:10:29 +00:00
										 |  |  | ops_fake_module = bpy_ops() |