[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [33348] trunk/blender/source: python access to driver namespace, rather then have a textblock defined for drivers allow scripts to add functions directly .

Campbell Barton ideasman42 at gmail.com
Sat Nov 27 03:39:57 CET 2010


Revision: 33348
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=33348
Author:   campbellbarton
Date:     2010-11-27 03:39:51 +0100 (Sat, 27 Nov 2010)

Log Message:
-----------
python access to driver namespace, rather then have a textblock defined for drivers allow scripts to add functions directly.
- bpy.app.driver_namespace, read-only dictionary, edit in-place.
- reset on file load and new file.
- on errors the namespace used to be reset, this should not be needed.

simple example.

  def driverFunc(val):
    return val * val
  bpy.app.driver_namespace['driverFunc'] = driverFunc

... now all drivers can access this function.

Modified Paths:
--------------
    trunk/blender/source/blender/python/BPY_extern.h
    trunk/blender/source/blender/python/intern/bpy_app.c
    trunk/blender/source/blender/python/intern/bpy_app.h
    trunk/blender/source/blender/python/intern/bpy_driver.c
    trunk/blender/source/blender/windowmanager/intern/wm_files.c
    trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
    trunk/blender/source/creator/creator.c

Modified: trunk/blender/source/blender/python/BPY_extern.h
===================================================================
--- trunk/blender/source/blender/python/BPY_extern.h	2010-11-27 00:56:18 UTC (rev 33347)
+++ trunk/blender/source/blender/python/BPY_extern.h	2010-11-27 02:39:51 UTC (rev 33348)
@@ -118,7 +118,7 @@
 //	int BPY_do_spacehandlers(struct ScrArea *sa, unsigned short event,
 //		short eventValue, unsigned short space_event);
 //
-//	void BPY_pydriver_update(void);
+	void BPY_reset_driver(void);
 	float BPY_eval_driver(struct ChannelDriver *driver);
 //
 	int BPY_eval_button(struct bContext *C, const char *expr, double *value);

Modified: trunk/blender/source/blender/python/intern/bpy_app.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_app.c	2010-11-27 00:56:18 UTC (rev 33347)
+++ trunk/blender/source/blender/python/intern/bpy_app.c	2010-11-27 02:39:51 UTC (rev 33348)
@@ -159,15 +159,34 @@
 	return PyC_UnicodeFromByte(btempdir);
 }
 
-PyGetSetDef bpy_app_debug_getset= {"debug", bpy_app_debug_get, bpy_app_debug_set, "Boolean, set when blender is running in debug mode (started with -d)", NULL};
-PyGetSetDef bpy_app_tempdir_getset= {"tempdir", bpy_app_tempdir_get, NULL, "String, the temp directory used by blender (read-only)", NULL};
+static PyObject *bpy_app_driver_dict_get(PyObject *UNUSED(self), void *UNUSED(closure))
+{
+	if (bpy_pydriver_Dict == NULL)
+		if (bpy_pydriver_create_dict() != 0) {
+			PyErr_SetString(PyExc_RuntimeError, "bpy.app.driver_namespace failed to create dictionary");
+			return NULL;
+	}
 
+	Py_INCREF(bpy_pydriver_Dict);
+	return bpy_pydriver_Dict;
+}
+
+
+PyGetSetDef bpy_app_getsets[]= {
+	{"debug", bpy_app_debug_get, bpy_app_debug_set, "Boolean, set when blender is running in debug mode (started with -d)", NULL},
+	{"tempdir", bpy_app_tempdir_get, NULL, "String, the temp directory used by blender (read-only)", NULL},
+	{"driver_namespace", bpy_app_driver_dict_get, NULL, "Dictionary for drivers namespace, editable in-place, reset on file load (read-only)", NULL},
+	{NULL, NULL, NULL, NULL, NULL}
+};
+
 static void py_struct_seq_getset_init(void)
 {
 	/* tricky dynamic members, not to py-spec! */
-	
-	PyDict_SetItemString(BlenderAppType.tp_dict, bpy_app_debug_getset.name, PyDescr_NewGetSet(&BlenderAppType, &bpy_app_debug_getset));
-	PyDict_SetItemString(BlenderAppType.tp_dict, bpy_app_tempdir_getset.name, PyDescr_NewGetSet(&BlenderAppType, &bpy_app_tempdir_getset));
+	PyGetSetDef *getset;
+
+	for(getset= bpy_app_getsets; getset->name; getset++) {
+		PyDict_SetItemString(BlenderAppType.tp_dict, getset->name, PyDescr_NewGetSet(&BlenderAppType, getset));
+	}
 }
 /* end dynamic bpy.app */
 

