[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [31697] trunk/blender: poll function for py api operator access

Campbell Barton ideasman42 at gmail.com
Wed Sep 1 13:16:11 CEST 2010


Revision: 31697
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=31697
Author:   campbellbarton
Date:     2010-09-01 13:16:11 +0200 (Wed, 01 Sep 2010)

Log Message:
-----------
poll function for py api operator access
eg:
 if bpy.ops.object.mode_set.poll():
     ...

Modified Paths:
--------------
    trunk/blender/release/scripts/modules/bpy/ops.py
    trunk/blender/source/blender/python/intern/bpy_operator.c

Modified: trunk/blender/release/scripts/modules/bpy/ops.py
===================================================================
--- trunk/blender/release/scripts/modules/bpy/ops.py	2010-09-01 10:29:03 UTC (rev 31696)
+++ trunk/blender/release/scripts/modules/bpy/ops.py	2010-09-01 11:16:11 UTC (rev 31697)
@@ -23,6 +23,7 @@
 
 # op_add = ops_module.add
 op_dir = ops_module.dir
+op_poll = ops_module.poll
 op_call = ops_module.call
 op_as_string = ops_module.as_string
 op_get_rna = ops_module.get_rna
@@ -120,6 +121,9 @@
         self.module = module
         self.func = func
 
+    def poll(self, context=None):
+        return op_poll(self.idname_py(), context)
+
     def idname(self):
         # submod.foo -> SUBMOD_OT_foo
         return self.module.upper() + "_OT_" + self.func

Modified: trunk/blender/source/blender/python/intern/bpy_operator.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_operator.c	2010-09-01 10:29:03 UTC (rev 31696)
+++ trunk/blender/source/blender/python/intern/bpy_operator.c	2010-09-01 11:16:11 UTC (rev 31697)
@@ -40,7 +40,46 @@
 #include "MEM_guardedalloc.h"
 #include "BKE_report.h"
 
+static PyObject *pyop_poll( PyObject * self, PyObject * args)
+{
+	wmOperatorType *ot;
+	char		*opname;
+	PyObject	*context_dict= NULL; /* optional args */
+	PyObject	*context_dict_back;
+	PyObject	*ret;
 
+	// 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...
+	bContext *C = BPy_GetContext();
+	
+	if (!PyArg_ParseTuple(args, "s|O:_bpy.ops.poll", &opname, &context_dict))
+		return NULL;
+	
+	ot= WM_operatortype_find(opname, TRUE);
+
+	if (ot == NULL) {
+		PyErr_Format(PyExc_SystemError, "Polling operator \"bpy.ops.%s\" error, could not be found", opname);
+		return NULL;
+	}
+
+	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 */
+	
+	/* main purpose of thsi function */
+	ret= WM_operator_poll((bContext*)C, ot) ? Py_True : Py_False;
+	
+	/* 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;
+}
+
 static PyObject *pyop_call( PyObject * self, PyObject * args)
 {
 	wmOperatorType *ot;
@@ -66,7 +105,7 @@
 	ot= WM_operatortype_find(opname, TRUE);
 
 	if (ot == NULL) {
-		PyErr_Format( PyExc_SystemError, "Calling operator \"bpy.ops.%s\" error, could not be found", opname);
+		PyErr_Format(PyExc_SystemError, "Calling operator \"bpy.ops.%s\" error, could not be found", opname);
 		return NULL;
 	}
 	
@@ -252,6 +291,7 @@
 
 PyObject *BPY_operator_module( void )
 {
+	static PyMethodDef pyop_poll_meth =		{"poll", (PyCFunction) pyop_poll, METH_VARARGS, NULL};
 	static PyMethodDef pyop_call_meth =		{"call", (PyCFunction) pyop_call, METH_VARARGS, NULL};
 	static PyMethodDef pyop_as_string_meth ={"as_string", (PyCFunction) pyop_as_string, METH_VARARGS, NULL};
 	static PyMethodDef pyop_dir_meth =		{"dir", (PyCFunction) pyop_dir, METH_NOARGS, NULL};
@@ -261,11 +301,12 @@
 	PyObject *submodule = PyModule_New("_bpy.ops");
 	PyDict_SetItemString(PyImport_GetModuleDict(), "_bpy.ops", submodule);
 
-	PyModule_AddObject( submodule, "call",	PyCFunction_New(&pyop_call_meth,	NULL) );
-	PyModule_AddObject( submodule, "as_string",PyCFunction_New(&pyop_as_string_meth,NULL) );
-	PyModule_AddObject( submodule, "dir",		PyCFunction_New(&pyop_dir_meth,		NULL) );
-	PyModule_AddObject( submodule, "get_rna",	PyCFunction_New(&pyop_getrna_meth,	NULL) );
-	PyModule_AddObject( submodule, "macro_define",PyCFunction_New(&pyop_macro_def_meth,		NULL) );
+	PyModule_AddObject( submodule, "poll",	PyCFunction_New(&pyop_poll_meth, NULL) );
+	PyModule_AddObject( submodule, "call",	PyCFunction_New(&pyop_call_meth, NULL) );
+	PyModule_AddObject( submodule, "as_string",PyCFunction_New(&pyop_as_string_meth, NULL) );
+	PyModule_AddObject( submodule, "dir",		PyCFunction_New(&pyop_dir_meth, NULL) );
+	PyModule_AddObject( submodule, "get_rna",	PyCFunction_New(&pyop_getrna_meth, NULL) );
+	PyModule_AddObject( submodule, "macro_define",PyCFunction_New(&pyop_macro_def_meth, NULL) );
 
 	return submodule;
 }





More information about the Bf-blender-cvs mailing list