[Bf-committers] [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21287] branches/blender2.5/blender/source /blender/python: slice support working in py3 for Vector and Matrix types.

Shaul Kedem shaul_kedem at yahoo.com
Wed Jul 1 20:07:48 CEST 2009


hi,
 This have broken support for python 2.6 in msvc 2008, please advise,

Thanks,
Shaul



----- Original Message ----
From: Campbell Barton <ideasman42 at gmail.com>
To: bf-blender-cvs at blender.org
Sent: Wednesday, July 1, 2009 9:31:37 AM
Subject: [Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21287] branches/blender2.5/blender/source /blender/python: slice support working in py3 for Vector and Matrix types.

Revision: 21287
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21287
Author:   campbellbarton
Date:     2009-07-01 15:31:36 +0200 (Wed, 01 Jul 2009)

Log Message:
-----------
slice support working in py3 for Vector and Matrix types.
Added slice to PyRNA collections and arrays (py3 only).

eg.
some_verts = mesh.verts[0:10]
some_rna_array[4:-1] = [0,1,2,3]

Collections dont support assignment, when assigning slices, resizing the array isnt support like with python lists.

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

Modified: branches/blender2.5/blender/source/blender/python/generic/matrix.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/generic/matrix.c    2009-07-01 13:24:03 UTC (rev 21286)
+++ branches/blender2.5/blender/source/blender/python/generic/matrix.c    2009-07-01 13:31:36 UTC (rev 21287)
@@ -760,8 +760,7 @@
}
/*----------------------------object[z:y]------------------------
   sequence slice (set)*/
-static int Matrix_ass_slice(MatrixObject * self, int begin, int end,
-                 PyObject * seq)
+static int Matrix_ass_slice(MatrixObject * self, int begin, int end, PyObject * seq)
{
    int i, x, y, size, sub_size = 0;
    float mat[16], f;
@@ -999,7 +998,84 @@
};