Modified: trunk/blender/source/blender/python/intern/bpy_app.h
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_app.h	2010-11-27 00:56:18 UTC (rev 33347)
+++ trunk/blender/source/blender/python/intern/bpy_app.h	2010-11-27 02:39:51 UTC (rev 33348)
@@ -28,4 +28,8 @@
 
 PyObject *BPY_app_struct( void );
 
+/* bpy_driver.c */
+int bpy_pydriver_create_dict(void);
+extern PyObject *bpy_pydriver_Dict;
+
 #endif

Modified: trunk/blender/source/blender/python/intern/bpy_driver.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_driver.c	2010-11-27 00:56:18 UTC (rev 33347)
+++ trunk/blender/source/blender/python/intern/bpy_driver.c	2010-11-27 02:39:51 UTC (rev 33348)
@@ -40,7 +40,7 @@
 /* For faster execution we keep a special dictionary for pydrivers, with
  * the needed modules and aliases.
  */
-static int bpy_pydriver_create_dict(void)
+int bpy_pydriver_create_dict(void)
 {
 	PyObject *d, *mod;
 
@@ -103,7 +103,7 @@
  * reloading the Blender text module "pydrivers.py", if available, so
  * updates in it reach pydriver evaluation.
  */
-void BPY_pydriver_update(void)
+void BPY_reset_driver(void)
 {
 	PyGILState_STATE gilstate;
 	int use_gil= 1; // (PyThreadState_Get()==NULL);
@@ -126,12 +126,6 @@
 /* error return function for BPY_eval_pydriver */
 static float pydriver_error(ChannelDriver *driver)
 {
-	if (bpy_pydriver_Dict) { /* free the global dict used by pydrivers */
-		PyDict_Clear(bpy_pydriver_Dict);
-		Py_DECREF(bpy_pydriver_Dict);
-		bpy_pydriver_Dict = NULL;
-	}
-
 	driver->flag |= DRIVER_FLAG_INVALID; /* py expression failed */
 	fprintf(stderr, "\nError in Driver: The following Python expression failed:\n\t'%s'\n\n", driver->expression);
 

Modified: trunk/blender/source/blender/windowmanager/intern/wm_files.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_files.c	2010-11-27 00:56:18 UTC (rev 33347)
+++ trunk/blender/source/blender/windowmanager/intern/wm_files.c	2010-11-27 02:39:51 UTC (rev 33348)
@@ -319,6 +319,7 @@
 
 #ifdef WITH_PYTHON
 		/* run any texts that were loaded in and flagged as modules */
+		BPY_reset_driver();
 		BPY_load_user_modules(C);
 #endif
 		CTX_wm_window_set(C, NULL); /* exits queues */
@@ -410,6 +411,9 @@
 	if(CTX_py_init_get(C)) {
 		/* sync addons, these may have changed from the defaults */
 		BPY_eval_string(C, "__import__('bpy').utils.addon_reset_all()");
+
+		BPY_reset_driver();
+		BPY_load_user_modules(C);
 	}
 #endif
 	

Modified: trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c	2010-11-27 00:56:18 UTC (rev 33347)
+++ trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c	2010-11-27 02:39:51 UTC (rev 33348)
@@ -146,6 +146,8 @@
 #ifdef WITH_PYTHON
 	BPY_set_context(C); /* necessary evil */
 	BPY_start_python(argc, argv);
+
+	BPY_reset_driver();
 	BPY_load_user_modules(C);
 #else
 	(void)argc; /* unused */

Modified: trunk/blender/source/creator/creator.c
===================================================================
--- trunk/blender/source/creator/creator.c	2010-11-27 00:56:18 UTC (rev 33347)
+++ trunk/blender/source/creator/creator.c	2010-11-27 02:39:51 UTC (rev 33348)
@@ -926,6 +926,7 @@
 		/* WM_read_file() runs normally but since we're in background mode do here */
 #ifdef WITH_PYTHON
 		/* run any texts that were loaded in and flagged as modules */
+		BPY_reset_driver();
 		BPY_load_user_modules(C);
 #endif
 





More information about the Bf-blender-cvs mailing list