[Bf-python] framechange, keypress, selection change callbacks

dunk at dunkfordyce.co.uk dunk at dunkfordyce.co.uk
Sat Jan 10 13:00:02 CET 2004


hello, attached is my patch that gives callback functions for framechange, selection change and keypress.

keypress is the most "dangerous" as you can effectivly intercept keystokes and rehook the functionality. it is also the function i am most unsure of technically. i think i may have put this in the wrong function so comments please.

here is some exaple python:

############################
import Blender
from Blender.Draw import *
from Blender.BGL import *

def selchange():
	print "got selection"

	objs=Blender.Object.GetSelected()

	for obj in objs:
		print obj.getName()

def keybevent(arg):
	print "myotherfunc %i" %arg
	if arg==AKEY:
		print "AKEY"
		return 1

	return 0

Blender.CallbackSelectionChange(myfunc)
Blender.CallbackKeyPress(myotherfunc)

def draw():
	pass

def event(evt,val):
	if (evt==QKEY):
	Exit()

def bevent(evt):
	pass

Register(draw,event,bevent)

#####################################

cheers
dunk

------------------------------------------------
http://30bentham.homelinux.org
http://www.dunkfordyce.co.uk
-------------- next part --------------
? Makefile.in
? callbackdiff.txt
? txt
? avi/.sconsign
? avi/Makefile.in
? avi/intern/.sconsign
? blenkernel/.sconsign
? blenkernel/Makefile.in
? blenkernel/intern/.sconsign
? blenkernel/intern/sc
? blenlib/.sconsign
? blenlib/Makefile.in
? blenlib/intern/.sconsign
? blenloader/.sconsign
? blenloader/Makefile.in
? blenloader/intern/.sconsign
? blenpluginapi/.sconsign
? blenpluginapi/Makefile.in
? blenpluginapi/intern/.sconsign
? deflate/.sconsign
? deflate/Makefile.in
? deflate/intern/.sconsign
? ftfont/.sconsign
? ftfont/intern/.sconsign
? imbuf/.sconsign
? imbuf/Makefile.in
? imbuf/intern/.sconsign
? img/.sconsign
? img/Makefile.in
? img/intern/.sconsign
? include/.sconsign
? inflate/.sconsign
? inflate/Makefile.in
? inflate/intern/.sconsign
? makesdna/.sconsign
? makesdna/Makefile.in
? makesdna/intern/.sconsign
? makesdna/intern/Makefile.in
? python/.sconsign
? python/Makefile.in
? python/diff.txt
? python/api2_2x/.Render.c.swp
? python/api2_2x/.sconsign
? python/api2_2x/Makefile.in
? python/api2_2x/Render.c
? python/api2_2x/Render.h
? quicktime/.sconsign
? quicktime/Makefile.in
? radiosity/Makefile.in
? radiosity/extern/include/.sconsign
? radiosity/intern/source/.sconsign
? readblenfile/.sconsign
? readblenfile/Makefile.in
? readblenfile/intern/.sconsign
? readstreamglue/.sconsign
? readstreamglue/Makefile.in
? readstreamglue/intern/.sconsign
? render/Makefile.in
? render/extern/include/.sconsign
? render/intern/include/.sconsign
? render/intern/source/.sconsign
? renderconverter/Makefile.in
? renderconverter/intern/.sconsign
? src/.sconsign
? src/Makefile.in
? writeblenfile/.sconsign
? writeblenfile/Makefile.in
? writeblenfile/intern/.sconsign
? writestreamglue/.sconsign
? writestreamglue/Makefile.in
? writestreamglue/intern/.sconsign
? yafray/.sconsign
? yafray/Makefile.in
? yafray/intern/.sconsign
Index: blenkernel/Makefile.am
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/blenkernel/Makefile.am,v
retrieving revision 1.8
diff -u -r1.8 Makefile.am
--- blenkernel/Makefile.am	14 Dec 2003 01:18:02 -0000	1.8
+++ blenkernel/Makefile.am	10 Jan 2004 11:50:38 -0000
@@ -95,7 +95,9 @@
 	-I$(top_srcdir)/source/blender/imbuf \
 	-I$(top_srcdir)/source/blender/avi \
 	-I$(top_srcdir)/intern/iksolver/extern \
-	-I$(top_srcdir)/source/blender/blenloader
+	-I$(top_srcdir)/source/blender/blenloader \
+	-I at PYTHONSYSPREFIX@/include/python at PYTHON_VERSION@ \
+	-I$(top_srcdir)/source/blender/python/api2_2x
 
 EXTRA_DIST = \
 	Makefile \
