2023-08-16 00:20:26 +10:00
|
|
|
# SPDX-FileCopyrightText: 2009-2023 Blender Authors
|
2023-06-15 13:09:04 +10:00
|
|
|
#
|
2022-02-11 09:07:11 +11:00
|
|
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
2009-10-31 20:16:59 +00:00
|
|
|
|
2009-07-19 13:32:02 +00:00
|
|
|
# for slightly faster access
|
2020-10-08 17:55:17 +11:00
|
|
|
from _bpy import ops as _ops_module
|
2009-11-13 09:28:05 +00:00
|
|
|
|
2020-10-08 17:55:17 +11:00
|
|
|
# op_add = _ops_module.add
|
|
|
|
|
_op_dir = _ops_module.dir
|
2025-10-11 03:04:57 +00:00
|
|
|
_op_create_function = _ops_module.create_function
|
2009-07-17 12:26:40 +00:00
|
|
|
|
2020-10-08 17:55:17 +11:00
|
|
|
_ModuleType = type(_ops_module)
|
2010-02-22 23:32:58 +00:00
|
|
|
|
2009-10-31 01:23:49 +00:00
|
|
|
|
2020-10-08 17:43:08 +11:00
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
# Sub-Module Access
|
|
|
|
|
|
|
|
|
|
def _bpy_ops_submodule__getattr__(module, func):
|
2025-10-11 03:04:57 +00:00
|
|
|
# Return a `BPyOpsCallable` object that bypasses Python `__call__` overhead
|
|
|
|
|
# for improved operator execution performance.
|
2020-10-08 17:43:08 +11:00
|
|
|
if func.startswith("__"):
|
|
|
|
|
raise AttributeError(func)
|
2025-10-11 03:04:57 +00:00
|
|
|
return _op_create_function(module, func)
|
2020-10-08 17:43:08 +11:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def _bpy_ops_submodule__dir__(module):
|
|
|
|
|
functions = set()
|
|
|
|
|
module_upper = module.upper()
|
|
|
|
|
|
2020-10-08 17:55:17 +11:00
|
|
|
for id_name in _op_dir():
|
2020-10-08 17:43:08 +11: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 _bpy_ops_submodule(module):
|
|
|
|
|
result = _ModuleType("bpy.ops." + module)
|
|
|
|
|
result.__getattr__ = lambda func: _bpy_ops_submodule__getattr__(module, func)
|
|
|
|
|
result.__dir__ = lambda: _bpy_ops_submodule__dir__(module)
|
|
|
|
|
return result
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
# Module Access
|
|
|
|
|
|
|
|
|
|
def __getattr__(module):
|
|
|
|
|
# Return a value from `bpy.ops.{module}`.
|
|
|
|
|
if module.startswith("__"):
|
|
|
|
|
raise AttributeError(module)
|
|
|
|
|
return _bpy_ops_submodule(module)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def __dir__():
|
|
|
|
|
submodules = set()
|
2020-10-08 17:55:17 +11:00
|
|
|
for id_name in _op_dir():
|
2020-10-08 17:43:08 +11: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)
|