34#include "RNA_prototypes.hh"
46#define BPY_RELEASE_GIL
50 const char *opname = PyUnicode_AsUTF8(value);
51 if (opname ==
nullptr) {
52 PyErr_Format(PyExc_TypeError,
"%s() expects a string argument", py_fn_id);
58 PyErr_Format(PyExc_KeyError,
"%s(\"%s\") not found", py_fn_id, opname);
64static PyObject *
pyop_poll(PyObject * , PyObject *args)
68 const char *context_str =
nullptr;
78 PyErr_SetString(PyExc_RuntimeError,
"Context is None, can't poll any operators");
83 static const char *_keywords[] = {
"",
"",
nullptr};
84 static _PyArg_Parser _parser = {
93 if (!_PyArg_ParseTupleAndKeywordsFast(args,
nullptr, &_parser, &opname, &context_str)) {
100 PyErr_Format(PyExc_AttributeError,
101 "Polling operator \"bpy.ops.%s\" error, "
102 "could not be found",
108 int context_int = context;
112 PyErr_Format(PyExc_TypeError,
113 "Calling operator \"bpy.ops.%s.poll\" error, "
114 "expected a string enum in (%s)",
127 return Py_NewRef(
ret);
138 const char *context_str =
nullptr;
139 PyObject *kw =
nullptr;
149 PyErr_SetString(PyExc_RuntimeError,
"Context is None, can't poll any operators");
154 static const char *_keywords[] = {
"",
"",
"",
"",
nullptr};
155 static _PyArg_Parser _parser = {
166 if (!_PyArg_ParseTupleAndKeywordsFast(
167 args,
nullptr, &_parser, &opname, &PyDict_Type, &kw, &context_str, &is_undo))
175 PyErr_Format(PyExc_AttributeError,
176 "Calling operator \"bpy.ops.%s\" error, "
177 "could not be found",
183 PyErr_Format(PyExc_RuntimeError,
184 "Calling operator \"bpy.ops.%s\" error, "
185 "can't modify blend data in this state (drawing/rendering)",
191 int context_int = context;
195 PyErr_Format(PyExc_TypeError,
196 "Calling operator \"bpy.ops.%s\" error, "
197 "expected a string enum in (%s)",
208 bool msg_free =
false;
210 PyErr_Format(PyExc_RuntimeError,
211 "Operator bpy.ops.%.200s.poll() %.200s",
213 msg ? msg :
"failed, context is incorrect");
224 if (kw && PyDict_Size(kw)) {
226 &
ptr, kw,
false,
"Converting py args to operator properties:");
229 if (error_val == 0) {
237#ifdef BPY_RELEASE_GIL
243 PyThreadState *ts = PyEval_SaveThread();
248#ifdef BPY_RELEASE_GIL
250 PyEval_RestoreThread(ts);
284 PyErr_Format(PyExc_AttributeError,
"Operator \"%s\" does not take any args", opname);
293 if (error_val == -1) {
312 PyObject *kw =
nullptr;
313 bool all_args =
true;
314 bool macro_args =
true;
320 PyErr_SetString(PyExc_RuntimeError,
321 "Context is None, can't get the string representation of this object.");
326 static const char *_keywords[] = {
"",
"",
"",
"",
nullptr};
327 static _PyArg_Parser _parser = {
334 ":_bpy.ops.as_string",
338 if (!_PyArg_ParseTupleAndKeywordsFast(args,
355 PyErr_Format(PyExc_AttributeError,
356 "_bpy.ops.as_string: operator \"%.200s\" "
357 "could not be found",
366 if (kw && PyDict_Size(kw)) {
368 &
ptr, kw,
false,
"Converting py args to operator properties:");
371 std::string op_string;
372 if (error_val == 0) {
378 if (error_val == -1) {
388 PyObject *list = PyList_New(
types.size());
392 PyList_SET_ITEM(list,
i, PyUnicode_FromString(
ot->idname));
408 return (PyObject *)pyrna;
422# pragma clang diagnostic push
423# pragma clang diagnostic ignored "-Wcast-function-type"
425# pragma GCC diagnostic push
426# pragma GCC diagnostic ignored "-Wcast-function-type"
431 {
"poll", (PyCFunction)
pyop_poll, METH_VARARGS,
nullptr},
432 {
"call", (PyCFunction)
pyop_call, METH_VARARGS,
nullptr},
433 {
"as_string", (PyCFunction)
pyop_as_string, METH_VARARGS,
nullptr},
434 {
"dir", (PyCFunction)
pyop_dir, METH_NOARGS,
nullptr},
438 {
nullptr,
nullptr, 0,
nullptr},
443# pragma clang diagnostic pop
445# pragma GCC diagnostic pop
void CTX_wm_operator_poll_msg_clear(bContext *C)
const char * CTX_wm_operator_poll_msg_get(bContext *C, bool *r_free)
void BKE_reports_free(ReportList *reports)
void BKE_report_print_level_set(ReportList *reports, eReportType level)
void BKE_reports_clear(ReportList *reports)
void BKE_reports_init(ReportList *reports, int flag)
BLI_INLINE bool BLI_listbase_is_empty(const ListBase *lb)
void BPY_modules_update()
@ RPT_PRINT_HANDLED_BY_OWNER
Read Guarded memory(de)allocation.
void BPy_reports_write_stdout(const ReportList *reports, const char *header)
short BPy_reports_to_error(ReportList *reports, PyObject *exception, const bool clear)
struct bContext * BPY_context_get()
static PyObject * pyop_getrna_type(PyObject *, PyObject *value)
static PyObject * pyop_get_bl_options(PyObject *, PyObject *value)
static PyObject * pyop_dir(PyObject *)
static PyMethodDef bpy_ops_methods[]
static PyObject * pyop_call(PyObject *, PyObject *args)
static PyObject * pyop_poll(PyObject *, PyObject *args)
static PyObject * pyop_as_string(PyObject *, PyObject *args)
static PyModuleDef bpy_ops_module
static wmOperatorType * ot_lookup_from_py_string(PyObject *value, const char *py_fn_id)
PyObject * BPY_operator_module()
PyObject * PYOP_wrap_macro_define(PyObject *, PyObject *args)
int pyrna_pydict_to_props(PointerRNA *ptr, PyObject *kw, const bool all_args, const char *error_prefix)
PyObject * pyrna_struct_CreatePyObject(PointerRNA *ptr)
void * MEM_mallocN(size_t len, const char *str)
void MEM_freeN(void *vmemh)
PyObject * pyrna_enum_bitfield_as_set(const EnumPropertyItem *items, int value)
char * pyrna_enum_repr(const EnumPropertyItem *item)
PyObject * PyC_UnicodeFromStdStr(const std::string &str)
int PyC_ParseBool(PyObject *o, void *p)
header-only compatibility defines.
#define PY_ARG_PARSER_HEAD_COMPAT()
bool RNA_enum_value_from_id(const EnumPropertyItem *item, const char *identifier, int *r_value)
PointerRNA RNA_pointer_create_discrete(ID *id, StructRNA *type, void *data)
const EnumPropertyItem rna_enum_operator_context_items[]
const EnumPropertyItem rna_enum_operator_type_flag_items[]
const EnumPropertyItem rna_enum_operator_return_items[]
wmOperatorStatus WM_operator_call_py(bContext *C, wmOperatorType *ot, wmOperatorCallContext context, PointerRNA *properties, ReportList *reports, const bool is_undo)
bool WM_operator_poll_context(bContext *C, wmOperatorType *ot, short context)
wmOperatorStatus WM_operator_name_call(bContext *C, const char *opstring, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event)
blender::Span< wmOperatorType * > WM_operatortypes_registered_get()
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
std::string WM_operator_pystring_ex(bContext *C, wmOperator *op, const bool all_args, const bool macro_args, wmOperatorType *ot, PointerRNA *opptr)
void WM_operator_properties_create_ptr(PointerRNA *ptr, wmOperatorType *ot)
void WM_operator_properties_free(PointerRNA *ptr)
void WM_operator_properties_sanitize(PointerRNA *ptr, const bool no_context)