| 
									
										
										
										
											2011-02-27 20:10:08 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  |  * ***** BEGIN GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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
										 |  |  |  * | 
					
						
							|  |  |  |  * Contributor(s): Campbell Barton | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-27 20:10:08 +00:00
										 |  |  | /** \file blender/python/intern/bpy_operator.c
 | 
					
						
							|  |  |  |  *  \ingroup pythonintern | 
					
						
							| 
									
										
										
										
											2011-11-05 08:21:12 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This file defines '_bpy.ops', an internal python module which gives python | 
					
						
							|  |  |  |  * the ability to inspect and call both C and Python defined operators. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * \note | 
					
						
							|  |  |  |  * This module is exposed to the user via 'release/scripts/modules/bpy/ops.py' | 
					
						
							|  |  |  |  * which fakes exposing operators as modules/functions using its own classes. | 
					
						
							| 
									
										
										
										
											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"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  | #include "BLI_utildefines.h"
 | 
					
						
							|  |  |  | #include "BLI_string.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-05-10 14:48:06 +00:00
										 |  |  | #include "BPY_extern.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"
 | 
					
						
							| 
									
										
										
										
											2008-12-25 10:48:36 +00:00
										 |  |  | #include "bpy_rna.h" /* for setting arg props only - pyrna_py_to_prop() */
 | 
					
						
							| 
									
										
										
										
											2009-04-19 13:37:59 +00:00
										 |  |  | #include "bpy_util.h"
 | 
					
						
							| 
									
										
										
										
											2011-03-20 07:23:17 +00:00
										 |  |  | #include "../generic/bpy_internal_import.h"
 | 
					
						
							| 
									
										
										
										
											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"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-02 07:54:38 +00:00
										 |  |  | #include "BKE_report.h"
 | 
					
						
							| 
									
										
										
										
											2011-02-14 04:15:25 +00:00
										 |  |  | #include "BKE_context.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-04 01:56:36 +00:00
										 |  |  | /* so operators called can spawn threads which aquire the GIL */ | 
					
						
							|  |  |  | #define BPY_RELEASE_GIL
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							| 
									
										
										
										
											2012-03-26 20:41:54 +00:00
										 |  |  | 	char     *opname; | 
					
						
							|  |  |  | 	PyObject *context_dict = NULL; /* optional args */ | 
					
						
							|  |  |  | 	PyObject *context_dict_back; | 
					
						
							|  |  |  | 	char     *context_str = NULL; | 
					
						
							|  |  |  | 	PyObject *ret; | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	int context = WM_OP_EXEC_DEFAULT; | 
					
						
							| 
									
										
										
										
											2010-11-04 12:59:03 +00: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... */ | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	bContext *C = (bContext *)BPy_GetContext(); | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00: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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-04 12:59:03 +00: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; | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  | 	ot = WM_operatortype_find(opname, true); | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  | 	if (context_str) { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 		if (RNA_enum_value_from_id(operator_context_items, context_str, &context) == 0) { | 
					
						
							|  |  |  | 			char *enum_str = BPy_enum_as_string(operator_context_items); | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  | 			PyErr_Format(PyExc_TypeError, | 
					
						
							|  |  |  | 			             "Calling operator \"bpy.ops.%s.poll\" error, " | 
					
						
							|  |  |  | 			             "expected a string enum in (%.200s)", | 
					
						
							|  |  |  | 			             opname, enum_str); | 
					
						
							| 
									
										
										
										
											2010-11-04 12:59:03 +00:00
										 |  |  | 			MEM_freeN(enum_str); | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	if (context_dict == NULL || context_dict == Py_None) { | 
					
						
							|  |  |  | 		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; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	context_dict_back = CTX_py_dict_get(C); | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  | 	CTX_py_dict_set(C, (void *)context_dict); | 
					
						
							|  |  |  | 	Py_XINCREF(context_dict); /* so we done loose it */ | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* main purpose of thsi function */ | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	ret = WM_operator_poll_context((bContext *)C, ot, context) ? Py_True : Py_False; | 
					
						
							| 
									
										
										
										
											2010-09-01 11:16:11 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	/* restore with original context dict, probably NULL but need this for nested operator calls */ | 
					
						
							|  |  |  | 	Py_XDECREF(context_dict); | 
					
						
							|  |  |  | 	CTX_py_dict_set(C, (void *)context_dict_back); | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	Py_INCREF(ret); | 
					
						
							|  |  |  | 	return ret; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
											
												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; | 
					
						
							| 
									
										
										
										
											2010-02-10 11:10:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-26 20:41:54 +00:00
										 |  |  | 	char     *opname; | 
					
						
							|  |  |  | 	char     *context_str = NULL; | 
					
						
							|  |  |  | 	PyObject *kw = NULL; /* optional args */ | 
					
						
							|  |  |  | 	PyObject *context_dict = NULL; /* optional args */ | 
					
						
							|  |  |  | 	PyObject *context_dict_back; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00: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... */ | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	bContext *C = (bContext *)BPy_GetContext(); | 
					
						
							| 
									
										
										
										
											2010-12-07 04:12:15 +00: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; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-03-14 13:43:30 +00: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)) | 
					
						
							| 
									
										
										
										
											2012-08-22 16:44:32 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2012-08-22 16:44:32 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  | 	ot = WM_operatortype_find(opname, true); | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00: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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  | 	if (context_str) { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 		if (RNA_enum_value_from_id(operator_context_items, context_str, &context) == 0) { | 
					
						
							|  |  |  | 			char *enum_str = BPy_enum_as_string(operator_context_items); | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  | 			PyErr_Format(PyExc_TypeError, | 
					
						
							|  |  |  | 			             "Calling operator \"bpy.ops.%s\" error, " | 
					
						
							|  |  |  | 			             "expected a string enum in (%.200s)", | 
					
						
							|  |  |  | 			             opname, enum_str); | 
					
						
							| 
									
										
										
										
											2010-02-10 11:10:38 +00:00
										 |  |  | 			MEM_freeN(enum_str); | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	if (context_dict == NULL || context_dict == Py_None) { | 
					
						
							|  |  |  | 		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; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	context_dict_back = CTX_py_dict_get(C); | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	CTX_py_dict_set(C, (void *)context_dict); | 
					
						
							|  |  |  | 	Py_XINCREF(context_dict); /* so we done loose it */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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); | 
					
						
							| 
									
										
										
										
											2009-09-03 22:37:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  | 		if (kw && PyDict_Size(kw)) | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 			error_val = pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: "); | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-02 07:54:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 		if (error_val == 0) { | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 			ReportList *reports; | 
					
						
							| 
									
										
										
										
											2009-01-02 07:54:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 			reports = MEM_mallocN(sizeof(ReportList), "wmOperatorReportList"); | 
					
						
							| 
									
										
										
										
											2012-03-18 07:38:51 +00:00
										 |  |  | 			BKE_reports_init(reports, RPT_STORE | RPT_OP_HOLD); /* own so these don't move into global reports */ | 
					
						
							| 
									
										
										
										
											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 */ | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  | 			if (reports->list.first) { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 				char *report_str = BKE_reports_string(reports, 0); /* all reports */ | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  | 				if (report_str) { | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 					PySys_WriteStdout("%s\n", report_str); | 
					
						
							|  |  |  | 					MEM_freeN(report_str); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 			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
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) { | 
					
						
							| 
									
										
										
										
											2011-04-30 13:58:31 +00:00
										 |  |  | 				PyErr_Format(PyExc_AttributeError, | 
					
						
							|  |  |  | 				             "Operator \"%s\" does not take any args", | 
					
						
							|  |  |  | 				             opname); | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 				return NULL; | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2008-12-28 13:03:37 +00: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
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* restore with original context dict, probably NULL but need this for nested operator calls */ | 
					
						
							|  |  |  | 	Py_XDECREF(context_dict); | 
					
						
							|  |  |  | 	CTX_py_dict_set(C, (void *)context_dict_back); | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-01 02:54:29 +00: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 | 
					
						
							|  |  |  | 	 * function corrects bpy.data (internal Main pointer) */ | 
					
						
							|  |  |  | 	BPY_modules_update(C); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-25 17:54:30 +00:00
										 |  |  | 	/* needed for when WM_OT_read_factory_settings us called from within a script */ | 
					
						
							| 
									
										
										
										
											2011-03-20 07:23:17 +00:00
										 |  |  | 	bpy_import_main_set(CTX_data_main(C)); | 
					
						
							| 
									
										
										
										
											2011-02-01 02:54:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-23 01:02:53 +00:00
										 |  |  | 	/* return operator_ret as a bpy enum */ | 
					
						
							|  |  |  | 	return pyrna_enum_bitfield_to_py(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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-26 20:41:54 +00:00
										 |  |  | 	char     *opname; | 
					
						
							|  |  |  | 	PyObject *kw = NULL; /* optional args */ | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	int all_args = 1; | 
					
						
							|  |  |  | 	int error_val = 0; | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	char *buf = NULL; | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | 	PyObject *pybuf; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	bContext *C = (bContext *)BPy_GetContext(); | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00: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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-11-13 11:10:29 +00:00
										 |  |  | 	if (!PyArg_ParseTuple(args, "s|O!i:_bpy.ops.as_string", &opname, &PyDict_Type, &kw, &all_args)) | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  | 	ot = WM_operatortype_find(opname, true); | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* WM_operator_properties_create(&ptr, opname); */ | 
					
						
							|  |  |  | 	/* Save another lookup */ | 
					
						
							|  |  |  | 	RNA_pointer_create(NULL, ot->srna, NULL, &ptr); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  | 	if (kw && PyDict_Size(kw)) | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 		error_val = pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: "); | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	if (error_val == 0) | 
					
						
							|  |  |  | 		buf = WM_operator_pystring(C, ot, &ptr, all_args); | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	WM_operator_properties_free(&ptr); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	if (error_val == -1) { | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	GHashIterator *iter = WM_operatortype_iter(); | 
					
						
							|  |  |  | 	PyObject *list = PyList_New(0), *name; | 
					
						
							| 
									
										
										
										
											2011-08-11 06:06:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-06 20:55:04 +00:00
										 |  |  | 	for ( ; BLI_ghashIterator_notDone(iter); BLI_ghashIterator_step(iter)) { | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 		wmOperatorType *ot = BLI_ghashIterator_getValue(iter); | 
					
						
							| 
									
										
										
										
											2011-08-11 06:06:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 		name = PyUnicode_FromString(ot->idname); | 
					
						
							| 
									
										
										
										
											2009-03-14 13:43:30 +00:00
										 |  |  | 		PyList_Append(list, name); | 
					
						
							|  |  |  | 		Py_DECREF(name); | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-08-11 06:06:17 +00:00
										 |  |  | 	BLI_ghashIterator_free(iter); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-14 13:43:30 +00:00
										 |  |  | 	return list; | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-13 23:25:08 +00:00
										 |  |  | static PyObject *pyop_getrna(PyObject *UNUSED(self), PyObject *value) | 
					
						
							| 
									
										
										
										
											2009-07-26 18:18:14 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	wmOperatorType *ot; | 
					
						
							|  |  |  | 	PointerRNA ptr; | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	const char *opname = _PyUnicode_AsString(value); | 
					
						
							|  |  |  | 	BPy_StructRNA *pyrna = NULL; | 
					
						
							| 
									
										
										
										
											2009-07-26 18:18:14 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	if (opname == NULL) { | 
					
						
							| 
									
										
										
										
											2009-11-13 11:10:29 +00:00
										 |  |  | 		PyErr_SetString(PyExc_TypeError, "_bpy.ops.get_rna() expects a string argument"); | 
					
						
							| 
									
										
										
										
											2009-07-26 18:18:14 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  | 	ot = WM_operatortype_find(opname, true); | 
					
						
							| 
									
										
										
										
											2012-05-20 19:49:27 +00:00
										 |  |  | 	if (ot == NULL) { | 
					
						
							| 
									
										
										
										
											2009-11-13 11:10:29 +00:00
										 |  |  | 		PyErr_Format(PyExc_KeyError, "_bpy.ops.get_rna(\"%s\") not found", opname); | 
					
						
							| 
									
										
										
										
											2009-07-26 18:18:14 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	/* type */ | 
					
						
							|  |  |  | 	//RNA_pointer_create(NULL, &RNA_Struct, ot->srna, &ptr);
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* XXX - should call WM_operator_properties_free */ | 
					
						
							| 
									
										
										
										
											2009-11-24 16:19:15 +00:00
										 |  |  | 	WM_operator_properties_create_ptr(&ptr, ot); | 
					
						
							| 
									
										
										
										
											2010-11-23 12:05:35 +00:00
										 |  |  | 	WM_operator_properties_sanitize(&ptr, 0); | 
					
						
							| 
									
										
										
										
											2009-11-24 16:19:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr); | 
					
						
							| 
									
										
										
										
											2011-08-05 16:29:38 +00:00
										 |  |  | #ifdef PYRNA_FREE_SUPPORT
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  | 	pyrna->freeptr = true; | 
					
						
							| 
									
										
										
										
											2011-08-05 16:29:38 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2009-07-26 18:18:14 +00:00
										 |  |  | 	return (PyObject *)pyrna; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | static PyObject *pyop_getinstance(PyObject *UNUSED(self), PyObject *value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	wmOperatorType *ot; | 
					
						
							|  |  |  | 	wmOperator *op; | 
					
						
							|  |  |  | 	PointerRNA ptr; | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	const char *opname = _PyUnicode_AsString(value); | 
					
						
							|  |  |  | 	BPy_StructRNA *pyrna = NULL; | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	if (opname == NULL) { | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | 		PyErr_SetString(PyExc_TypeError, "_bpy.ops.get_instance() expects a string argument"); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  | 	ot = WM_operatortype_find(opname, true); | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	if (ot == NULL) { | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | 		PyErr_Format(PyExc_KeyError, "_bpy.ops.get_instance(\"%s\") not found", opname); | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef PYRNA_FREE_SUPPORT
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	op = MEM_callocN(sizeof(wmOperator), __func__); | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	op = PyMem_MALLOC(sizeof(wmOperator)); | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | 	memset(op, 0, sizeof(wmOperator)); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2012-03-09 00:41:09 +00:00
										 |  |  | 	BLI_strncpy(op->idname, op->idname, sizeof(op->idname)); /* in case its needed */ | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	op->type = ot; | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	RNA_pointer_create(NULL, &RNA_Operator, op, &ptr); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	pyrna = (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr); | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | #ifdef PYRNA_FREE_SUPPORT
 | 
					
						
							| 
									
										
										
										
											2013-01-07 05:26:12 +00:00
										 |  |  | 	pyrna->freeptr = true; | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	op->ptr = &pyrna->ptr; | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return (PyObject *)pyrna; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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}, | 
					
						
							| 
									
										
										
										
											2011-10-05 03:39:22 +00:00
										 |  |  | 	{"get_rna", (PyCFunction) pyop_getrna, METH_O, NULL},           /* only for introspection, leaks memory */ | 
					
						
							|  |  |  | 	{"get_instance", (PyCFunction) pyop_getinstance, METH_O, NULL}, /* only for introspection, leaks memory */ | 
					
						
							| 
									
										
										
										
											2010-09-09 17:36:54 +00:00
										 |  |  | 	{"macro_define", (PyCFunction) PYOP_wrap_macro_define, METH_VARARGS, NULL}, | 
					
						
							|  |  |  | 	{NULL, NULL, 0, NULL} | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							|  |  |  | 	NULL, NULL, NULL, NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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
										 |  |  | } |