[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19832] trunk/blender/source/blender/ python/api2_2x: Blender Python API

Campbell Barton ideasman42 at gmail.com
Tue Apr 21 09:16:30 CEST 2009


Revision: 19832
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19832
Author:   campbellbarton
Date:     2009-04-21 09:16:29 +0200 (Tue, 21 Apr 2009)

Log Message:
-----------
Blender Python API

use getseter's for quat and euler types attributes, python3 compatible module initialization for Mathutils and BGL.

Modified Paths:
--------------
    trunk/blender/source/blender/python/api2_2x/BGL.c
    trunk/blender/source/blender/python/api2_2x/Mathutils.c
    trunk/blender/source/blender/python/api2_2x/euler.c
    trunk/blender/source/blender/python/api2_2x/quat.c
    trunk/blender/source/blender/python/api2_2x/vector.c
    trunk/blender/source/blender/python/api2_2x/vector.h

Modified: trunk/blender/source/blender/python/api2_2x/BGL.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/BGL.c	2009-04-21 05:20:30 UTC (rev 19831)
+++ trunk/blender/source/blender/python/api2_2x/BGL.c	2009-04-21 07:16:29 UTC (rev 19832)
@@ -1085,9 +1085,29 @@
 	{NULL, NULL, 0, NULL}
 };
 
+#if (PY_VERSION_HEX >= 0x03000000)
+static struct PyModuleDef BGL_module_def = {
+	{}, /* m_base */
+	"BGL",  /* m_name */
+	0,  /* m_doc */
+	0,  /* m_size */
+	BGL_methods,  /* m_methods */
+	0,  /* m_reload */
+	0,  /* m_traverse */
+	0,  /* m_clear */
+	0,  /* m_free */
+};
+#endif
+
 PyObject *BGL_Init(const char *from) 
 {
-	PyObject *mod= Py_InitModule(from, BGL_methods);
+	PyObject *mod;
+#if (PY_VERSION_HEX >= 0x03000000)
+	mod = PyModule_Create(&BGL_module_def);
+#else
+	mod= Py_InitModule(from, BGL_methods);
+#endif
+	
 	PyObject *dict= PyModule_GetDict(mod);
 	PyObject *item;
 	if( PyType_Ready( &buffer_Type) < 0)

Modified: trunk/blender/source/blender/python/api2_2x/Mathutils.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/Mathutils.c	2009-04-21 05:20:30 UTC (rev 19831)
+++ trunk/blender/source/blender/python/api2_2x/Mathutils.c	2009-04-21 07:16:29 UTC (rev 19832)
@@ -108,6 +108,21 @@
 };
 /*----------------------------MODULE INIT-------------------------*/
 /* from can be Blender.Mathutils or GameLogic.Mathutils for the BGE */
+
+#if (PY_VERSION_HEX >= 0x03000000)
+static struct PyModuleDef M_Mathutils_module_def = {
+	{}, /* m_base */
+	"Mathutils",  /* m_name */
+	M_Mathutils_doc,  /* m_doc */
+	0,  /* m_size */
+	M_Mathutils_methods,  /* m_methods */
+	0,  /* m_reload */
+	0,  /* m_traverse */
+	0,  /* m_clear */
+	0,  /* m_free */
+};
+#endif
+
 PyObject *Mathutils_Init(const char *from)
 {
 	PyObject *submodule;
@@ -126,7 +141,12 @@
 	if( PyType_Ready( &quaternion_Type ) < 0 )
 		return NULL;
 	
+#if (PY_VERSION_HEX >= 0x03000000)
+	submodule = PyModule_Create(&M_Mathutils_module_def);
+#else
 	submodule = Py_InitModule3(from, M_Mathutils_methods, M_Mathutils_doc);
+#endif
+	
 	return (submodule);
 }
 //-----------------------------METHODS----------------------------

Modified: trunk/blender/source/blender/python/api2_2x/euler.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/euler.c	2009-04-21 05:20:30 UTC (rev 19831)
+++ trunk/blender/source/blender/python/api2_2x/euler.c	2009-04-21 07:16:29 UTC (rev 19832)
@@ -189,71 +189,13 @@
 	}
 	PyObject_DEL(self);
 }