+
#if (PY_VERSION_HEX >= 0x03000000)
+static PyObject *Matrix_subscript(MatrixObject* self, PyObject* item)
+{
+    if (PyIndex_Check(item)) {
+        Py_ssize_t i;
+        i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+        if (i == -1 && PyErr_Occurred())
+            return NULL;
+        if (i < 0)
+            i += self->rowSize;
+        return Matrix_item(self, i);
+    } else if (PySlice_Check(item)) {
+        Py_ssize_t start, stop, step, slicelength;
+
+        if (PySlice_GetIndicesEx((PySliceObject*)item, self->rowSize, &start, &stop, &step, &slicelength) < 0)
+            return NULL;
+
+        if (slicelength <= 0) {
+            return PyList_New(0);
+        }
+        else if (step == 1) {
+            return Matrix_slice(self, start, stop);
+        }
+        else {
+            PyErr_SetString(PyExc_TypeError, "slice steps not supported with matricies");
+            return NULL;
+        }
+    }
+    else {
+        PyErr_Format(PyExc_TypeError,
+                 "vector indices must be integers, not %.200s",
+                 item->ob_type->tp_name);
+        return NULL;
+    }
+}
+
+static int Matrix_ass_subscript(MatrixObject* self, PyObject* item, PyObject* value)
+{
+    if (PyIndex_Check(item)) {
+        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+        if (i == -1 && PyErr_Occurred())
+            return -1;
+        if (i < 0)
+            i += self->rowSize;
+        return Matrix_ass_item(self, i, value);
+    }
+    else if (PySlice_Check(item)) {
+        Py_ssize_t start, stop, step, slicelength;
+
+        if (PySlice_GetIndicesEx((PySliceObject*)item, self->rowSize, &start, &stop, &step, &slicelength) < 0)
+            return -1;
+
+        if (step == 1)
+            return Matrix_ass_slice(self, start, stop, value);
+        else {
+            PyErr_SetString(PyExc_TypeError, "slice steps not supported with matricies");
+            return -1;
+        }
+    }
+    else {
+        PyErr_Format(PyExc_TypeError,
+                 "matrix indices must be integers, not %.200s",
+                 item->ob_type->tp_name);
+        return -1;
+    }
+}
+
+static PyMappingMethods Matrix_AsMapping = {
+    (lenfunc)Matrix_len,
+    (binaryfunc)Matrix_subscript,
+    (objobjargproc)Matrix_ass_subscript
+};
+#endif /*  (PY_VERSION_HEX >= 0x03000000) */
+
+
+
+#if (PY_VERSION_HEX >= 0x03000000)
static PyNumberMethods Matrix_NumMethods = {
        (binaryfunc)    Matrix_add,    /*nb_add*/
        (binaryfunc)    Matrix_sub,    /*nb_subtract*/
@@ -1106,7 +1182,7 @@
    (reprfunc) Matrix_repr,            /*tp_repr*/
    &Matrix_NumMethods,                /*tp_as_number*/
    &Matrix_SeqMethods,                /*tp_as_sequence*/
-    0,                                /*tp_as_mapping*/
+    &Matrix_AsMapping,                /*tp_as_mapping*/
    0,                                /*tp_hash*/
    0,                                /*tp_call*/
    0,                                /*tp_str*/

Modified: branches/blender2.5/blender/source/blender/python/generic/vector.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/generic/vector.c    2009-07-01 13:24:03 UTC (rev 21286)
+++ branches/blender2.5/blender/source/blender/python/generic/vector.c    2009-07-01 13:31:36 UTC (rev 21287)
@@ -1051,16 +1051,100 @@
        Py_RETURN_FALSE;
    }
}
+
/*-----------------PROTCOL DECLARATIONS--------------------------*/
static PySequenceMethods Vector_SeqMethods = {
    (inquiry) Vector_len,                        /* sq_length */
    (binaryfunc) 0,                                /* sq_concat */
-    (ssizeargfunc) 0,                                /* sq_repeat */
+    (ssizeargfunc) 0,                            /* sq_repeat */
    (ssizeargfunc) Vector_item,                    /* sq_item */
-    (ssizessizeargfunc) Vector_slice,                /* sq_slice */
+#if (PY_VERSION_HEX < 0x03000000)
+    (ssizessizeargfunc) Vector_slice,            /* sq_slice */ /* PY2 ONLY */
+#else
+    NULL,
+#endif
    (ssizeobjargproc) Vector_ass_item,            /* sq_ass_item */
-    (ssizessizeobjargproc) Vector_ass_slice,        /* sq_ass_slice */
+#if (PY_VERSION_HEX < 0x03000000)
+    (ssizessizeobjargproc) Vector_ass_slice,    /* sq_ass_slice */ /* PY2 ONLY */
+#else
+    NULL,
+#endif
};
+
+
+#if (PY_VERSION_HEX >= 0x03000000)
+static PyObject *Vector_subscript(VectorObject* self, PyObject* item)
+{
+    if (PyIndex_Check(item)) {
+        Py_ssize_t i;
+        i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+        if (i == -1 && PyErr_Occurred())
+            return NULL;
+        if (i < 0)
+            i += self->size;
+        return Vector_item(self, i);
+    } else if (PySlice_Check(item)) {
+        Py_ssize_t start, stop, step, slicelength;
+
+        if (PySlice_GetIndicesEx((PySliceObject*)item, self->size, &start, &stop, &step, &slicelength) < 0)
+            return NULL;
+
+        if (slicelength <= 0) {
+            return PyList_New(0);
+        }
+        else if (step == 1) {
+            return Vector_slice(self, start, stop);
+        }
+        else {
+            PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors");
+            return NULL;
+        }
+    }
+    else {
+        PyErr_Format(PyExc_TypeError,
+                 "vector indices must be integers, not %.200s",
+                 item->ob_type->tp_name);
+        return NULL;
+    }
+}
+
+static int Vector_ass_subscript(VectorObject* self, PyObject* item, PyObject* value)
+{
+    if (PyIndex_Check(item)) {
+        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
+        if (i == -1 && PyErr_Occurred())
+            return -1;
+        if (i < 0)
+            i += self->size;
+        return Vector_ass_item(self, i, value);
+    }
+    else if (PySlice_Check(item)) {
+        Py_ssize_t start, stop, step, slicelength;
+
+        if (PySlice_GetIndicesEx((PySliceObject*)item, self->size, &start, &stop, &step, &slicelength) < 0)
+            return -1;
+
+        if (step == 1)
+            return Vector_ass_slice(self, start, stop, value);
+        else {
+            PyErr_SetString(PyExc_TypeError, "slice steps not supported with vectors");
+            return -1;
+        }
+    }
+    else {
+        PyErr_Format(PyExc_TypeError,
+                 "vector indices must be integers, not %.200s",
+                 item->ob_type->tp_name);
+        return -1;
+    }
+}
+
+static PyMappingMethods Vector_AsMapping = {
+    (lenfunc)Vector_len,
+    (binaryfunc)Vector_subscript,
+    (objobjargproc)Vector_ass_subscript
+};
+#endif /*  (PY_VERSION_HEX >= 0x03000000) */
  