Index: blenkernel/intern/scene.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/blenkernel/intern/scene.c,v
retrieving revision 1.10
diff -u -r1.10 scene.c
--- blenkernel/intern/scene.c	4 Jan 2004 22:10:30 -0000	1.10
+++ blenkernel/intern/scene.c	10 Jan 2004 11:50:38 -0000
@@ -211,6 +211,7 @@
 	Object *par;
 	int doit, domore= 0, lastdomore=1;
 	
+	BPY_callbackFrameChange();
 	
 	/* keep same order when nothing has changed! */
 	
@@ -363,6 +364,7 @@
 	Group *group;
 	GroupObject *go;
 	int flag;
+
 	
 	G.scene= sce;
 	
Index: python/BPY_extern.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/python/BPY_extern.h,v
retrieving revision 1.8
diff -u -r1.8 BPY_extern.h
--- python/BPY_extern.h	14 Dec 2003 01:18:06 -0000	1.8
+++ python/BPY_extern.h	10 Jan 2004 11:50:39 -0000
@@ -73,3 +73,12 @@
 void BPY_free_finished_script(struct Script *script);
 
 void init_syspath(void);
+
+/* for python callbacks */
+extern *bpy_callbackFrameChange;
+extern *bpy_callbackSelectionChange;
+extern *bpy_callbackKeyPres;
+
+void BPY_callbackFrameChange();
+void BPY_callbackSelectionChange();
+int  BPY_callbackKeyPress(unsigned short evt);
Index: python/BPY_interface.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/python/BPY_interface.c,v
retrieving revision 1.26
diff -u -r1.26 BPY_interface.c
--- python/BPY_interface.c	15 Dec 2003 18:18:09 -0000	1.26
+++ python/BPY_interface.c	10 Jan 2004 11:50:40 -0000
@@ -555,6 +555,8 @@
 /*****************************************************************************/
 void BPY_do_all_scripts(short event)
 {
+  BPY_callbackFrameChange();
+ 
   DoAllScriptsFromList (&(G.main->object), event);
   DoAllScriptsFromList (&(G.main->lamp), event);
   DoAllScriptsFromList (&(G.main->camera), event);
@@ -827,3 +829,5 @@
   d = PyModule_GetDict(m);
   PyDict_SetItemString(d, "__import__", import);
 }
+
+
Index: python/api2_2x/Blender.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/python/api2_2x/Blender.c,v
retrieving revision 1.26
diff -u -r1.26 Blender.c
--- python/api2_2x/Blender.c	23 Nov 2003 17:46:05 -0000	1.26
+++ python/api2_2x/Blender.c	10 Jan 2004 11:50:44 -0000
@@ -230,4 +230,135 @@
   PyDict_SetItemString (dict, "Text",     Text_Init());
   PyDict_SetItemString (dict, "World",    World_Init());
   PyDict_SetItemString (dict, "Texture",  Texture_Init());
+  PyDict_SetItemString (dict, "Render",   Render_Init());
+}
+
+static PyObject *Blender_callbackFrameChange(PyObject *dummy, PyObject *args)
+{
+  PyObject *result=NULL;
+  PyObject *temp;
+
+  printf("my_set_callback");
+
+  if (PyArg_ParseTuple(args, "O:set_callback", &temp)) {
+    if (!PyCallable_Check(temp)) {
+      PyErr_SetString(PyExc_TypeError, "parameter must be callable");
+      return NULL;
+    }
+
+    Py_XINCREF(temp);
+    Py_XDECREF(bpy_callbackFrameChange);
+    bpy_callbackFrameChange=temp;
+    Py_INCREF(Py_None);
+    result=Py_None;
+  }
+  return result;
+}
+
+/*****************************************************************************/
+/* Description: checks to see if the user call back variable has a           */
+/*              contains a callable function and then calls it               */
+/*****************************************************************************/
+void BPY_callbackFrameChange()
+{
+  PyObject *arglist;
+  PyObject *result;
+
+  if (!PyCallable_Check(bpy_callbackFrameChange)) {
+    return;
+  }
+
+  arglist=Py_BuildValue("()");
+  result=PyEval_CallObject(bpy_callbackFrameChange,arglist);
+
+  Py_DECREF(arglist);
+}
+
+static PyObject *Blender_callbackSelectionChange(PyObject *dummy, PyObject *args)
+{
+  PyObject *result=NULL;
+  PyObject *temp;
+
+  if (PyArg_ParseTuple(args, "O:set_callback", &temp)) {
+    if (!PyCallable_Check(temp)) {
+      PyErr_SetString(PyExc_TypeError, "parameter must be callable");
+      return NULL;
+    }
+
+    Py_XINCREF(temp);
+    Py_XDECREF(bpy_callbackSelectionChange);
+    bpy_callbackSelectionChange=temp;
+    Py_INCREF(Py_None);
+    result=Py_None;
+  }
+  return result;
+}
+
+/*****************************************************************************/
+/* Description: checks to see if the user call back variable has a           */
+/*              contains a callable function and then calls it               */
+/*****************************************************************************/
+void BPY_callbackSelectionChange()
+{
+  PyObject *arglist;
+  PyObject *result;
+
+  if (!PyCallable_Check(bpy_callbackSelectionChange)) {
+    return;
+  }
+
+  arglist=Py_BuildValue("()");
+  result=PyEval_CallObject(bpy_callbackSelectionChange,arglist);
+
+  Py_DECREF(arglist);
+}
+
+static PyObject *Blender_callbackKeyPress(PyObject *dummy, PyObject *args)
+{
+  PyObject *result=NULL;
+  PyObject *temp;
+
+  if (PyArg_ParseTuple(args, "O:set_callback", &temp)) {
+    if (!PyCallable_Check(temp)) {
+      PyErr_SetString(PyExc_TypeError, "parameter must be callable");
+      return NULL;
+    }
+
+    Py_XINCREF(temp);
+    Py_XDECREF(bpy_callbackKeyPress);
+    bpy_callbackKeyPress=temp;
+    Py_INCREF(Py_None);
+    result=Py_None;
+  }
+  return result;
+}
+
+/*****************************************************************************/
+/* Description: checks to see if the user call back variable has a           */
+/*              contains a callable function and then calls it               */
+/*****************************************************************************/
+int BPY_callbackKeyPress(unsigned short evt)
+{
+  PyObject *arglist;
+  PyObject *result;
+  int sendon=0;
+  
+  if (!PyCallable_Check(bpy_callbackKeyPress)) {
+    return 0;
+  }
+
+  arglist=Py_BuildValue("(i)",evt);
+  result=PyEval_CallObject(bpy_callbackKeyPress,arglist);
+
+  Py_DECREF(arglist);
+
+  if (result==NULL) {
+	 return 0;
+  }
+  
+  sendon=PyInt_AsLong(result);
+  
+  Py_DECREF(result);
+
+  return sendon;
 }
