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
|
|
|
|
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-09-01 11:16:11 +00:00
|
|
|
def poll(self, context=None):
|
|
|
|
return op_poll(self.idname_py(), context)
|
|
|
|
|
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):
|
|
|
|
|
|
|
|
# Get the operator from blender
|
|
|
|
if len(args) > 2:
|
|
|
|
raise ValueError("1 or 2 args execution context is supported")
|
|
|
|
|
|
|
|
C_dict = None
|
|
|
|
|
|
|
|
if args:
|
|
|
|
|
|
|
|
C_exec = 'EXEC_DEFAULT'
|
|
|
|
|
|
|
|
if len(args) == 2:
|
|
|
|
C_exec = args[0]
|
|
|
|
C_dict = args[1]
|
|
|
|
else:
|
|
|
|
if type(args[0]) != str:
|
|
|
|
C_dict = args[0]
|
|
|
|
else:
|
|
|
|
C_exec = args[0]
|
|
|
|
|
|
|
|
if len(args) == 2:
|
|
|
|
C_dict = args[1]
|
|
|
|
|
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-01-26 08:41:16 +00:00
|
|
|
ret = op_call(self.idname_py(), C_dict, kw)
|
|
|
|
|
|
|
|
if 'FINISHED' in ret:
|
|
|
|
import bpy
|
2010-03-01 12:44:28 +00:00
|
|
|
scene = bpy.context.scene
|
2010-09-07 15:17:42 +00:00
|
|
|
if scene: # None in backgroud mode
|
2010-03-01 12:44:28 +00:00
|
|
|
scene.update()
|
|
|
|
else:
|
|
|
|
for scene in bpy.data.scenes:
|
|
|
|
scene.update()
|
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)
|
|
|
|
descr = getattr(bpy.types, idname).bl_rna.description
|
|
|
|
return as_string + "\n" + descr
|
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()
|