[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