[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [13616] branches/pynodes/source/blender/ python/api2_2x/Node.c: == Pynodes ==

Willian Padovani Germano wpgermano at gmail.com
Sat Feb 9 20:05:17 CET 2008


Revision: 13616
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=13616
Author:   ianwill
Date:     2008-02-09 20:05:15 +0100 (Sat, 09 Feb 2008)

Log Message:
-----------
== Pynodes ==

More updates to the scripting side: support for int indexes when accessing input and output socket lists.

Modified Paths:
--------------
    branches/pynodes/source/blender/python/api2_2x/Node.c

Modified: branches/pynodes/source/blender/python/api2_2x/Node.c
===================================================================
--- branches/pynodes/source/blender/python/api2_2x/Node.c	2008-02-09 19:00:12 UTC (rev 13615)
+++ branches/pynodes/source/blender/python/api2_2x/Node.c	2008-02-09 19:05:15 UTC (rev 13616)
@@ -61,7 +61,7 @@
 	PyObject *item, *arg;
 	bNodeSocketType *newsocks = NULL;
 	char *s_name = NULL;
-	int s_type = 0;
+	int s_type = SOCK_VALUE;
 	float s_val[4], s_min, s_max;
 
 	if (BTST2(stage, NODE_DYNAMIC_READY, NODE_DYNAMIC_ADDEXIST))
@@ -74,8 +74,9 @@
 	for (pos = 0, a = 0; pos< len; pos++, a++) {
 		/* default socket values: */
 		s_name = NULL;
+		s_type = SOCK_VALUE;
 		s_min = 0.0f;
-		s_max = 0.0f;
+		s_max = 1.0f;
 		s_val[0] = s_val[1] = s_val[2] = s_val[3] = 1.0f;
 
 		item = PyTuple_GetItem(tuple, pos);
@@ -362,38 +363,41 @@
 	return -1;
 }
 
-PyObject *sockinmap_subscript(BPy_SockMap *self, PyObject *idx) {
-	int _idx;
+PyObject *sockinmap_subscript(BPy_SockMap *self, PyObject *pyidx) {
+	int idx;
 
-	if (!self->node) Py_RETURN_NONE;
+	if (!self->node)
+		return EXPP_ReturnPyObjError(PyExc_RuntimeError, "no access to Blender node data!");
 
-	if (PyString_Check(idx)) {
-		_idx = sockinmap_has_key(self, idx);
+	if (PyString_Check(pyidx)) {
+		idx = sockinmap_has_key(self, pyidx);
 	}
-	else if(PyInt_Check(idx)) {
-		return EXPP_ReturnPyObjError(PyExc_ValueError, "int index not implemented");
+	else if(PyInt_Check(pyidx)) {
+		int len = sockinmap_len(self);
+		idx = (int)PyInt_AsLong(pyidx);
+		if (idx < 0 || idx >= len)
+			return EXPP_ReturnPyObjError(PyExc_IndexError, "index out of range");
 	}
-	else if (PySlice_Check(idx)) {
+	else if (PySlice_Check(pyidx)) {
 		return EXPP_ReturnPyObjError(PyExc_ValueError, "slices not implemented");
 	} else {
 		return EXPP_ReturnPyObjError(PyExc_IndexError, "index must be an int or a string");
 	}
 
-	if(_idx<0) {
-		PyErr_SetString(PyExc_ValueError, "no such socket");
-		Py_RETURN_NONE;
+	if(idx<0) { /* we're not as nice as Python */
+		return EXPP_ReturnPyObjError(PyExc_IndexError, "invalid socket index");
 	}
 	
-	switch(self->node->typeinfo->inputs[_idx].type) {
+	switch(self->node->typeinfo->inputs[idx].type) {
 		case SOCK_VALUE:
-			return Py_BuildValue("f", self->stack[_idx]->vec[0]);
+			return Py_BuildValue("f", self->stack[idx]->vec[0]);
 			break;
 		case SOCK_VECTOR:
-			return Py_BuildValue("(fff)", self->stack[_idx]->vec[0], self->stack[_idx]->vec[1], self->stack[_idx]->vec[2]);
+			return Py_BuildValue("(fff)", self->stack[idx]->vec[0], self->stack[idx]->vec[1], self->stack[idx]->vec[2]);
 			break;
 		case SOCK_RGBA:
 			/* otherwise RGBA tuple */
-			return Py_BuildValue("(ffff)", self->stack[_idx]->vec[0], self->stack[_idx]->vec[1], self->stack[_idx]->vec[2], self->stack[_idx]->vec[3]);
+			return Py_BuildValue("(ffff)", self->stack[idx]->vec[0], self->stack[idx]->vec[1], self->stack[idx]->vec[2], self->stack[idx]->vec[3]);
 			break;
 		default:
 			break;
@@ -529,20 +533,23 @@
 	return -1;
 }
 
-static int sockoutmap_assign_subscript(BPy_SockMap *self, PyObject *idx, PyObject *value) {
-	int i, _idx, len, wanted_len, ret = -1;
+static int sockoutmap_assign_subscript(BPy_SockMap *self, PyObject *pyidx, PyObject *value) {
+	int i, idx, len, wanted_len = 0, ret = -1;
 	PyObject *val;
 	PyObject **items;
 
-	if (!self->node) return -1;
+	if (!self->node)
+		return EXPP_ReturnIntError(PyExc_RuntimeError, "no access to Blender node data!");
 
-	if (PyInt_Check(idx)) {
-		_idx = (int)PyInt_AsLong(idx);
+	if (PyInt_Check(pyidx)) {
+		idx = (int)PyInt_AsLong(pyidx);
+		if (idx < 0 || idx >= sockinmap_len(self))
+			return EXPP_ReturnIntError(PyExc_IndexError, "index out of range");
 	}
-	else if (PyString_Check(idx)) {
-		_idx = sockoutmap_has_key(self, idx);
+	else if (PyString_Check(pyidx)) {
+		idx = sockoutmap_has_key(self, pyidx);
 	}
-	else if (PySlice_Check(idx)) {
+	else if (PySlice_Check(pyidx)) {
 		return EXPP_ReturnIntError(PyExc_ValueError, "slices not yet implemented");
 	} else {
 		return EXPP_ReturnIntError(PyExc_IndexError, "index must be a positive int or a string");
@@ -570,30 +577,30 @@
 		}
 	}
 
-	switch(self->node->typeinfo->outputs[_idx].type) {
+	switch(self->node->typeinfo->outputs[idx].type) {
 		case SOCK_VALUE:
 			wanted_len = 1;
 			if (len == 1) {
-				self->stack[_idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
+				self->stack[idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
 				ret = 0;
 			}
 			break;
 		case SOCK_VECTOR:
 			wanted_len = 3;
 			if (len == 3) {
-				self->stack[_idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
-				self->stack[_idx]->vec[1] = (float)PyFloat_AsDouble(items[1]);
-				self->stack[_idx]->vec[2] = (float)PyFloat_AsDouble(items[2]);
+				self->stack[idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
+				self->stack[idx]->vec[1] = (float)PyFloat_AsDouble(items[1]);
+				self->stack[idx]->vec[2] = (float)PyFloat_AsDouble(items[2]);
 				ret = 0;
 			}
 			break;
 		case SOCK_RGBA:
 			wanted_len = 4;
 			if (len == 4) {
-				self->stack[_idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
-				self->stack[_idx]->vec[1] = (float)PyFloat_AsDouble(items[1]);
-				self->stack[_idx]->vec[2] = (float)PyFloat_AsDouble(items[2]);
-				self->stack[_idx]->vec[3] = (float)PyFloat_AsDouble(items[3]);
+				self->stack[idx]->vec[0] = (float)PyFloat_AsDouble(items[0]);
+				self->stack[idx]->vec[1] = (float)PyFloat_AsDouble(items[1]);
+				self->stack[idx]->vec[2] = (float)PyFloat_AsDouble(items[2]);
+				self->stack[idx]->vec[3] = (float)PyFloat_AsDouble(items[3]);
 				ret = 0;
 			}
 			break;





More information about the Bf-blender-cvs mailing list