[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44324] trunk/blender/source/blender: add slice access to bmesh sequences.
Campbell Barton
ideasman42 at gmail.com
Wed Feb 22 13:55:08 CET 2012
Revision: 44324
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44324
Author: campbellbarton
Date: 2012-02-22 12:54:53 +0000 (Wed, 22 Feb 2012)
Log Message:
-----------
add slice access to bmesh sequences.
eg:
verts = bm.verts[1:-7]
Modified Paths:
--------------
trunk/blender/source/blender/editors/mesh/bmesh_tools.c
trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
Modified: trunk/blender/source/blender/editors/mesh/bmesh_tools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/bmesh_tools.c 2012-02-22 12:28:32 UTC (rev 44323)
+++ trunk/blender/source/blender/editors/mesh/bmesh_tools.c 2012-02-22 12:54:53 UTC (rev 44324)
@@ -1565,7 +1565,7 @@
/* doflip has to do with bmesh_rationalize_normals, it's an internal
* thing */
- if (!EDBM_CallOpf(em, op, "righthandfaces faces=%hf do_flip=%d", BM_ELEM_SELECT, TRUE))
+ if (!EDBM_CallOpf(em, op, "righthandfaces faces=%hf do_flip=%b", BM_ELEM_SELECT, TRUE))
return OPERATOR_CANCELLED;
if (RNA_boolean_get(op->ptr, "inside"))
Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types.c 2012-02-22 12:28:32 UTC (rev 44323)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types.c 2012-02-22 12:54:53 UTC (rev 44324)
@@ -1066,6 +1066,52 @@
return NULL;
}
+static PyObject *bpy_bm_seq_subscript_slice(BPy_BMElemSeq *self, Py_ssize_t start, Py_ssize_t stop)
+{
+ BMIter iter;
+ int count = 0;
+ int ok;
+
+ PyObject *list;
+ PyObject *item;
+ BMHeader *ele;
+
+ BPY_BM_CHECK_OBJ(self);
+
+ list = PyList_New(0);
+
+ ok = BM_iter_init(&iter, self->bm, self->itype, self->py_ele ? self->py_ele->ele : NULL);
+
+ BLI_assert(ok == TRUE);
+
+ if (UNLIKELY(ok == FALSE)) {
+ return list;
+ }
+
+ /* first loop up-until the start */
+ for (ok = TRUE; ok; ok = (BM_iter_step(&iter) != NULL)) {
+ /* PointerRNA itemptr = rna_macro_iter.ptr; */
+ if (count == start) {
+ break;
+ }
+ count++;
+ }
+
+ /* add items until stop */
+ while ((ele = BM_iter_step(&iter))) {
+ item = BPy_BMElem_CreatePyObject(self->bm, ele);
+ PyList_Append(list, item);
+ Py_DECREF(item);
+
+ count++;
+ if (count == stop) {
+ break;
+ }
+ }
+
+ return list;
+}
+
static PyObject *bpy_bm_seq_subscript(BPy_BMElemSeq *self, PyObject *key)
{
/* dont need error check here */
@@ -1075,7 +1121,42 @@
return NULL;
return bpy_bm_seq_subscript_int(self, i);
}
- /* TODO, slice */
+ else if (PySlice_Check(key)) {
+ PySliceObject *key_slice = (PySliceObject *)key;
+ Py_ssize_t step = 1;
+
+ if (key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
+ return NULL;
+ }
+ else if (step != 1) {
+ PyErr_SetString(PyExc_TypeError, "bpy_prop_collection[slice]: slice steps not supported");
+ return NULL;
+ }
+ else if (key_slice->start == Py_None && key_slice->stop == Py_None) {
+ return bpy_bm_seq_subscript_slice(self, 0, PY_SSIZE_T_MAX);
+ }
+ else {
+ Py_ssize_t start = 0, stop = PY_SSIZE_T_MAX;
+
+ /* avoid PySlice_GetIndicesEx because it needs to know the length ahead of time. */
+ if (key_slice->start != Py_None && !_PyEval_SliceIndex(key_slice->start, &start)) return NULL;
+ if (key_slice->stop != Py_None && !_PyEval_SliceIndex(key_slice->stop, &stop)) return NULL;
+
+ if (start < 0 || stop < 0) {
+ /* only get the length for negative values */
+ Py_ssize_t len = bpy_bm_seq_length(self);
+ if (start < 0) start += len;
+ if (stop < 0) start += len;
+ }
+
+ if (stop - start <= 0) {
+ return PyList_New(0);
+ }
+ else {
+ return bpy_bm_seq_subscript_slice(self, start, stop);
+ }
+ }
+ }
else {
PyErr_SetString(PyExc_AttributeError, "BMElemSeq[key]: invalid key, key must be an int");
return NULL;
More information about the Bf-blender-cvs
mailing list