2009-07-19 13:32:02 +00:00
|
|
|
# for slightly faster access
|
|
|
|
from bpy.__ops__ import add as op_add
|
|
|
|
from bpy.__ops__ import remove as op_remove
|
|
|
|
from bpy.__ops__ import dir as op_dir
|
|
|
|
from bpy.__ops__ import call as op_call
|
2009-09-16 06:02:56 +00:00
|
|
|
from bpy.__ops__ import as_string as op_as_string
|
2009-07-26 18:18:14 +00:00
|
|
|
from bpy.__ops__ import get_rna as op_get_rna
|
2009-07-17 12:26:40 +00:00
|
|
|
|
2009-09-03 22:37:09 +00:00
|
|
|
# Keep in sync with WM_types.h
|
|
|
|
context_dict = {
|
|
|
|
'INVOKE_DEFAULT':0,
|
|
|
|
'INVOKE_REGION_WIN':1,
|
|
|
|
'INVOKE_AREA':2,
|
|
|
|
'INVOKE_SCREEN':3,
|
|
|
|
'EXEC_DEFAULT':4,
|
|
|
|
'EXEC_REGION_WIN':5,
|
|
|
|
'EXEC_AREA':6,
|
|
|
|
'EXEC_SCREEN':7,
|
|
|
|
}
|
|
|
|
|
2009-07-17 12:26:40 +00:00
|
|
|
class bpy_ops(object):
|
|
|
|
'''
|
|
|
|
Fake module like class.
|
|
|
|
|
|
|
|
bpy.ops
|
|
|
|
'''
|
|
|
|
def add(self, pyop):
|
2009-07-19 13:32:02 +00:00
|
|
|
op_add(pyop)
|
2009-07-17 12:26:40 +00:00
|
|
|
|
|
|
|
def remove(self, pyop):
|
2009-07-19 13:32:02 +00:00
|
|
|
op_remove(pyop)
|
2009-07-17 12:26:40 +00:00
|
|
|
|
|
|
|
def __getattr__(self, module):
|
|
|
|
'''
|
|
|
|
gets a bpy.ops submodule
|
|
|
|
'''
|
|
|
|
return bpy_ops_submodule(module)
|
|
|
|
|
|
|
|
def __dir__(self):
|
|
|
|
|
|
|
|
submodules = set()
|
|
|
|
|
2009-07-19 14:57:20 +00:00
|
|
|
# add this classes functions
|
|
|
|
for id_name in dir(self.__class__):
|
|
|
|
if not id_name.startswith('__'):
|
|
|
|
submodules.add(id_name)
|
|
|
|
|
2009-07-19 13:32:02 +00:00
|
|
|
for id_name in op_dir():
|
2009-07-17 12:26:40 +00:00
|
|
|
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'>"
|
|
|
|
|
|
|
|
|
|
|
|
class bpy_ops_submodule(object):
|
|
|
|
'''
|
|
|
|
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
|
|
|
|
'''
|
|
|
|
return bpy_ops_submodule_op(self.module, func)
|
|
|
|
|
|
|
|
def __dir__(self):
|
|
|
|
|
|
|
|
functions = set()
|
|
|
|
|
|
|
|
module_upper = self.module.upper()
|
|
|
|
|
2009-07-19 13:32:02 +00:00
|
|
|
for id_name in op_dir():
|
2009-07-17 12:26:40 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
class bpy_ops_submodule_op(object):
|
|
|
|
'''
|
|
|
|
Utility class to fake submodule operators.
|
|
|
|
|
|
|
|
eg. bpy.ops.object.somefunc
|
|
|
|
'''
|
|
|
|
__keys__ = ('module', 'func')
|
|
|
|
def __init__(self, module, func):
|
|
|
|
self.module = module
|
|
|
|
self.func = func
|
|
|
|
|
2009-07-26 18:18:14 +00:00
|
|
|
def idname(self):
|
2009-07-17 12:26:40 +00:00
|
|
|
# submod.foo -> SUBMOD_OT_foo
|
2009-07-26 18:18:14 +00:00
|
|
|
return self.module.upper() + '_OT_' + self.func
|
|
|
|
|
2009-09-03 22:37:09 +00:00
|
|
|
def __call__(self, *args, **kw):
|
2009-07-17 12:26:40 +00:00
|
|
|
|
2009-07-26 18:18:14 +00:00
|
|
|
# Get the operator from blender
|
2009-09-03 22:37:09 +00:00
|
|
|
if len(args) > 1:
|
|
|
|
raise ValueError("only one argument for the execution context is supported ")
|
|
|
|
|
|
|
|
if args:
|
|
|
|
try:
|
|
|
|
context = context_dict[args[0]]
|
|
|
|
except:
|
|
|
|
raise ValueError("Expected a single context argument in: " + str(list(context_dict.keys())))
|
|
|
|
|
|
|
|
return op_call(self.idname(), kw, context)
|
|
|
|
|
|
|
|
else:
|
|
|
|
return op_call(self.idname(), kw)
|
2009-07-26 18:18:14 +00:00
|
|
|
|
|
|
|
def get_rna(self):
|
|
|
|
'''
|
|
|
|
currently only used for '__rna__'
|
|
|
|
'''
|
|
|
|
return op_get_rna(self.idname())
|
|
|
|
|
|
|
|
|
2009-09-16 06:02:56 +00:00
|
|
|
def __repr__(self): # useful display, repr(op)
|
|
|
|
return op_as_string(self.idname())
|
|
|
|
|
|
|
|
def __str__(self): # used for print(...)
|
2009-07-17 12:26:40 +00:00
|
|
|
return "<function bpy.ops.%s.%s at 0x%x'>" % (self.module, self.func, id(self))
|
|
|
|
|
2009-07-19 13:32:02 +00:00
|
|
|
import bpy
|
2009-07-17 12:26:40 +00:00
|
|
|
bpy.ops = bpy_ops()
|