Index: python/api2_2x/Blender.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/python/api2_2x/Blender.h,v
retrieving revision 1.4
diff -u -r1.4 Blender.h
--- python/api2_2x/Blender.h	24 Jun 2003 07:18:26 -0000	1.4
+++ python/api2_2x/Blender.h	10 Jan 2004 11:50:44 -0000
@@ -50,6 +50,11 @@
 /* From Window.h, used here by Blender_Redraw */
 PyObject *M_Window_Redraw(PyObject *self, PyObject *args);
 
+/* storage for callbacks */
+PyObject *bpy_callbackFrameChange=NULL;
+PyObject *bpy_callbackSelectionChange=NULL;
+PyObject *bpy_callbackKeyPress=NULL;
+
 /* This global variable controls whether the global Interpreter dictionary
  * should be cleared after a script is run.  Default is to clear it.
  * See Blender.ReleaseGlobalDict(bool) */
@@ -62,6 +67,9 @@
 PyObject *Blender_Get (PyObject *self, PyObject *args);
 PyObject *Blender_Redraw(PyObject *self, PyObject *args);
 PyObject *Blender_ReleaseGlobalDict(PyObject *self, PyObject *args);
+PyObject *Blender_callbackFrameChange(PyObject *self, PyObject *args);
+PyObject *Blender_callbackSelectionChange(PyObject *self, PyObject *args);
+PyObject *Blender_callbackKeyPress(PyObject *self, PyObject *args);
 
 /*****************************************************************************/
 /* The following string definitions are used for documentation strings.      */
@@ -102,6 +110,9 @@
 	{"Redraw", &Blender_Redraw, METH_VARARGS, Blender_Redraw_doc},
 	{"ReleaseGlobalDict", &Blender_ReleaseGlobalDict,
 					METH_VARARGS, Blender_ReleaseGlobalDict_doc},
+	{"CallbackFrameChange", &Blender_callbackFrameChange, METH_VARARGS, ""},
+	{"CallbackSelectionChange", &Blender_callbackSelectionChange, METH_VARARGS, ""},
+	{"CallbackKeyPress", &Blender_callbackKeyPress, METH_VARARGS, ""},
 	{NULL, NULL}
 };
 
Index: python/api2_2x/Makefile.am
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/python/api2_2x/Makefile.am,v
retrieving revision 1.26
diff -u -r1.26 Makefile.am
--- python/api2_2x/Makefile.am	23 Nov 2003 17:46:05 -0000	1.26
+++ python/api2_2x/Makefile.am	10 Jan 2004 11:50:44 -0000
@@ -61,6 +61,8 @@
   Text.h \
   Texture.c \
   Texture.h \
+  Render.c \
+  Render.h \
   MTex.c \
   MTex.h \
   vector.c \
@@ -87,4 +89,5 @@
   -I$(top_srcdir)/intern/guardedalloc \
   -I$(top_srcdir)/intern/bmfont \
   -I$(top_srcdir)/source/blender/imbuf \
-  -I$(top_srcdir)/source/blender/include
+  -I$(top_srcdir)/source/blender/include \
+  -I$(top_srcdir)/source/blender/render/extern/include
Index: python/api2_2x/modules.h
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/python/api2_2x/modules.h,v
retrieving revision 1.35
diff -u -r1.35 modules.h
--- python/api2_2x/modules.h	23 Nov 2003 17:46:05 -0000	1.35
+++ python/api2_2x/modules.h	10 Jan 2004 11:50:45 -0000
@@ -112,6 +112,9 @@
 int        Camera_CheckPyObject  (PyObject *pyobj);
 Camera   * GetCameraByName (char * name);
 
+/* Render */
+PyObject * Render_Init (void);
+
 /* Lamp Data */
 PyObject * Lamp_Init (void);
 PyObject * Lamp_CreatePyObject (struct Lamp *lamp);
Index: src/editscreen.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editscreen.c,v
retrieving revision 1.56
diff -u -r1.56 editscreen.c
--- src/editscreen.c	8 Jan 2004 09:16:19 -0000	1.56
+++ src/editscreen.c	10 Jan 2004 11:50:48 -0000
@@ -931,7 +931,7 @@
 {
 	int has_input= 1;
 	int firsttime = 1;
-	
+
 	window_make_active(mainwin);
 	
 	while (1) {
@@ -948,7 +948,7 @@
 		}
 		
 		// window_make_active(mainwin); // (only for inputchange, removed, (ton))
-
+		
 		if (event==INPUTCHANGE) {
 			window_make_active(mainwin);
 			has_input= val;
@@ -1005,9 +1005,16 @@
 		}
 
 		towin= 0;
+
+		if (key_event_to_string(event)[0]) {
+			if (BPY_callbackKeyPress(event)==1) {
+				continue;
+			}
+		}
+		
 		if (event==WINCLOSE) {
 			exit_usiblender();
-		} 
+		}
 		else if (event==DRAWEDGES) {
 			dodrawscreen= 1;
 		}
Index: src/editview.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/editview.c,v
retrieving revision 1.21
diff -u -r1.21 editview.c
--- src/editview.c	22 Nov 2003 18:38:53 -0000	1.21
+++ src/editview.c	10 Jan 2004 11:50:50 -0000
@@ -549,8 +549,13 @@
 
 	getmouseco_areawin(mval);
 
-	if(G.obedit==0 && (G.qual & LR_CTRLKEY)) {
+	printf("mouse select\n");
 
+	BPY_callbackSelectionChange();
+	
+	if(G.obedit==0 && (G.qual & LR_CTRLKEY)) {
+		printf("if 1\n");
+		
 		base= startbase;
 		while(base) {
 			
@@ -576,10 +581,13 @@
 		
 	}
 	else {
+		printf("else if\n");
+		
 		hits= selectprojektie(buffer, mval[0]-7, mval[1]-7, mval[0]+7, mval[1]+7);
 		if(hits==0) hits= selectprojektie(buffer, mval[0]-21, mval[1]-21, mval[0]+21, mval[1]+21);
 
 		if(hits>0) {
+			printf("if hits>0\n");
 
 			base= startbase;
 			while(base) {
@@ -599,13 +607,17 @@
 	}
 	
 	if(basact) {
+		printf("if basct\n");
+		
 		if(G.obedit) {
+			printf("if G.objedit");
 			/* only do select */
 			deselectall_except(basact);
 			basact->flag |= SELECT;
 			draw_object_ext(basact);
 		}
 		else {
+			printf("else\n");
 			oldbasact= BASACT;
 			BASACT= basact;
 			
Index: src/interface.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/interface.c,v
retrieving revision 1.100
diff -u -r1.100 interface.c
--- src/interface.c	8 Jan 2004 19:53:18 -0000	1.100
+++ src/interface.c	10 Jan 2004 11:50:55 -0000
@@ -1035,6 +1035,8 @@
 	unsigned short event= 0;
 	short val;
 
+	printf("ui_do_but_KEYEVT");
+	
 		/* flag for ui_check_but */
 	ui_set_but_val(but, -1);
 	ui_check_but(but);
Index: src/view.c
===================================================================
RCS file: /cvsroot/bf-blender/blender/source/blender/src/view.c,v
retrieving revision 1.21
diff -u -r1.21 view.c
--- src/view.c	29 Dec 2003 16:52:51 -0000	1.21
+++ src/view.c	10 Jan 2004 11:50:56 -0000
@@ -1107,4 +1107,4 @@
 
 	v3d->view= 0;
 	if (v3d->persp>=2) v3d->persp= 0; /* switch out of camera mode */
-}
\ No newline at end of file
+}


More information about the Bf-python mailing list