| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * $Id$ | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** 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, | 
					
						
							|  |  |  |  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Contributor(s): Campbell Barton | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | /* Note, this module is not to be used directly by the user.
 | 
					
						
							|  |  |  |  * its accessed from blender with bpy.__ops__ | 
					
						
							|  |  |  |  * */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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"
 | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "WM_api.h"
 | 
					
						
							|  |  |  | #include "WM_types.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "MEM_guardedalloc.h"
 | 
					
						
							| 
									
										
										
										
											2009-01-02 07:54:38 +00:00
										 |  |  | #include "BKE_report.h"
 | 
					
						
							| 
									
										
										
										
											2009-07-26 18:18:14 +00:00
										 |  |  | #include "BKE_utildefines.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | static PyObject *pyop_call( PyObject * self, PyObject * args) | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-12-25 10:48:36 +00:00
										 |  |  | 	wmOperatorType *ot; | 
					
						
							|  |  |  | 	int error_val = 0; | 
					
						
							|  |  |  | 	PointerRNA ptr; | 
					
						
							| 
									
										
										
										
											2009-03-14 13:43:30 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-09-03 22:37:09 +00:00
										 |  |  | 	char		*opname; | 
					
						
							|  |  |  | 	PyObject	*kw= NULL; /* optional args */ | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 	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 */ | 
					
						
							|  |  |  | 	int context= WM_OP_EXEC_DEFAULT; | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-14 13:43: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...
 | 
					
						
							| 
									
										
										
										
											2009-05-25 13:48:44 +00:00
										 |  |  | 	bContext *C = BPy_GetContext(); | 
					
						
							| 
									
										
										
										
											2009-03-14 13:43:30 +00:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-11-13 11:10:29 +00:00
										 |  |  | 	if (!PyArg_ParseTuple(args, "sO|O!i:_bpy.ops.call", &opname, &context_dict, &PyDict_Type, &kw, &context)) | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 		return NULL; | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-05 19:27:26 +00:00
										 |  |  | 	ot= WM_operatortype_exists(opname); | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-26 12:39:53 +00:00
										 |  |  | 	if (ot == NULL) { | 
					
						
							| 
									
										
										
										
											2009-12-24 16:10:26 +00:00
										 |  |  | 		PyErr_Format( PyExc_SystemError, "_bpy.ops.call: operator \"%s\" could not be found", opname); | 
					
						
							| 
									
										
										
										
											2008-12-26 12:39:53 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 	if(!PyDict_Check(context_dict)) | 
					
						
							|  |  |  | 		context_dict= NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	context_dict_back= CTX_py_dict_get(C); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CTX_py_dict_set(C, (void *)context_dict); | 
					
						
							|  |  |  | 	Py_XINCREF(context_dict); /* so we done loose it */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-18 13:02:20 +00:00
										 |  |  | 	if(WM_operator_poll((bContext*)C, ot) == FALSE) { | 
					
						
							| 
									
										
										
										
											2009-11-23 18:08:42 +00:00
										 |  |  | 		PyErr_Format( PyExc_SystemError, "_bpy.ops.call: operator %.200s.poll() function failed, context is incorrect", opname); | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 		error_val= -1; | 
					
						
							| 
									
										
										
										
											2009-01-18 10:46:26 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 	else { | 
					
						
							|  |  |  | 		/* WM_operator_properties_create(&ptr, opname); */ | 
					
						
							|  |  |  | 		/* Save another lookup */ | 
					
						
							|  |  |  | 		RNA_pointer_create(NULL, ot->srna, NULL, &ptr); | 
					
						
							| 
									
										
										
										
											2009-09-03 22:37:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 		if(kw && PyDict_Size(kw)) | 
					
						
							|  |  |  | 			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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 		if (error_val==0) { | 
					
						
							|  |  |  | 			ReportList *reports; | 
					
						
							| 
									
										
										
										
											2009-01-02 07:54:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 			reports= MEM_mallocN(sizeof(ReportList), "wmOperatorReportList"); | 
					
						
							|  |  |  | 			BKE_reports_init(reports, RPT_STORE); | 
					
						
							| 
									
										
										
										
											2009-01-02 07:54:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 			WM_operator_call_py(C, ot, context, &ptr, reports); | 
					
						
							| 
									
										
										
										
											2009-01-02 07:54:38 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-29 09:25:11 +00:00
										 |  |  | 			if(BPy_reports_to_error(reports)) | 
					
						
							|  |  |  | 				error_val = -1; | 
					
						
							| 
									
										
										
										
											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 */ | 
					
						
							|  |  |  | 			if(reports->list.first) { | 
					
						
							|  |  |  | 				char *report_str= BKE_reports_string(reports, 0); /* all reports */ | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 				if(report_str) { | 
					
						
							|  |  |  | 					PySys_WriteStdout("%s\n", report_str); | 
					
						
							|  |  |  | 					MEM_freeN(report_str); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 			BKE_reports_clear(reports); | 
					
						
							|  |  |  | 			if ((reports->flag & RPT_FREE) == 0) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				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) { | 
					
						
							|  |  |  | 				PyErr_Format(PyExc_AttributeError, "Operator \"%s\" does not take any args", opname); | 
					
						
							|  |  |  | 				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
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (error_val==-1) { | 
					
						
							| 
									
										
										
										
											2008-12-25 14:17:54 +00:00
										 |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 	Py_RETURN_NONE; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | static PyObject *pyop_as_string( PyObject * self, PyObject * args) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	wmOperatorType *ot; | 
					
						
							|  |  |  | 	PointerRNA ptr; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	char		*opname; | 
					
						
							|  |  |  | 	PyObject	*kw= NULL; /* optional args */ | 
					
						
							|  |  |  | 	int all_args = 1; | 
					
						
							|  |  |  | 	int error_val= 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-11 10:51:40 +00:00
										 |  |  | 	char *buf = NULL; | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | 	PyObject *pybuf; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	bContext *C = BPy_GetContext(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	ot= WM_operatortype_find(opname, TRUE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (ot == NULL) { | 
					
						
							| 
									
										
										
										
											2009-11-13 11:10:29 +00:00
										 |  |  | 		PyErr_Format( PyExc_SystemError, "_bpy.ops.as_string: operator \"%s\"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); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(kw && PyDict_Size(kw)) | 
					
						
							|  |  |  | 		error_val= pyrna_pydict_to_props(&ptr, kw, 0, "Converting py args to operator properties: "); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (error_val==0) | 
					
						
							|  |  |  | 		buf= WM_operator_pystring(C, ot, &ptr, all_args); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	WM_operator_properties_free(&ptr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (error_val==-1) { | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(buf) { | 
					
						
							|  |  |  | 		pybuf= PyUnicode_FromString(buf); | 
					
						
							|  |  |  | 		MEM_freeN(buf); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		pybuf= PyUnicode_FromString(""); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return pybuf; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | static PyObject *pyop_dir(PyObject *self) | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-03-14 13:43:30 +00:00
										 |  |  | 	PyObject *list = PyList_New(0), *name; | 
					
						
							|  |  |  | 	wmOperatorType *ot; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	for(ot= WM_operatortype_first(); ot; ot= ot->next) { | 
					
						
							|  |  |  | 		name = PyUnicode_FromString(ot->idname); | 
					
						
							|  |  |  | 		PyList_Append(list, name); | 
					
						
							|  |  |  | 		Py_DECREF(name); | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-03-14 13:43:30 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	return list; | 
					
						
							| 
									
										
										
										
											2008-12-21 08:53:36 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-26 18:18:14 +00:00
										 |  |  | static PyObject *pyop_getrna(PyObject *self, PyObject *value) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	wmOperatorType *ot; | 
					
						
							|  |  |  | 	PointerRNA ptr; | 
					
						
							|  |  |  | 	char *opname= _PyUnicode_AsString(value); | 
					
						
							|  |  |  | 	BPy_StructRNA *pyrna= NULL; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	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; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	ot= WM_operatortype_find(opname, TRUE); | 
					
						
							|  |  |  | 	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); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2009-07-26 18:18:14 +00:00
										 |  |  | 	pyrna= (BPy_StructRNA *)pyrna_struct_CreatePyObject(&ptr); | 
					
						
							|  |  |  | 	pyrna->freeptr= TRUE; | 
					
						
							|  |  |  | 	return (PyObject *)pyrna; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | PyObject *BPY_operator_module( void ) | 
					
						
							| 
									
										
										
										
											2009-03-21 06:55:30 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | 	static PyMethodDef pyop_call_meth =		{"call", (PyCFunction) pyop_call, METH_VARARGS, NULL}; | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | 	static PyMethodDef pyop_as_string_meth ={"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL}; | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | 	static PyMethodDef pyop_dir_meth =		{"dir", (PyCFunction) pyop_dir, METH_NOARGS, NULL}; | 
					
						
							| 
									
										
										
										
											2009-07-26 18:18:14 +00:00
										 |  |  | 	static PyMethodDef pyop_getrna_meth =	{"get_rna", (PyCFunction) pyop_getrna, METH_O, NULL}; | 
					
						
							| 
									
										
										
										
											2009-12-05 19:27:26 +00:00
										 |  |  | 	static PyMethodDef pyop_macro_def_meth ={"macro_define", (PyCFunction) PYOP_wrap_macro_define, METH_VARARGS, NULL}; | 
					
						
							| 
									
										
										
										
											2009-03-21 06:55:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-11-13 11:10:29 +00:00
										 |  |  | 	PyObject *submodule = PyModule_New("_bpy.ops"); | 
					
						
							|  |  |  | 	PyDict_SetItemString(PySys_GetObject("modules"), "_bpy.ops", submodule); | 
					
						
							| 
									
										
										
										
											2009-03-14 13:43:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | 	PyModule_AddObject( submodule, "call",	PyCFunction_New(&pyop_call_meth,	NULL) ); | 
					
						
							| 
									
										
										
										
											2009-09-16 06:02:56 +00:00
										 |  |  | 	PyModule_AddObject( submodule, "as_string",PyCFunction_New(&pyop_as_string_meth,NULL) ); | 
					
						
							| 
									
										
										
										
											2009-07-19 13:32:02 +00:00
										 |  |  | 	PyModule_AddObject( submodule, "dir",		PyCFunction_New(&pyop_dir_meth,		NULL) ); | 
					
						
							| 
									
										
										
										
											2009-07-26 18:18:14 +00:00
										 |  |  | 	PyModule_AddObject( submodule, "get_rna",	PyCFunction_New(&pyop_getrna_meth,	NULL) ); | 
					
						
							| 
									
										
										
										
											2009-12-05 19:27:26 +00:00
										 |  |  | 	PyModule_AddObject( submodule, "macro_define",PyCFunction_New(&pyop_macro_def_meth,		NULL) ); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | } |