36#include "RNA_prototypes.hh"
50#define BPY_RELEASE_GIL
54 const char *opname = PyUnicode_AsUTF8(value);
55 if (opname ==
nullptr) {
56 PyErr_Format(PyExc_TypeError,
"%s() expects a string argument", py_fn_id);
62 PyErr_Format(PyExc_KeyError,
"%s(\"%s\") not found", py_fn_id, opname);
68static PyObject *
pyop_poll(PyObject * , PyObject *args)
72 const char *context_str =
nullptr;
82 PyErr_SetString(PyExc_RuntimeError,
"Context is None, can't poll any operators");
87 static const char *_keywords[] = {
"",
"",
nullptr};
88 static _PyArg_Parser _parser = {
97 if (!_PyArg_ParseTupleAndKeywordsFast(args,
nullptr, &_parser, &opname, &context_str)) {
104 PyErr_Format(PyExc_AttributeError,
105 "Polling operator \"bpy.ops.%s\" error, "
106 "could not be found",
112 int context_int = context;
116 PyErr_Format(PyExc_TypeError,
117 "Calling operator \"bpy.ops.%s.poll\" error, "
118 "expected a string enum in (%s)",
131 return Py_NewRef(
ret);
142 const char *context_str =
nullptr;
143 PyObject *kw =
nullptr;
153 PyErr_SetString(PyExc_RuntimeError,
"Context is None, can't poll any operators");
158 static const char *_keywords[] = {
"",
"",
"",
"",
nullptr};
159 static _PyArg_Parser _parser = {
170 if (!_PyArg_ParseTupleAndKeywordsFast(
171 args,
nullptr, &_parser, &opname, &PyDict_Type, &kw, &context_str, &is_undo))
179 PyErr_Format(PyExc_AttributeError,
180 "Calling operator \"bpy.ops.%s\" error, "
181 "could not be found",
187 PyErr_Format(PyExc_RuntimeError,
188 "Calling operator \"bpy.ops.%s\" error, "
189 "can't modify blend data in this state (drawing/rendering)",
195 int context_int = context;
199 PyErr_Format(PyExc_TypeError,
200 "Calling operator \"bpy.ops.%s\" error, "
201 "expected a string enum in (%s)",
212 bool msg_free =
false;
214 PyErr_Format(PyExc_RuntimeError,
215 "Operator bpy.ops.%.200s.poll() %.200s",
217 msg ? msg :
"failed, context is incorrect");
228 if (kw && PyDict_Size(kw)) {
230 &
ptr, kw,
false,
"Converting py args to operator properties:");
233 if (error_val == 0) {
241#ifdef BPY_RELEASE_GIL
247 PyThreadState *ts = PyEval_SaveThread();
252#ifdef BPY_RELEASE_GIL
254 PyEval_RestoreThread(ts);
277 reports->
flag &= ~RPT_OP_HOLD;
288 PyErr_Format(PyExc_AttributeError,
"Operator \"%s\" does not take any args", opname);
297 if (error_val == -1) {
316 PyObject *kw =
nullptr;
317 bool all_args =
true;
318 bool macro_args =
true;
326 PyErr_SetString(PyExc_RuntimeError,
327 "Context is None, can't get the string representation of this object.");
332 static const char *_keywords[] = {
"",
"",
"",
"",
nullptr};
333 static _PyArg_Parser _parser = {
340 ":_bpy.ops.as_string",
344 if (!_PyArg_ParseTupleAndKeywordsFast(args,
361 PyErr_Format(PyExc_AttributeError,
362 "_bpy.ops.as_string: operator \"%.200s\" "
363 "could not be found",
372 if (kw && PyDict_Size(kw)) {
374 &
ptr, kw,
false,
"Converting py args to operator properties:");
377 std::string op_string;
378 if (error_val == 0) {
384 if (error_val == -1) {
388 if (!op_string.empty()) {
389 pybuf = PyUnicode_FromString(op_string.c_str());
392 pybuf = PyUnicode_FromString(
"");
401 PyObject *list = PyList_New(map.size());
405 PyList_SET_ITEM(list, i, PyUnicode_FromString(
ot->
idname));
421 return (PyObject *)pyrna;
433#if (defined(__GNUC__) && !defined(__clang__))
434# pragma GCC diagnostic push
435# pragma GCC diagnostic ignored "-Wcast-function-type"
439 {
"poll", (PyCFunction)
pyop_poll, METH_VARARGS,
nullptr},
440 {
"call", (PyCFunction)
pyop_call, METH_VARARGS,
nullptr},
441 {
"as_string", (PyCFunction)
pyop_as_string, METH_VARARGS,
nullptr},
442 {
"dir", (PyCFunction)
pyop_dir, METH_NOARGS,
nullptr},
446 {
nullptr,
nullptr, 0,
nullptr},
449#if (defined(__GNUC__) && !defined(__clang__))
450# pragma GCC diagnostic pop
454 PyModuleDef_HEAD_INIT,
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 struct 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(void)
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)
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(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[]
bool WM_operator_poll_context(bContext *C, wmOperatorType *ot, short context)
int WM_operator_name_call(bContext *C, const char *opstring, wmOperatorCallContext context, PointerRNA *properties, const wmEvent *event)
int WM_operator_call_py(bContext *C, wmOperatorType *ot, wmOperatorCallContext context, PointerRNA *properties, ReportList *reports, const bool is_undo)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)
const wmOperatorTypeMap & WM_operatortype_map()
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)