[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.

Campbell Barton ideasman42 at gmail.com
Fri Jul 3 02:32:35 CEST 2009


This should be fixed in r21293, what error are you getting?

On Wed, Jul 1, 2009 at 11:07 AM, Shaul Kedem<shaul_kedem at yahoo.com> wrote:
>
> 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
>
>
>
>
> _______________________________________________
> Bf-committers mailing list
> Bf-committers at blender.org
> http://lists.blender.org/mailman/listinfo/bf-committers
>



-- 
- Campbell


More information about the Bf-committers mailing list