-//----------------------------getattr()(internal) ------------------
-//object.attribute access (get)
-static PyObject *Euler_getattr(EulerObject * self, char *name)
-{
-	if(STREQ(name,"x")){
-		return PyFloat_FromDouble(self->eul[0]);
-	}else if(STREQ(name, "y")){
-		return PyFloat_FromDouble(self->eul[1]);
-	}else if(STREQ(name, "z")){
-		return PyFloat_FromDouble(self->eul[2]);
-	}
-	if(STREQ(name, "wrapped")){
-		if(self->wrapped == Py_WRAP)
-			return EXPP_incr_ret((PyObject *)Py_True);
-		else 
-			return EXPP_incr_ret((PyObject *)Py_False);
-	}
-	return Py_FindMethod(Euler_methods, (PyObject *) self, name);
-}
-//----------------------------setattr()(internal) ------------------
-//object.attribute access (set)
-static int Euler_setattr(EulerObject * self, char *name, PyObject * e)
-{
-	PyObject *f = NULL;
 
-	f = PyNumber_Float(e);
-	if(f == NULL) { // parsed item not a number
-		return EXPP_ReturnIntError(PyExc_TypeError, 
-			"euler.attribute = x: argument not a number\n");
-	}
-
-	if(STREQ(name,"x")){
-		self->eul[0] = (float)PyFloat_AS_DOUBLE(f);
-	}else if(STREQ(name, "y")){
-		self->eul[1] = (float)PyFloat_AS_DOUBLE(f);
-	}else if(STREQ(name, "z")){
-		self->eul[2] = (float)PyFloat_AS_DOUBLE(f);
-	}else{
-		Py_DECREF(f);
-		return EXPP_ReturnIntError(PyExc_AttributeError,
-				"euler.attribute = x: unknown attribute\n");
-	}
-
-	Py_DECREF(f);
-	return 0;
-}
 //----------------------------print object (internal)--------------
 //print the object to screen
 static PyObject *Euler_repr(EulerObject * self)
 {
-	int i;
-	char buffer[48], str[1024];
-
-	BLI_strncpy(str,"[",1024);
-	for(i = 0; i < 3; i++){
-		if(i < (2)){
-			sprintf(buffer, "%.6f, ", self->eul[i]);
-			strcat(str,buffer);
-		}else{
-			sprintf(buffer, "%.6f", self->eul[i]);
-			strcat(str,buffer);
-		}
-	}
-	strcat(str, "](euler)");
-
+	char str[64];
+	sprintf(str, "[%.6f, %.6f, %.6f](euler)", self->eul[0], self->eul[1], self->eul[2]);
 	return PyString_FromString(str);
 }
 //------------------------tp_richcmpr
@@ -409,6 +351,83 @@
 	(intobjargproc) Euler_ass_item,				/* sq_ass_item */
 	(intintobjargproc) Euler_ass_slice,			/* sq_ass_slice */
 };
+
+
+
+/*
+ * vector axis, vector.x/y/z/w
+ */
+	
+static PyObject *Euler_getAxis( EulerObject * self, void *type )
+{
+	switch( (long)type ) {
+    case 'X':	/* these are backwards, but that how it works */
+		return PyFloat_FromDouble(self->eul[0]);
+    case 'Y':
+		return PyFloat_FromDouble(self->eul[1]);
+    case 'Z':
+		return PyFloat_FromDouble(self->eul[2]);
+	}
+	
+	PyErr_SetString(PyExc_SystemError, "corrupt euler, cannot get axis");
+	return NULL;
+}
+
+static int Euler_setAxis( EulerObject * self, PyObject * value, void * type )
+{
+	float param= (float)PyFloat_AsDouble( value );
+	
+	if (param==-1 && PyErr_Occurred())
+		return EXPP_ReturnIntError( PyExc_TypeError,
+			"expected a number for the vector axis" );
+	
+	switch( (long)type ) {
+    case 'X':	/* these are backwards, but that how it works */
+		self->eul[0]= param;
+		break;
+    case 'Y':
+		self->eul[1]= param;
+		break;
+    case 'Z':
+		self->eul[2]= param;
+		break;
+	}
+
+	return 0;
+}
+
+static PyObject *Euler_getWrapped( VectorObject * self, void *type )
+{
+	if (self->wrapped == Py_WRAP)
+		Py_RETURN_TRUE;
+	else
+		Py_RETURN_FALSE;
+}
+
+
+/*****************************************************************************/
+/* Python attributes get/set structure:                                      */
+/*****************************************************************************/
+static PyGetSetDef Euler_getseters[] = {
+	{"x",
+	 (getter)Euler_getAxis, (setter)Euler_setAxis,
+	 "Euler X axis",
+	 (void *)'X'},
+	{"y",
+	 (getter)Euler_getAxis, (setter)Euler_setAxis,
+	 "Euler Y axis",
+	 (void *)'Y'},
+	{"z",
+	 (getter)Euler_getAxis, (setter)Euler_setAxis,
+	 "Euler Z axis",
+	 (void *)'Z'},
+	{"wrapped",
+	 (getter)Euler_getWrapped, (setter)NULL,
+	 "True when this wraps blenders internal data",
+	 NULL},
+	{NULL,NULL,NULL,NULL,NULL}  /* Sentinel */
+};
+
 //------------------PY_OBECT DEFINITION--------------------------
 PyTypeObject euler_Type = {
 	PyObject_HEAD_INIT(NULL)		//tp_head
@@ -418,8 +437,8 @@
 	0,								//tp_itemsize
 	(destructor)Euler_dealloc,		//tp_dealloc
 	0,								//tp_print
-	(getattrfunc)Euler_getattr,	//tp_getattr
-	(setattrfunc) Euler_setattr,	//tp_setattr
+	0,								//tp_getattr
+	0,								//tp_setattr
 	0,								//tp_compare
 	(reprfunc) Euler_repr,			//tp_repr
 	0,				//tp_as_number
@@ -439,9 +458,9 @@
 	0,								//tp_weaklistoffset
 	0,								//tp_iter
 	0,								//tp_iternext
-	0,								//tp_methods
+	Euler_methods,					//tp_methods
 	0,								//tp_members
-	0,								//tp_getset
+	Euler_getseters,				//tp_getset
 	0,								//tp_base
 	0,								//tp_dict
 	0,								//tp_descr_get

Modified: trunk/blender/source/blender/python/api2_2x/quat.c
===================================================================
--- trunk/blender/source/blender/python/api2_2x/quat.c	2009-04-21 05:20:30 UTC (rev 19831)
+++ trunk/blender/source/blender/python/api2_2x/quat.c	2009-04-21 07:16:29 UTC (rev 19832)
@@ -155,109 +155,13 @@
 	}
 	PyObject_DEL(self);
 }
-//----------------------------getattr()(internal) ------------------
-//object.attribute access (get)
-static PyObject *Quaternion_getattr(QuaternionObject * self, char *name)
-{
-	int x;
-	double mag = 0.0f;
-	float vec[3];
 
-	if(STREQ(name,"w")){
-		return PyFloat_FromDouble(self->quat[0]);
-	}else if(STREQ(name, "x")){
-		return PyFloat_FromDouble(self->quat[1]);
-	}else if(STREQ(name, "y")){
-		return PyFloat_FromDouble(self->quat[2]);
-	}else if(STREQ(name, "z")){
-		return PyFloat_FromDouble(self->quat[3]);
-	}
-	if(STREQ(name, "magnitude")) {
-		for(x = 0; x < 4; x++) {
-			mag += self->quat[x] * self->quat[x];
-		}
-		mag = sqrt(mag);
-		return PyFloat_FromDouble(mag);
-	}
-	if(STREQ(name, "angle")) {
-		mag = self->quat[0];
-		mag = 2 * (saacos(mag));
-		mag *= (180 / Py_PI);
-		return PyFloat_FromDouble(mag);
-	}
-	if(STREQ(name, "axis")) {
-		mag = self->quat[0] * (Py_PI / 180);
-		mag = 2 * (saacos(mag));
-		mag = sin(mag / 2);
-		for(x = 0; x < 3; x++) {
-			vec[x] = (float)(self->quat[x + 1] / mag);
-		}
-		Normalize(vec);
-		//If the axis of rotation is 0,0,0 set it to 1,0,0 - for zero-degree rotations
-		if( EXPP_FloatsAreEqual(vec[0], 0.0f, 10) &&
-			EXPP_FloatsAreEqual(vec[1], 0.0f, 10) &&
-			EXPP_FloatsAreEqual(vec[2], 0.0f, 10) ){
-			vec[0] = 1.0f;
-		}
-		return (PyObject *) newVectorObject(vec, 3, Py_NEW);
-	}
-	if(STREQ(name, "wrapped")){
-		if(self->wrapped == Py_WRAP)
-			return EXPP_incr_ret((PyObject *)Py_True);
-		else 
-			return EXPP_incr_ret((PyObject *)Py_False);
-	}
-
-	return Py_FindMethod(Quaternion_methods, (PyObject *) self, name);
-}
-//----------------------------setattr()(internal) ------------------
-//object.attribute access (set)
-static int Quaternion_setattr(QuaternionObject * self, char *name, PyObject * q)
-{
-	PyObject *f = NULL;
-
-	f = PyNumber_Float(q);
-	if(f == NULL) { // parsed item not a number
-		return EXPP_ReturnIntError(PyExc_TypeError, 
-			"quaternion.attribute = x: argument not a number\n");
-	}
-
-	if(STREQ(name,"w")){
-		self->quat[0] = (float)PyFloat_AS_DOUBLE(f);
-	}else if(STREQ(name, "x")){
-		self->quat[1] = (float)PyFloat_AS_DOUBLE(f);
-	}else if(STREQ(name, "y")){
-		self->quat[2] = (float)PyFloat_AS_DOUBLE(f);
-	}else if(STREQ(name, "z")){
-		self->quat[3] = (float)PyFloat_AS_DOUBLE(f);
-	}else{
-		Py_DECREF(f);
-		return EXPP_ReturnIntError(PyExc_AttributeError,
-				"quaternion.attribute = x: unknown attribute\n");
-	}
-
-	Py_DECREF(f);
-	return 0;
-}
 //----------------------------print object (internal)--------------
 //print the object to screen
 static PyObject *Quaternion_repr(QuaternionObject * self)
 {
-	int i;
-	char buffer[48], str[1024];
-
-	BLI_strncpy(str,"[",1024);
-	for(i = 0; i < 4; i++){
-		if(i < (3)){
-			sprintf(buffer, "%.6f, ", self->quat[i]);

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list