#if (PY_VERSION_HEX >= 0x03000000)
static PyNumberMethods Vector_NumMethods = {
@@ -1813,7 +1897,7 @@

    &Vector_NumMethods,                       /* PyNumberMethods *tp_as_number; */
    &Vector_SeqMethods,                       /* PySequenceMethods *tp_as_sequence; */
-    NULL,                       /* PyMappingMethods *tp_as_mapping; */
+    &Vector_AsMapping,                       /* PyMappingMethods *tp_as_mapping; */

    /* More standard operations (here for binary compatibility) */


Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c    2009-07-01 13:24:03 UTC (rev 21286)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c    2009-07-01 13:31:36 UTC (rev 21287)
@@ -35,6 +35,7 @@
#include "RNA_define.h" /* for defining our own rna */

#include "MEM_guardedalloc.h"
+#include "BKE_utildefines.h"
#include "BKE_context.h"
#include "BKE_global.h" /* evil G.* */
#include "BKE_report.h"
@@ -820,108 +821,246 @@
    return len;
}

-static PyObject *pyrna_prop_subscript( BPy_PropertyRNA * self, PyObject *key )
+/* internal use only */
+static PyObject *prop_subscript_collection_int(BPy_PropertyRNA * self, int keynum)
{
-    PyObject *ret;
    PointerRNA newptr;
-    int keynum = 0;
-    char *keyname = NULL;
-    
+
+    if(keynum < 0) keynum += RNA_property_collection_length(&self->ptr, self->prop);
+
+    if(RNA_property_collection_lookup_int(&self->ptr, self->prop, keynum, &newptr))
+        return pyrna_struct_CreatePyObject(&newptr);
+
+    PyErr_SetString(PyExc_IndexError, "out of range");
+    return NULL;
+}
+static PyObject *prop_subscript_array_int(BPy_PropertyRNA * self, int keynum)
+{
+    int len= RNA_property_array_length(self->prop);
+
+    if(keynum < 0) keynum += len;
+
+    if(keynum >= 0 && keynum < len)
+        return pyrna_prop_to_py_index(&self->ptr, self->prop, keynum);
+
+    PyErr_SetString(PyExc_IndexError, "out of range");
+    return NULL;
+}
+
+static PyObject *prop_subscript_collection_str(BPy_PropertyRNA * self, char *keyname)
+{
+    PointerRNA newptr;
+    if(RNA_property_collection_lookup_string(&self->ptr, self->prop, keyname, &newptr))
+        return pyrna_struct_CreatePyObject(&newptr);
+
+    PyErr_SetString(PyExc_KeyError, "key not found");
+    return NULL;
+}
+/* static PyObject *prop_subscript_array_str(BPy_PropertyRNA * self, char *keyname) */
+
+
+
+
+#if PY_VERSION_HEX >= 0x03000000
+static PyObject *prop_subscript_collection_slice(BPy_PropertyRNA * self, int start, int stop)
+{
+    PointerRNA newptr;
+    PyObject *list = PyList_New(stop - start);
+    int count;
+
+    start = MIN2(start,stop); /* values are clamped from  */
+
+    for(count = start; count < stop; count++) {
+        if(RNA_property_collection_lookup_int(&self->ptr, self->prop, count - start, &newptr)) {
+            PyList_SetItem(list, count - start, pyrna_struct_CreatePyObject(&newptr));
+        }
+        else {
+            Py_DECREF(list);
+
+            PyErr_SetString(PyExc_RuntimeError, "error getting an rna struct from a collection");
+            return NULL;
+        }
+    }
+
+    return list;
+}
+static PyObject *prop_subscript_array_slice(BPy_PropertyRNA * self, int start, int stop)
+{
+    PyObject *list = PyList_New(stop - start);
+    int count;
+
+    start = MIN2(start,stop); /* values are clamped from PySlice_GetIndicesEx */
+
+    for(count = start; count < stop; count++)
+        PyList_SetItem(list, count - start, pyrna_prop_to_py_index(&self->ptr, self->prop, count));
+
+    return list;
+}
+#endif
+
+static PyObject *prop_subscript_collection(BPy_PropertyRNA * self, PyObject *key)
+{
    if (PyUnicode_Check(key)) {
-        keyname = _PyUnicode_AsString(key);
-    } else if (PyLong_Check(key)) {
-        keynum = PyLong_AsSsize_t(key);
-    } else {
+        return prop_subscript_collection_str(self, _PyUnicode_AsString(key));
+    }
+    else if (PyLong_Check(key)) {
+        return prop_subscript_collection_int(self, PyLong_AsSsize_t(key));
+    }
+#if PY_VERSION_HEX >= 0x03000000
+    else if (PySlice_Check(key)) {
+        int len= RNA_property_collection_length(&self->ptr, self->prop);
+        Py_ssize_t start, stop, step, slicelength;
+

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs at blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs



      


More information about the Bf-committers mailing list