[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21111] branches/blender2.5/blender/source /blender/python/intern/bpy_rna.c: modified patch from Arystanbek, allow assigning of mathutils matrix to an rna matrix

Campbell Barton ideasman42 at gmail.com
Tue Jun 23 19:10:46 CEST 2009


Revision: 21111
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21111
Author:   campbellbarton
Date:     2009-06-23 19:10:46 +0200 (Tue, 23 Jun 2009)

Log Message:
-----------
modified patch from Arystanbek, allow assigning of mathutils matrix to an rna matrix

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-06-23 17:06:46 UTC (rev 21110)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c	2009-06-23 17:10:46 UTC (rev 21111)
@@ -410,14 +410,29 @@
 	
 	if (len > 0) {
 		PyObject *item;
+		int py_len = -1;
 		int i;
 		
-		if (!PySequence_Check(value)) {
+
+#ifdef USE_MATHUTILS
+		if(MatrixObject_Check(value)) {
+			MatrixObject *mat = (MatrixObject*)value;
+			if(!Matrix_ReadCallback(mat))
+				return -1;
+
+			py_len = mat->rowSize * mat->colSize;
+		} else // continue...
+#endif
+		if (PySequence_Check(value)) {
+			py_len= (int)PySequence_Length(value);
+		}
+		else {
 			PyErr_SetString(PyExc_TypeError, "expected a python sequence type assigned to an RNA array.");
 			return -1;
 		}
+		/* done getting the length */
 		
-		if ((int)PySequence_Length(value) != len) {
+		if (py_len != len) {
 			PyErr_SetString(PyExc_AttributeError, "python sequence length did not match the RNA array.");
 			return -1;
 		}
@@ -484,14 +499,21 @@
 			else		param_arr = MEM_mallocN(sizeof(float) * len, "pyrna float array");
 
 
-			
-			/* collect the variables */
-			for (i=0; i<len; i++) {
-				item = PySequence_GetItem(value, i);
-				param_arr[i] = (float)PyFloat_AsDouble(item); /* deal with any errors later */
-				Py_DECREF(item);
+#ifdef USE_MATHUTILS
+			if(MatrixObject_Check(value) && RNA_property_subtype(prop) == PROP_MATRIX) {
+				MatrixObject *mat = (MatrixObject*)value;
+				memcpy(param_arr, mat->contigPtr, sizeof(float) * len);
+			} else // continue...
+#endif
+			{
+				/* collect the variables */
+				for (i=0; i<len; i++) {
+					item = PySequence_GetItem(value, i);
+					param_arr[i] = (float)PyFloat_AsDouble(item); /* deal with any errors later */
+					Py_DECREF(item);
+				}
 			}
-			
+
 			if (PyErr_Occurred()) {
 				if(data==NULL)
 					MEM_freeN(param_arr);





More information about the Bf-blender-cvs mailing list