| 
									
										
										
										
											2011-02-27 20:10:08 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  |  * 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. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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. | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-02-18 08:08:12 +11:00
										 |  |  | /** \file
 | 
					
						
							|  |  |  |  * \ingroup pythonintern | 
					
						
							| 
									
										
										
										
											2011-11-05 08:21:12 +00:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2021-03-15 11:27:37 +11:00
										 |  |  |  * This file defines `_bpy.ops`, an internal python module which gives Python | 
					
						
							|  |  |  |  * the ability to inspect and call operators (defined by C or Python). | 
					
						
							| 
									
										
										
										
											2011-11-05 08:21:12 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * \note | 
					
						
							| 
									
										
										
										
											2021-03-15 11:27:37 +11:00
										 |  |  |  * This C module is private, it should only be used by `release/scripts/modules/bpy/ops.py` which | 
					
						
							|  |  |  |  * exposes operators as dynamically defined modules & callable objects to access all operators. | 
					
						
							| 
									
										
										
										
											2011-02-27 20:10:08 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 04:15:25 +00:00
										 |  |  | #include <Python.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-02 04:51:43 +00:00
										 |  |  | #include "RNA_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-12 22:16:54 +10:00
										 |  |  | #include "BLI_listbase.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-19 09:33:03 +01:00
										 |  |  | #include "BLI_utildefines.h"
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-19 09:33:03 +01:00
										 |  |  | #include "../generic/py_capi_utils.h"
 | 
					
						
							|  |  |  | #include "../generic/python_utildefines.h"
 | 
					
						
							| 
									
										
										
										
											2011-05-10 14:48:06 +00:00
										 |  |  | #include "BPY_extern.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-19 09:33:03 +01:00
										 |  |  | #include "bpy_capi_utils.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | #include "bpy_operator.h"
 | 
					
						
							| 
									
										
										
										
											2009-04-01 12:43:07 +00:00
										 |  |  | #include "bpy_operator_wrap.h"
 | 
					
						
							| 
									
										
										
										
											2021-03-15 11:27:37 +11:00
										 |  |  | #include "bpy_rna.h" /* for setting argument properties & type method `get_rna_type`. */
 | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-02 04:51:43 +00:00
										 |  |  | #include "RNA_access.h"
 | 
					
						
							| 
									
										
										
										
											2010-01-23 01:02:53 +00:00
										 |  |  | #include "RNA_enum_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | #include "WM_api.h"
 | 
					
						
							|  |  |  | #include "WM_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "MEM_guardedalloc.h"
 | 
					
						
							| 
									
										
										
										
											2011-08-11 06:06:17 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "BLI_ghash.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-09-16 16:42:22 +10:00
										 |  |  | #include "BKE_context.h"
 | 
					
						
							| 
									
										
										
										
											2020-03-19 09:33:03 +01:00
										 |  |  | #include "BKE_report.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-08-13 08:38:16 +10:00
										 |  |  | /* so operators called can spawn threads which acquire the GIL */ | 
					
						
							| 
									
										
										
										
											2011-08-04 01:56:36 +00:00
										 |  |  | #define BPY_RELEASE_GIL
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-13 17:47:56 +10:00
										 |  |  | static wmOperatorType *ot_lookup_from_py_string(PyObject *value, const char *py_fn_id) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-13 22:57:01 +11:00
										 |  |  |   const char *opname = PyUnicode_AsUTF8(value); | 
					
						
							| 
									
										
										
										
											2018-09-13 17:47:56 +10:00
										 |  |  |   if (opname == NULL) { | 
					
						
							|  |  |  |     PyErr_Format(PyExc_TypeError, "%s() expects a string argument", py_fn_id); | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-13 17:47:56 +10:00
										 |  |  |   wmOperatorType *ot = WM_operatortype_find(opname, true); | 
					
						
							|  |  |  |   if (ot == NULL) { | 
					
						
							|  |  |  |     PyErr_Format(PyExc_KeyError, "%s(\"%s\") not found", py_fn_id, opname); | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return ot; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2011-08-04 01:56:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-13 23:25:08 +00:00
										 |  |  | static PyObject *pyop_poll(PyObject *UNUSED(self), PyObject *args) | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   wmOperatorType *ot; | 
					
						
							| 
									
										
										
										
											2014-04-27 00:21:23 +10:00
										 |  |  |   const char *opname; | 
					
						
							| 
									
										
										
										
											2012-03-26 20:41:54 +00:00
										 |  |  |   PyObject *context_dict = NULL; /* optional args */ | 
					
						
							| 
									
										
										
										
											2014-04-27 00:21:23 +10:00
										 |  |  |   const char *context_str = NULL; | 
					
						
							| 
									
										
										
										
											2012-03-26 20:41:54 +00:00
										 |  |  |   PyObject *ret; | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   int context = WM_OP_EXEC_DEFAULT; | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-26 15:18:30 +00:00
										 |  |  |   /* XXX Todo, work out a better solution for passing on context,
 | 
					
						
							|  |  |  |    * could make a tuple from self and pack the name and Context into it... */ | 
					
						
							| 
									
										
										
										
											2020-10-15 18:20:15 +11:00
										 |  |  |   bContext *C = BPY_context_get(); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   if (C == NULL) { | 
					
						
							| 
									
										
										
										
											2011-02-18 06:04:05 +00:00
										 |  |  |     PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators"); | 
					
						
							| 
									
										
										
										
											2010-12-07 04:12:15 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-30 06:12:48 +11:00
										 |  |  |   if (!PyArg_ParseTuple(args, "s|Os:_bpy.ops.poll", &opname, &context_dict, &context_str)) { | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											2019-03-30 06:12:48 +11:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  |   ot = WM_operatortype_find(opname, true); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  |   if (ot == NULL) { | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |     PyErr_Format(PyExc_AttributeError, | 
					
						
							|  |  |  |                  "Polling operator \"bpy.ops.%s\" error, " | 
					
						
							|  |  |  |                  "could not be found", | 
					
						
							|  |  |  |                  opname); | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  |   if (context_str) { | 
					
						
							| 
									
										
										
										
											2015-11-23 13:49:52 +11:00
										 |  |  |     if (RNA_enum_value_from_id(rna_enum_operator_context_items, context_str, &context) == 0) { | 
					
						
							|  |  |  |       char *enum_str = BPy_enum_as_string(rna_enum_operator_context_items); | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |       PyErr_Format(PyExc_TypeError, | 
					
						
							|  |  |  |                    "Calling operator \"bpy.ops.%s.poll\" error, " | 
					
						
							| 
									
										
										
										
											2015-03-16 10:16:16 +11:00
										 |  |  |                    "expected a string enum in (%s)", | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |                    opname, | 
					
						
							|  |  |  |                    enum_str); | 
					
						
							| 
									
										
										
										
											2010-11-04 12:59:03 +00:00
										 |  |  |       MEM_freeN(enum_str); | 
					
						
							|  |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-06 12:30:59 +11:00
										 |  |  |   if (ELEM(context_dict, NULL, Py_None)) { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |     context_dict = NULL; | 
					
						
							| 
									
										
										
										
											2010-11-07 04:46:50 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   else if (!PyDict_Check(context_dict)) { | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |     PyErr_Format(PyExc_TypeError, | 
					
						
							|  |  |  |                  "Calling operator \"bpy.ops.%s.poll\" error, " | 
					
						
							|  |  |  |                  "custom context expected a dict or None, got a %.200s", | 
					
						
							|  |  |  |                  opname, | 
					
						
							|  |  |  |                  Py_TYPE(context_dict)->tp_name); | 
					
						
							| 
									
										
										
										
											2010-11-07 04:46:50 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 18:23:12 +10:00
										 |  |  |   struct bContext_PyState context_py_state; | 
					
						
							|  |  |  |   if (context_dict != NULL) { | 
					
						
							|  |  |  |     CTX_py_state_push(C, &context_py_state, (void *)context_dict); | 
					
						
							|  |  |  |     Py_INCREF(context_dict); /* so we don't lose it */ | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-03 16:49:08 +02:00
										 |  |  |   /* main purpose of this function */ | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   ret = WM_operator_poll_context((bContext *)C, ot, context) ? Py_True : Py_False; | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 18:23:12 +10:00
										 |  |  |   if (context_dict != NULL) { | 
					
						
							|  |  |  |     PyObject *context_dict_test = CTX_py_dict_get(C); | 
					
						
							|  |  |  |     if (context_dict_test != context_dict) { | 
					
						
							|  |  |  |       Py_DECREF(context_dict_test); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /* Restore with original context dict,
 | 
					
						
							|  |  |  |      * probably NULL but need this for nested operator calls. */ | 
					
						
							|  |  |  |     Py_DECREF(context_dict); | 
					
						
							|  |  |  |     CTX_py_state_pop(C, &context_py_state); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-06 16:42:22 +11:00
										 |  |  |   return Py_INCREF_RET(ret); | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
											
												python operators (in bpy_opwrapper.*)
This means you can define an operator in python that is called from C or Python - like any other operator.
Python functions for invoke and exec can be registered with an operator name.
keywords are read from the python exec() function, then used to create operator properties. The default python values are used to set the property type and defaults.
def exec(size=2.0, text="blah"): ...
is equivalent to...
prop = RNA_def_property(ot->srna, "size", PROP_FLOAT, PROP_NONE);
RNA_def_property_float_default(prop, 2.0f);
prop = RNA_def_property(ot->srna, "size", PROP_STRING, PROP_NONE);
RNA_def_property_string_default(prop, "blah");
TODO -
* make use of events
* return OPERATOR_CANCELLED/OPERATOR_FINISHED.. etc
* add support for array args
* more testing
											
										 
											2008-12-27 14:52:49 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-13 23:25:08 +00:00
										 |  |  | static PyObject *pyop_call(PyObject *UNUSED(self), PyObject *args) | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-25 10:48:36 +00:00
										 |  |  |   wmOperatorType *ot; | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   int error_val = 0; | 
					
						
							| 
									
										
										
										
											2008-12-25 10:48:36 +00:00
										 |  |  |   PointerRNA ptr; | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   int operator_ret = OPERATOR_CANCELLED; | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 00:21:23 +10:00
										 |  |  |   const char *opname; | 
					
						
							|  |  |  |   const char *context_str = NULL; | 
					
						
							| 
									
										
										
										
											2012-03-26 20:41:54 +00:00
										 |  |  |   PyObject *kw = NULL;           /* optional args */ | 
					
						
							|  |  |  |   PyObject *context_dict = NULL; /* optional args */ | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-03 22:37:09 +00:00
										 |  |  |   /* note that context is an int, python does the conversion in this case */ | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   int context = WM_OP_EXEC_DEFAULT; | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  |   int is_undo = false; | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-26 15:18:30 +00:00
										 |  |  |   /* XXX Todo, work out a better solution for passing on context,
 | 
					
						
							|  |  |  |    * could make a tuple from self and pack the name and Context into it... */ | 
					
						
							| 
									
										
										
										
											2020-10-15 18:20:15 +11:00
										 |  |  |   bContext *C = BPY_context_get(); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   if (C == NULL) { | 
					
						
							| 
									
										
										
										
											2011-02-18 06:04:05 +00:00
										 |  |  |     PyErr_SetString(PyExc_RuntimeError, "Context is None, cant poll any operators"); | 
					
						
							| 
									
										
										
										
											2010-12-07 04:12:15 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-27 21:41:17 +00:00
										 |  |  |   if (!PyArg_ParseTuple(args, | 
					
						
							|  |  |  |                         "sO|O!si:_bpy.ops.call", | 
					
						
							|  |  |  |                         &opname, | 
					
						
							|  |  |  |                         &context_dict, | 
					
						
							|  |  |  |                         &PyDict_Type, | 
					
						
							|  |  |  |                         &kw, | 
					
						
							|  |  |  |                         &context_str, | 
					
						
							|  |  |  |                         &is_undo)) { | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											2012-08-22 16:44:32 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  |   ot = WM_operatortype_find(opname, true); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-26 12:39:53 +00:00
										 |  |  |   if (ot == NULL) { | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |     PyErr_Format(PyExc_AttributeError, | 
					
						
							|  |  |  |                  "Calling operator \"bpy.ops.%s\" error, " | 
					
						
							|  |  |  |                  "could not be found", | 
					
						
							|  |  |  |                  opname); | 
					
						
							| 
									
										
										
										
											2008-12-26 12:39:53 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  |   if (!pyrna_write_check()) { | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |     PyErr_Format(PyExc_RuntimeError, | 
					
						
							|  |  |  |                  "Calling operator \"bpy.ops.%s\" error, " | 
					
						
							|  |  |  |                  "can't modify blend data in this state (drawing/rendering)", | 
					
						
							|  |  |  |                  opname); | 
					
						
							| 
									
										
										
										
											2011-02-01 00:32:50 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  |   if (context_str) { | 
					
						
							| 
									
										
										
										
											2015-11-23 13:49:52 +11:00
										 |  |  |     if (RNA_enum_value_from_id(rna_enum_operator_context_items, context_str, &context) == 0) { | 
					
						
							|  |  |  |       char *enum_str = BPy_enum_as_string(rna_enum_operator_context_items); | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |       PyErr_Format(PyExc_TypeError, | 
					
						
							|  |  |  |                    "Calling operator \"bpy.ops.%s\" error, " | 
					
						
							| 
									
										
										
										
											2015-03-16 10:16:16 +11:00
										 |  |  |                    "expected a string enum in (%s)", | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |                    opname, | 
					
						
							|  |  |  |                    enum_str); | 
					
						
							| 
									
										
										
										
											2010-02-10 11:10:38 +00:00
										 |  |  |       MEM_freeN(enum_str); | 
					
						
							|  |  |  |       return NULL; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-06 12:30:59 +11:00
										 |  |  |   if (ELEM(context_dict, NULL, Py_None)) { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |     context_dict = NULL; | 
					
						
							| 
									
										
										
										
											2010-11-07 04:46:50 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |   else if (!PyDict_Check(context_dict)) { | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |     PyErr_Format(PyExc_TypeError, | 
					
						
							|  |  |  |                  "Calling operator \"bpy.ops.%s\" error, " | 
					
						
							|  |  |  |                  "custom context expected a dict or None, got a %.200s", | 
					
						
							|  |  |  |                  opname, | 
					
						
							|  |  |  |                  Py_TYPE(context_dict)->tp_name); | 
					
						
							| 
									
										
										
										
											2010-11-07 04:46:50 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-11 13:32:07 +02:00
										 |  |  |   /**
 | 
					
						
							|  |  |  |    * It might be that there is already a Python context override. We don't want to remove that | 
					
						
							|  |  |  |    * except when this operator call sets a new override explicitly. This is necessary so that | 
					
						
							|  |  |  |    * called operator runs in the same context as the calling code by default. | 
					
						
							|  |  |  |    */ | 
					
						
							| 
									
										
										
										
											2020-09-17 18:23:12 +10:00
										 |  |  |   struct bContext_PyState context_py_state; | 
					
						
							| 
									
										
										
										
											2020-08-11 13:32:07 +02:00
										 |  |  |   if (context_dict != NULL) { | 
					
						
							| 
									
										
										
										
											2020-09-17 18:23:12 +10:00
										 |  |  |     CTX_py_state_push(C, &context_py_state, (void *)context_dict); | 
					
						
							|  |  |  |     Py_INCREF(context_dict); /* so we don't lose it */ | 
					
						
							| 
									
										
										
										
											2020-08-11 13:32:07 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  |   if (WM_operator_poll_context((bContext *)C, ot, context) == false) { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |     const char *msg = CTX_wm_operator_poll_msg_get(C); | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |     PyErr_Format(PyExc_RuntimeError, | 
					
						
							|  |  |  |                  "Operator bpy.ops.%.200s.poll() %.200s", | 
					
						
							|  |  |  |                  opname, | 
					
						
							|  |  |  |                  msg ? msg : "failed, context is incorrect"); | 
					
						
							| 
									
										
										
										
											2010-09-27 12:21:23 +00:00
										 |  |  |     CTX_wm_operator_poll_msg_set(C, NULL); /* better set to NULL else it could be used again */ | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |     error_val = -1; | 
					
						
							| 
									
										
										
										
											2009-01-18 10:46:26 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |   else { | 
					
						
							| 
									
										
										
										
											2010-01-26 20:43:27 +00:00
										 |  |  |     WM_operator_properties_create_ptr(&ptr, ot); | 
					
						
							| 
									
										
										
										
											2010-11-23 12:05:35 +00:00
										 |  |  |     WM_operator_properties_sanitize(&ptr, 0); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-23 04:03:36 +10:00
										 |  |  |     if (kw && PyDict_Size(kw)) { | 
					
						
							|  |  |  |       error_val = pyrna_pydict_to_props( | 
					
						
							|  |  |  |           &ptr, kw, false, "Converting py args to operator properties: "); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |     if (error_val == 0) { | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |       ReportList *reports; | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |       reports = MEM_mallocN(sizeof(ReportList), "wmOperatorReportList"); | 
					
						
							| 
									
										
										
										
											2019-08-14 23:29:46 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  |       /* Own so these don't move into global reports. */ | 
					
						
							|  |  |  |       BKE_reports_init(reports, RPT_STORE | RPT_OP_HOLD); | 
					
						
							| 
									
										
										
										
											2009-01-02 07:54:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-04 01:56:36 +00:00
										 |  |  | #ifdef BPY_RELEASE_GIL
 | 
					
						
							|  |  |  |       /* release GIL, since a thread could be started from an operator
 | 
					
						
							|  |  |  |        * that updates a driver */ | 
					
						
							| 
									
										
										
										
											2012-07-16 23:23:33 +00:00
										 |  |  |       /* note: I have not seen any examples of code that does this
 | 
					
						
							| 
									
										
										
										
											2011-08-04 01:56:36 +00:00
										 |  |  |        * so it may not be officially supported but seems to work ok. */ | 
					
						
							|  |  |  |       { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |         PyThreadState *ts = PyEval_SaveThread(); | 
					
						
							| 
									
										
										
										
											2011-08-04 01:56:36 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-27 21:41:17 +00:00
										 |  |  |         operator_ret = WM_operator_call_py(C, ot, context, &ptr, reports, is_undo); | 
					
						
							| 
									
										
										
										
											2011-08-04 01:56:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef BPY_RELEASE_GIL
 | 
					
						
							|  |  |  |         /* regain GIL */ | 
					
						
							|  |  |  |         PyEval_RestoreThread(ts); | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-01-02 07:54:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  |       error_val = BPy_reports_to_error(reports, PyExc_RuntimeError, false); | 
					
						
							| 
									
										
										
										
											2009-09-22 09:12:39 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |       /* operator output is nice to have in the terminal/console too */ | 
					
						
							| 
									
										
										
										
											2015-07-12 22:16:54 +10:00
										 |  |  |       if (!BLI_listbase_is_empty(&reports->list)) { | 
					
						
							| 
									
										
										
										
											2019-03-27 14:01:25 +11:00
										 |  |  |         BPy_reports_write_stdout(reports, NULL); | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-06-04 08:54:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |       BKE_reports_clear(reports); | 
					
						
							| 
									
										
										
										
											2012-03-06 18:40:15 +00:00
										 |  |  |       if ((reports->flag & RPT_FREE) == 0) { | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |         MEM_freeN(reports); | 
					
						
							| 
									
										
										
										
											2009-09-22 09:12:39 +00:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2016-06-27 17:09:52 +10:00
										 |  |  |       else { | 
					
						
							|  |  |  |         /* The WM is now responsible for running the modal operator,
 | 
					
						
							|  |  |  |          * show reports in the info window. */ | 
					
						
							|  |  |  |         reports->flag &= ~RPT_OP_HOLD; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2009-09-22 09:12:39 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |     WM_operator_properties_free(&ptr); | 
					
						
							| 
									
										
										
										
											2009-01-01 20:44:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-28 13:03:37 +00:00
										 |  |  | #if 0
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |     /* if there is some way to know an operator takes args we should use this */ | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       /* no props */ | 
					
						
							|  |  |  |       if (kw != NULL) { | 
					
						
							| 
									
										
										
										
											2019-04-17 08:24:14 +02:00
										 |  |  |         PyErr_Format(PyExc_AttributeError, "Operator \"%s\" does not take any args", opname); | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |         return NULL; | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |       WM_operator_name_call(C, opname, WM_OP_EXEC_DEFAULT, NULL); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-12-28 13:03:37 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-17 18:23:12 +10:00
										 |  |  |   if (context_dict != NULL) { | 
					
						
							|  |  |  |     PyObject *context_dict_test = CTX_py_dict_get(C); | 
					
						
							|  |  |  |     if (context_dict_test != context_dict) { | 
					
						
							|  |  |  |       Py_DECREF(context_dict_test); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     /* Restore with original context dict,
 | 
					
						
							|  |  |  |      * probably NULL but need this for nested operator calls. */ | 
					
						
							|  |  |  |     Py_DECREF(context_dict); | 
					
						
							|  |  |  |     CTX_py_state_pop(C, &context_py_state); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2008-12-28 13:03:37 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   if (error_val == -1) { | 
					
						
							| 
									
										
										
										
											2008-12-25 14:17:54 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-29 19:59:13 +10:00
										 |  |  |   /* When calling  bpy.ops.wm.read_factory_settings() bpy.data's main pointer
 | 
					
						
							|  |  |  |    * is freed by clear_globals(), further access will crash blender. | 
					
						
							|  |  |  |    * Setting context is not needed in this case, only calling because this | 
					
						
							| 
									
										
										
										
											2011-02-01 02:54:29 +00:00
										 |  |  |    * function corrects bpy.data (internal Main pointer) */ | 
					
						
							| 
									
										
										
										
											2020-10-15 18:12:03 +11:00
										 |  |  |   BPY_modules_update(); | 
					
						
							| 
									
										
										
										
											2011-02-01 02:54:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-23 01:02:53 +00:00
										 |  |  |   /* return operator_ret as a bpy enum */ | 
					
						
							| 
									
										
										
										
											2015-11-23 13:49:52 +11:00
										 |  |  |   return pyrna_enum_bitfield_to_py(rna_enum_operator_return_items, operator_ret); | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-13 23:25:08 +00:00
										 |  |  | static PyObject *pyop_as_string(PyObject *UNUSED(self), PyObject *args) | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | { | 
					
						
							|  |  |  |   wmOperatorType *ot; | 
					
						
							|  |  |  |   PointerRNA ptr; | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-04-27 00:21:23 +10:00
										 |  |  |   const char *opname; | 
					
						
							| 
									
										
										
										
											2012-03-26 20:41:54 +00:00
										 |  |  |   PyObject *kw = NULL; /* optional args */ | 
					
						
							| 
									
										
										
										
											2015-08-04 18:34:20 +10:00
										 |  |  |   bool all_args = true; | 
					
						
							|  |  |  |   bool macro_args = true; | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   int error_val = 0; | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   char *buf = NULL; | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  |   PyObject *pybuf; | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-15 18:20:15 +11:00
										 |  |  |   bContext *C = BPY_context_get(); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   if (C == NULL) { | 
					
						
							| 
									
										
										
										
											2011-02-18 06:04:05 +00:00
										 |  |  |     PyErr_SetString(PyExc_RuntimeError, | 
					
						
							|  |  |  |                     "Context is None, cant get the string representation of this object."); | 
					
						
							| 
									
										
										
										
											2010-12-07 04:12:15 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-04 18:34:20 +10:00
										 |  |  |   if (!PyArg_ParseTuple(args, | 
					
						
							|  |  |  |                         "s|O!O&O&:_bpy.ops.as_string", | 
					
						
							|  |  |  |                         &opname, | 
					
						
							|  |  |  |                         &PyDict_Type, | 
					
						
							|  |  |  |                         &kw, | 
					
						
							|  |  |  |                         PyC_ParseBool, | 
					
						
							|  |  |  |                         &all_args, | 
					
						
							|  |  |  |                         PyC_ParseBool, | 
					
						
							|  |  |  |                         ¯o_args)) { | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											2015-08-04 18:34:20 +10:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  |   ot = WM_operatortype_find(opname, true); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  |   if (ot == NULL) { | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  |     PyErr_Format(PyExc_AttributeError, | 
					
						
							|  |  |  |                  "_bpy.ops.as_string: operator \"%.200s\" " | 
					
						
							|  |  |  |                  "could not be found", | 
					
						
							|  |  |  |                  opname); | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  |   /* WM_operator_properties_create(&ptr, opname); */ | 
					
						
							|  |  |  |   /* Save another lookup */ | 
					
						
							|  |  |  |   RNA_pointer_create(NULL, ot->srna, NULL, &ptr); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-23 04:03:36 +10:00
										 |  |  |   if (kw && PyDict_Size(kw)) { | 
					
						
							|  |  |  |     error_val = pyrna_pydict_to_props( | 
					
						
							|  |  |  |         &ptr, kw, false, "Converting py args to operator properties: "); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-30 06:12:48 +11:00
										 |  |  |   if (error_val == 0) { | 
					
						
							| 
									
										
										
										
											2013-11-26 08:59:14 +11:00
										 |  |  |     buf = WM_operator_pystring_ex(C, NULL, all_args, macro_args, ot, &ptr); | 
					
						
							| 
									
										
										
										
											2019-03-30 06:12:48 +11:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  |   WM_operator_properties_free(&ptr); | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   if (error_val == -1) { | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  |   if (buf) { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |     pybuf = PyUnicode_FromString(buf); | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  |     MEM_freeN(buf); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |     pybuf = PyUnicode_FromString(""); | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  |   return pybuf; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-13 23:25:08 +00:00
										 |  |  | static PyObject *pyop_dir(PyObject *UNUSED(self)) | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-10-28 15:41:05 +01:00
										 |  |  |   GHashIterator iter; | 
					
						
							|  |  |  |   PyObject *list; | 
					
						
							|  |  |  |   int i; | 
					
						
							| 
									
										
										
										
											2011-08-11 06:06:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-28 15:41:05 +01:00
										 |  |  |   WM_operatortype_iter(&iter); | 
					
						
							| 
									
										
										
										
											2018-02-15 23:36:11 +11:00
										 |  |  |   list = PyList_New(BLI_ghash_len(iter.gh)); | 
					
						
							| 
									
										
										
										
											2011-08-11 06:06:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-28 15:41:05 +01:00
										 |  |  |   for (i = 0; !BLI_ghashIterator_done(&iter); BLI_ghashIterator_step(&iter), i++) { | 
					
						
							|  |  |  |     wmOperatorType *ot = BLI_ghashIterator_getValue(&iter); | 
					
						
							|  |  |  |     PyList_SET_ITEM(list, i, PyUnicode_FromString(ot->idname)); | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2011-08-11 06:06:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-14 13:43:30 +00:00
										 |  |  |   return list; | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-13 18:16:06 +10:00
										 |  |  | static PyObject *pyop_getrna_type(PyObject *UNUSED(self), PyObject *value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   wmOperatorType *ot; | 
					
						
							|  |  |  |   if ((ot = ot_lookup_from_py_string(value, "get_rna_type")) == NULL) { | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-04-17 06:17:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-13 18:16:06 +10:00
										 |  |  |   PointerRNA ptr; | 
					
						
							|  |  |  |   RNA_pointer_create(NULL, &RNA_Struct, ot->srna, &ptr); | 
					
						
							|  |  |  |   BPy_StructRNA *pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr); | 
					
						
							|  |  |  |   return (PyObject *)pyrna; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-01 17:02:51 +10:00
										 |  |  | static PyObject *pyop_get_bl_options(PyObject *UNUSED(self), PyObject *value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   wmOperatorType *ot; | 
					
						
							|  |  |  |   if ((ot = ot_lookup_from_py_string(value, "get_bl_options")) == NULL) { | 
					
						
							|  |  |  |     return NULL; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return pyrna_enum_bitfield_to_py(rna_enum_operator_type_flag_items, ot->flag); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | static struct PyMethodDef bpy_ops_methods[] = { | 
					
						
							| 
									
										
										
										
											2010-09-09 17:36:54 +00:00
										 |  |  |     {"poll", (PyCFunction)pyop_poll, METH_VARARGS, NULL}, | 
					
						
							|  |  |  |     {"call", (PyCFunction)pyop_call, METH_VARARGS, NULL}, | 
					
						
							|  |  |  |     {"as_string", (PyCFunction)pyop_as_string, METH_VARARGS, NULL}, | 
					
						
							|  |  |  |     {"dir", (PyCFunction)pyop_dir, METH_NOARGS, NULL}, | 
					
						
							| 
									
										
										
										
											2018-09-13 18:16:06 +10:00
										 |  |  |     {"get_rna_type", (PyCFunction)pyop_getrna_type, METH_O, NULL}, | 
					
						
							| 
									
										
										
										
											2020-09-01 17:02:51 +10:00
										 |  |  |     {"get_bl_options", (PyCFunction)pyop_get_bl_options, METH_O, NULL}, | 
					
						
							| 
									
										
										
										
											2010-09-09 17:36:54 +00:00
										 |  |  |     {"macro_define", (PyCFunction)PYOP_wrap_macro_define, METH_VARARGS, NULL}, | 
					
						
							| 
									
										
										
										
											2019-02-03 14:01:45 +11:00
										 |  |  |     {NULL, NULL, 0, NULL}, | 
					
						
							| 
									
										
										
										
											2010-09-09 17:36:54 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | static struct PyModuleDef bpy_ops_module = { | 
					
						
							| 
									
										
										
										
											2010-09-09 17:36:54 +00:00
										 |  |  |     PyModuleDef_HEAD_INIT, | 
					
						
							|  |  |  |     "_bpy.ops", | 
					
						
							|  |  |  |     NULL, | 
					
						
							| 
									
										
										
										
											2012-03-26 20:41:54 +00:00
										 |  |  |     -1, /* multiple "initialization" just copies the module dict. */ | 
					
						
							| 
									
										
										
										
											2010-09-09 17:36:54 +00:00
										 |  |  |     bpy_ops_methods, | 
					
						
							| 
									
										
										
										
											2019-01-19 13:21:18 +11:00
										 |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							|  |  |  |     NULL, | 
					
						
							| 
									
										
										
										
											2010-09-09 17:36:54 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PyObject *BPY_operator_module(void) | 
					
						
							| 
									
										
										
										
											2009-03-21 06:55:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-09-09 17:36:54 +00:00
										 |  |  |   PyObject *submodule; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  |   submodule = PyModule_Create(&bpy_ops_module); | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  |   return submodule; | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | } |