Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2012-02-22 14:41:07 +0400
committerCampbell Barton <ideasman42@gmail.com>2012-02-22 14:41:07 +0400
commite0a6d273d015d1196661da010b676acdf5d4baf5 (patch)
tree1cccaf4f7f4d733620223dc14b626eba1a8d3c8b /source
parente7d98179eabcb44d8042d85b3be55f604833a088 (diff)
bmesh py api - generalize bmesg sequences to use the iterator type and optionally another bmesh element.
This allows BMFace.verts to be added without defining a new sequence type.
Diffstat (limited to 'source')
-rw-r--r--source/blender/python/bmesh/bmesh_py_api.c2
-rw-r--r--source/blender/python/bmesh/bmesh_py_types.c460
-rw-r--r--source/blender/python/bmesh/bmesh_py_types.h30
-rw-r--r--source/blender/python/intern/bpy_interface.c2
4 files changed, 183 insertions, 311 deletions
diff --git a/source/blender/python/bmesh/bmesh_py_api.c b/source/blender/python/bmesh/bmesh_py_api.c
index 8534bbefd3b..ec3c5927457 100644
--- a/source/blender/python/bmesh/bmesh_py_api.c
+++ b/source/blender/python/bmesh/bmesh_py_api.c
@@ -75,7 +75,7 @@ PyDoc_STRVAR(BPy_BM_doc,
);
static struct PyModuleDef BPy_BM_module_def = {
PyModuleDef_HEAD_INIT,
- "bme", /* m_name */
+ "bmesh", /* m_name */
BPy_BM_doc, /* m_doc */
0, /* m_size */
BPy_BM_methods, /* m_methods */
diff --git a/source/blender/python/bmesh/bmesh_py_types.c b/source/blender/python/bmesh/bmesh_py_types.c
index 55c5827cb44..43f1516bac9 100644
--- a/source/blender/python/bmesh/bmesh_py_types.c
+++ b/source/blender/python/bmesh/bmesh_py_types.c
@@ -163,31 +163,16 @@ static int bpy_bm_elem_index_set(BPy_BMElem *self, PyObject *value, void *UNUSED
/* Mesh
* ^^^^ */
-PyDoc_STRVAR(bpy_bmesh_verts_doc,
-"The :class:`bme.types.BMVertSeq` object this mesh"
-);
-static PyObject *bpy_bmesh_verts_get(BPy_BMesh *self)
-{
- BPY_BM_CHECK_OBJ(self);
- return BPy_BMVertSeq_CreatePyObject(self->bm);
-}
-
-PyDoc_STRVAR(bpy_bmesh_edges_doc,
-"The :class:`bme.types.BMEdgeSeq` object this mesh"
-);
-static PyObject *bpy_bmesh_edges_get(BPy_BMesh *self)
+static PyObject *bpy_bmesh_seq_get(BPy_BMesh *self, void *itype)
{
BPY_BM_CHECK_OBJ(self);
- return BPy_BMEdgeSeq_CreatePyObject(self->bm);
+ return BPy_BMElemSeq_CreatePyObject(self->bm, NULL, GET_INT_FROM_POINTER(itype));
}
-PyDoc_STRVAR(bpy_bmesh_faces_doc,
-"The :class:`bme.types.BMFaceSeq` object this mesh"
-);
-static PyObject *bpy_bmesh_faces_get(BPy_BMesh *self)
+static PyObject *bpy_bmesh_seq_elem_get(BPy_BMElem *self, void *itype)
{
BPY_BM_CHECK_OBJ(self);
- return BPy_BMFaceSeq_CreatePyObject(self->bm);
+ return BPy_BMElemSeq_CreatePyObject(self->bm, self, GET_INT_FROM_POINTER(itype));
}
PyDoc_STRVAR(bpy_bmesh_select_mode_doc,
@@ -289,9 +274,9 @@ static int bpy_bmface_normal_set(BPy_BMFace *self, PyObject *value)
}
static PyGetSetDef bpy_bmesh_getseters[] = {
- {(char *)"verts", (getter)bpy_bmesh_verts_get, (setter)NULL, (char *)bpy_bmesh_verts_doc, NULL},
- {(char *)"edges", (getter)bpy_bmesh_edges_get, (setter)NULL, (char *)bpy_bmesh_edges_doc, NULL},
- {(char *)"faces", (getter)bpy_bmesh_faces_get, (setter)NULL, (char *)bpy_bmesh_faces_doc, NULL},
+ {(char *)"verts", (getter)bpy_bmesh_seq_get, (setter)NULL, NULL, (void *)BM_VERTS_OF_MESH},
+ {(char *)"edges", (getter)bpy_bmesh_seq_get, (setter)NULL, NULL, (void *)BM_EDGES_OF_MESH},
+ {(char *)"faces", (getter)bpy_bmesh_seq_get, (setter)NULL, NULL, (void *)BM_FACES_OF_MESH},
{(char *)"select_mode", (getter)bpy_bmesh_select_mode_get, (setter)bpy_bmesh_select_mode_set, (char *)bpy_bmesh_select_mode_doc, NULL},
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
@@ -332,6 +317,8 @@ static PyGetSetDef bpy_bmface_getseters[] = {
{(char *)"normal", (getter)bpy_bmface_normal_get, (setter)bpy_bmface_normal_set, (char *)bpy_bmface_normal_doc, NULL},
+ {(char *)"verts", (getter)bpy_bmesh_seq_elem_get, (setter)NULL, NULL, (void *)BM_VERTS_OF_FACE},
+
{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
};
@@ -548,12 +535,7 @@ static PyObject *bpy_bm_elem_copy_from(BPy_BMElem *self, BPy_BMElem *value)
/* Vert Seq
* -------- */
-PyDoc_STRVAR(bpy_bmvert_seq_new_doc,
-".. method:: new()\n"
-"\n"
-" Create a new vertex.\n"
-);
-static PyObject *bpy_bmvert_seq_new(BPy_BMGeneric *self, PyObject *args)
+static PyObject *bpy_bmvert_seq_new(BPy_BMElemSeq *self, PyObject *args)
{
PyObject *py_co = NULL;
@@ -586,12 +568,7 @@ static PyObject *bpy_bmvert_seq_new(BPy_BMGeneric *self, PyObject *args)
/* Edge Seq
* -------- */
-PyDoc_STRVAR(bpy_bmedge_seq_new_doc,
-".. method:: new()\n"
-"\n"
-" Create a new edge.\n"
-);
-static PyObject *bpy_bmedge_seq_new(BPy_BMGeneric *self, PyObject *args)
+static PyObject *bpy_bmedge_seq_new(BPy_BMElemSeq *self, PyObject *args)
{
BPy_BMVert *v1;
BPy_BMVert *v2;
@@ -635,15 +612,10 @@ static PyObject *bpy_bmedge_seq_new(BPy_BMGeneric *self, PyObject *args)
}
}
-/* Edge Seq
+/* Face Seq
* -------- */
-PyDoc_STRVAR(bpy_bmface_seq_new_doc,
-".. method:: new()\n"
-"\n"
-" Create a new face.\n"
-);
-static PyObject *bpy_bmface_seq_new(BPy_BMGeneric *self, PyObject *args)
+static PyObject *bpy_bmface_seq_new(BPy_BMElemSeq *self, PyObject *args)
{
PyObject *vert_seq;
@@ -748,7 +720,26 @@ cleanup:
}
}
+PyDoc_STRVAR(bpy_bm_seq_new_doc,
+".. method:: new()\n"
+"\n"
+" Create a new vert/edge/face.\n"
+);
+static PyObject *bpy_bm_seq_new(BPy_BMElemSeq *self, PyObject *args)
+{
+ switch (self->itype) {
+ case BM_VERTS_OF_MESH:
+ return bpy_bmvert_seq_new(self, args);
+ case BM_EDGES_OF_MESH:
+ return bpy_bmedge_seq_new(self, args);
+ case BM_FACES_OF_MESH:
+ return bpy_bmface_seq_new(self, args);
+ }
+ PyErr_SetString(PyExc_TypeError,
+ ".new(...): function is not valid for this sequence");
+ return NULL;
+}
static struct PyMethodDef bpy_bmesh_methods[] = {
@@ -782,286 +773,173 @@ static struct PyMethodDef bpy_bmloop_methods[] = {
{NULL, NULL, 0, NULL}
};
-static struct PyMethodDef bpy_bmvert_seq_methods[] = {
- {"new", (PyCFunction)bpy_bmvert_seq_new, METH_VARARGS, bpy_bmvert_seq_new_doc},
- {NULL, NULL, 0, NULL}
-};
-
-static struct PyMethodDef bpy_bmedge_seq_methods[] = {
- {"new", (PyCFunction)bpy_bmedge_seq_new, METH_VARARGS, bpy_bmedge_seq_new_doc},
- {NULL, NULL, 0, NULL}
-};
-
-static struct PyMethodDef bpy_bmface_seq_methods[] = {
- {"new", (PyCFunction)bpy_bmface_seq_new, METH_VARARGS, bpy_bmface_seq_new_doc},
+static struct PyMethodDef bpy_bm_seq_methods[] = {
+ {"new", (PyCFunction)bpy_bm_seq_new, METH_VARARGS, bpy_bm_seq_new_doc},
{NULL, NULL, 0, NULL}
};
/* Sequences
* ========= */
-static Py_ssize_t bpy_bmvert_seq_length(BPy_BMGeneric *self)
-{
- BPY_BM_CHECK_INT(self);
- return self->bm->totvert;
-}
-static Py_ssize_t bpy_bmedge_seq_length(BPy_BMGeneric *self)
-{
- BPY_BM_CHECK_INT(self);
- return self->bm->totedge;
-}
-static Py_ssize_t bpy_bmface_seq_length(BPy_BMGeneric *self)
-{
- BPY_BM_CHECK_INT(self);
- return self->bm->totface;
-}
-
-static PyObject *bpy_bmvert_seq_subscript_int(BPy_BMGeneric *self, int keynum)
-{
- int len;
+#define BM_ITER_BPY_BM_SEQ(ele, iter, bpy_bm_seq) \
+ BM_ITER(ele, iter, (bpy_bm_seq)->bm, (bpy_bm_seq)->itype,\
+ (bpy_bm_seq)->py_ele ? ((BPy_BMElem *)(bpy_bm_seq)->py_ele)->ele : NULL)
- BPY_BM_CHECK_OBJ(self);
- len = self->bm->totvert;
- if (keynum < 0) keynum += len;
- if (keynum >= 0 && keynum < len) {
- return BPy_BMVert_CreatePyObject(self->bm, BM_iter_at_index(self->bm, BM_VERTS_OF_MESH, NULL, keynum));
+static PyTypeObject *bpy_bm_itype_as_pytype(const char itype)
+{
+ /* should cover all types */
+ switch (itype) {
+ case BM_VERTS_OF_MESH:
+ case BM_VERTS_OF_FACE:
+ return &BPy_BMVert_Type;
+
+ case BM_EDGES_OF_MESH:
+ case BM_EDGES_OF_FACE:
+ case BM_EDGES_OF_VERT:
+ return &BPy_BMEdge_Type;
+
+ case BM_FACES_OF_MESH:
+ case BM_FACES_OF_EDGE:
+ case BM_FACES_OF_VERT:
+ return &BPy_BMFace_Type;
+
+ case BM_LOOPS_OF_FACE:
+ case BM_LOOPS_OF_EDGE:
+ case BM_LOOPS_OF_VERT:
+ case BM_LOOPS_OF_LOOP:
+ return &BPy_BMLoop_Type;
}
- PyErr_Format(PyExc_IndexError,
- "bm.verts[index]: index %d out of range", keynum);
+
return NULL;
}
-static PyObject *bpy_bmedge_seq_subscript_int(BPy_BMGeneric *self, int keynum)
+static Py_ssize_t bpy_bm_seq_length(BPy_BMElemSeq *self)
{
- int len;
+ BPY_BM_CHECK_INT(self);
- BPY_BM_CHECK_OBJ(self);
+ switch (self->itype) {
+ /* main-types */
+ case BM_VERTS_OF_MESH:
+ return self->bm->totvert;
+ case BM_EDGES_OF_MESH:
+ return self->bm->totedge;
+ case BM_FACES_OF_MESH:
+ return self->bm->totface;
+
+ /* sub-types */
+ case BM_VERTS_OF_FACE:
+ case BM_EDGES_OF_FACE:
+ case BM_LOOPS_OF_FACE:
+ BPY_BM_CHECK_INT(self->py_ele);
+ return ((BMFace *)self->py_ele->ele)->len;
+ }
- len = self->bm->totedge;
- if (keynum < 0) keynum += len;
- if (keynum >= 0 && keynum < len) {
- return BPy_BMEdge_CreatePyObject(self->bm, BM_iter_at_index(self->bm, BM_EDGES_OF_MESH, NULL, keynum));
+
+ /* loop over all items, avoid this if we can */
+ {
+ BMIter iter;
+ BMHeader *ele;
+ Py_ssize_t tot = 0;
+
+ BM_ITER_BPY_BM_SEQ(ele, &iter, self) {
+ tot++;
+ }
+ return tot;
}
- PyErr_Format(PyExc_IndexError,
- "bm.edges[index]: index %d out of range", keynum);
- return NULL;
}
-
-static PyObject *bpy_bmface_seq_subscript_int(BPy_BMGeneric *self, int keynum)
+static PyObject *bpy_bm_seq_subscript_int(BPy_BMElemSeq *self, int keynum)
{
int len;
BPY_BM_CHECK_OBJ(self);
- len = self->bm->totface;
+ len = self->bm->totvert;
if (keynum < 0) keynum += len;
if (keynum >= 0 && keynum < len) {
- return BPy_BMFace_CreatePyObject(self->bm, BM_iter_at_index(self->bm, BM_FACES_OF_MESH, NULL, keynum));
- }
- PyErr_Format(PyExc_IndexError,
- "bm.faces[index]: index %d out of range", keynum);
- return NULL;
-}
+ BMHeader *ele = BM_iter_at_index(self->bm, self->itype, self->py_ele ? self->py_ele->ele : NULL, keynum);
-static PyObject *bpy_bmvert_seq_subscript(BPy_BMGeneric *self, PyObject *key)
-{
- /* dont need error check here */
- if (PyIndex_Check(key)) {
- Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
- if (i == -1 && PyErr_Occurred())
+ if (ele == NULL) {
+ PyErr_SetString(PyExc_SystemError, "internal error");
return NULL;
- return bpy_bmvert_seq_subscript_int(self, i);
- }
- /* TODO, slice */
- else {
- PyErr_SetString(PyExc_AttributeError, "bm.verts[key]: invalid key, key must be an int");
- return NULL;
- }
-}
+ }
-static PyObject *bpy_bmedge_seq_subscript(BPy_BMGeneric *self, PyObject *key)
-{
- /* dont need error check here */
- if (PyIndex_Check(key)) {
- Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
- if (i == -1 && PyErr_Occurred())
- return NULL;
- return bpy_bmedge_seq_subscript_int(self, i);
- }
- /* TODO, slice */
- else {
- PyErr_SetString(PyExc_AttributeError, "bm.edges[key]: invalid key, key must be an int");
- return NULL;
+ return BPy_BMElem_CreatePyObject(self->bm, ele);
}
+ PyErr_Format(PyExc_IndexError,
+ "bm.verts[index]: index %d out of range", keynum);
+ return NULL;
}
-static PyObject *bpy_bmface_seq_subscript(BPy_BMGeneric *self, PyObject *key)
+static PyObject *bpy_bm_seq_subscript(BPy_BMElemSeq *self, PyObject *key)
{
/* dont need error check here */
if (PyIndex_Check(key)) {
Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
if (i == -1 && PyErr_Occurred())
return NULL;
- return bpy_bmface_seq_subscript_int(self, i);
+ return bpy_bm_seq_subscript_int(self, i);
}
/* TODO, slice */
else {
- PyErr_SetString(PyExc_AttributeError, "bm.faces[key]: invalid key, key must be an int");
+ PyErr_SetString(PyExc_AttributeError, "bm.verts[key]: invalid key, key must be an int");
return NULL;
}
}
-static int bpy_bmvert_seq_contains(BPy_BMGeneric *self, PyObject *value)
+static int bpy_bm_seq_contains(BPy_BMElemSeq *self, PyObject *value)
{
BPY_BM_CHECK_INT(self);
- if (BPy_BMVert_Check(value)) {
- BPy_BMVert *value_bmvert = (BPy_BMVert *)value;
- if (value_bmvert->bm == self->bm) {
- BMVert *v, *v_test = value_bmvert->v;
+ if (Py_TYPE(value) == bpy_bm_itype_as_pytype(self->itype)) {
+ BPy_BMElem *value_bm_ele = (BPy_BMElem *)value;
+ if (value_bm_ele->bm == self->bm) {
+ BMHeader *ele, *ele_test = value_bm_ele->ele;
BMIter iter;
- BM_ITER(v, &iter, self->bm, BM_VERTS_OF_MESH, NULL) {
- if (v == v_test) {
+ BM_ITER(ele, &iter, self->bm, BM_VERTS_OF_MESH, NULL) {
+ if (ele == ele_test) {
return 1;
}
}
}
}
- return 0;
-}
-static int bpy_bmedge_seq_contains(BPy_BMGeneric *self, PyObject *value)
-{
- BPY_BM_CHECK_INT(self);
-
- if (BPy_BMEdge_Check(value)) {
- BPy_BMEdge *value_bmedge = (BPy_BMEdge *)value;
- if (value_bmedge->bm == self->bm) {
- BMEdge *e, *e_test = value_bmedge->e;
- BMIter iter;
- BM_ITER(e, &iter, self->bm, BM_EDGES_OF_MESH, NULL) {
- if (e == e_test) {
- return 1;
- }
- }
- }
- }
return 0;
}
-static int bpy_bmface_seq_contains(BPy_BMGeneric *self, PyObject *value)
-{
- BPY_BM_CHECK_INT(self);
-
- if (BPy_BMFace_Check(value)) {
- BPy_BMFace *value_bmface = (BPy_BMFace *)value;
- if (value_bmface->bm == self->bm) {
- BMFace *f, *f_test = value_bmface->f;
- BMIter iter;
- BM_ITER(f, &iter, self->bm, BM_FACES_OF_MESH, NULL) {
- if (f == f_test) {
- return 1;
- }
- }
- }
- }
- return 0;
-}
-
-static PySequenceMethods bpy_bmvert_seq_as_sequence = {
- (lenfunc)bpy_bmvert_seq_length, /* sq_length */
- NULL, /* sq_concat */
- NULL, /* sq_repeat */
- (ssizeargfunc)bpy_bmvert_seq_subscript_int, /* sq_item */ /* Only set this so PySequence_Check() returns True */
- NULL, /* sq_slice */
- (ssizeobjargproc)NULL, /* sq_ass_item */
- NULL, /* *was* sq_ass_slice */
- (objobjproc)bpy_bmvert_seq_contains, /* sq_contains */
- (binaryfunc) NULL, /* sq_inplace_concat */
- (ssizeargfunc) NULL, /* sq_inplace_repeat */
-};
-
-static PySequenceMethods bpy_bmedge_seq_as_sequence = {
- (lenfunc)bpy_bmedge_seq_length, /* sq_length */
- NULL, /* sq_concat */
- NULL, /* sq_repeat */
- (ssizeargfunc)bpy_bmedge_seq_subscript_int, /* sq_item */ /* Only set this so PySequence_Check() returns True */
- NULL, /* sq_slice */
- (ssizeobjargproc)NULL, /* sq_ass_item */
- NULL, /* *was* sq_ass_slice */
- (objobjproc)bpy_bmedge_seq_contains, /* sq_contains */
- (binaryfunc) NULL, /* sq_inplace_concat */
- (ssizeargfunc) NULL, /* sq_inplace_repeat */
-};
-
-static PySequenceMethods bpy_bmface_seq_as_sequence = {
- (lenfunc)bpy_bmface_seq_length, /* sq_length */
+static PySequenceMethods bpy_bm_seq_as_sequence = {
+ (lenfunc)bpy_bm_seq_length, /* sq_length */
NULL, /* sq_concat */
NULL, /* sq_repeat */
- (ssizeargfunc)bpy_bmface_seq_subscript_int, /* sq_item */ /* Only set this so PySequence_Check() returns True */
+ (ssizeargfunc)bpy_bm_seq_subscript_int, /* sq_item */ /* Only set this so PySequence_Check() returns True */
NULL, /* sq_slice */
(ssizeobjargproc)NULL, /* sq_ass_item */
NULL, /* *was* sq_ass_slice */
- (objobjproc)bpy_bmface_seq_contains, /* sq_contains */
+ (objobjproc)bpy_bm_seq_contains, /* sq_contains */
(binaryfunc) NULL, /* sq_inplace_concat */
(ssizeargfunc) NULL, /* sq_inplace_repeat */
};
-
-static PyMappingMethods bpy_bmvert_seq_as_mapping = {
- (lenfunc)bpy_bmvert_seq_length, /* mp_length */
- (binaryfunc)bpy_bmvert_seq_subscript, /* mp_subscript */
- (objobjargproc)NULL, /* mp_ass_subscript */
-};
-
-static PyMappingMethods bpy_bmedge_seq_as_mapping = {
- (lenfunc)bpy_bmedge_seq_length, /* mp_length */
- (binaryfunc)bpy_bmedge_seq_subscript, /* mp_subscript */
- (objobjargproc)NULL, /* mp_ass_subscript */
-};
-
-static PyMappingMethods bpy_bmface_seq_as_mapping = {
- (lenfunc)bpy_bmface_seq_length, /* mp_length */
- (binaryfunc)bpy_bmface_seq_subscript, /* mp_subscript */
+static PyMappingMethods bpy_bm_seq_as_mapping = {
+ (lenfunc)bpy_bm_seq_length, /* mp_length */
+ (binaryfunc)bpy_bm_seq_subscript, /* mp_subscript */
(objobjargproc)NULL, /* mp_ass_subscript */
};
/* Iterator
* -------- */
-static PyObject *bpy_bmvert_seq_iter(BPy_BMGeneric *self)
+static PyObject *bpy_bm_seq_iter(BPy_BMElemSeq *self)
{
BPy_BMIter *py_iter;
BPY_BM_CHECK_OBJ(self);
py_iter = (BPy_BMIter *)BPy_BMIter_CreatePyObject(self->bm);
- BM_iter_init(&py_iter->iter, self->bm, BM_VERTS_OF_MESH, NULL);
+ BM_iter_init(&(py_iter->iter), self->bm, self->itype, self->py_ele ? self->py_ele->ele : NULL);
return (PyObject *)py_iter;
}
-static PyObject *bpy_bmedge_seq_iter(BPy_BMGeneric *self)
-{
- BPy_BMIter *py_iter;
-
- BPY_BM_CHECK_OBJ(self);
- py_iter = (BPy_BMIter *)BPy_BMIter_CreatePyObject(self->bm);
- BM_iter_init(&py_iter->iter, self->bm, BM_EDGES_OF_MESH, NULL);
- return (PyObject *)py_iter;
-}
-
-static PyObject *bpy_bmface_seq_iter(BPy_BMGeneric *self)
-{
- BPy_BMIter *py_iter;
-
- BPY_BM_CHECK_OBJ(self);
- py_iter = (BPy_BMIter *)BPy_BMIter_CreatePyObject(self->bm);
- BM_iter_init(&py_iter->iter, self->bm, BM_FACES_OF_MESH, NULL);
- return (PyObject *)py_iter;
-}
-
-
static PyObject *bpy_bm_iter_next(BPy_BMIter *self)
{
BMHeader *ele = BM_iter_step(&self->iter);
@@ -1075,6 +953,16 @@ static PyObject *bpy_bm_iter_next(BPy_BMIter *self)
}
+/* Dealloc Functions
+ * ================= */
+
+static void bpy_bm_seq_dealloc(BPy_BMElemSeq *self)
+{
+ Py_XDECREF(self->py_ele);
+
+ PyObject_DEL(self);
+}
+
/* not sure where this should go */
static long bpy_bm_elem_hash(PyObject *self)
{
@@ -1086,24 +974,20 @@ PyTypeObject BPy_BMVert_Type = {{{0}}};
PyTypeObject BPy_BMEdge_Type = {{{0}}};
PyTypeObject BPy_BMFace_Type = {{{0}}};
PyTypeObject BPy_BMLoop_Type = {{{0}}};
-PyTypeObject BPy_BMVertSeq_Type = {{{0}}};
-PyTypeObject BPy_BMEdgeSeq_Type = {{{0}}};
-PyTypeObject BPy_BMFaceSeq_Type = {{{0}}};
+PyTypeObject BPy_BMElemSeq_Type = {{{0}}};
PyTypeObject BPy_BMIter_Type = {{{0}}};
void BPy_BM_init_types(void)
{
- BPy_BMesh_Type.tp_basicsize = sizeof(BPy_BMesh);
- BPy_BMVert_Type.tp_basicsize = sizeof(BPy_BMVert);
- BPy_BMEdge_Type.tp_basicsize = sizeof(BPy_BMEdge);
- BPy_BMFace_Type.tp_basicsize = sizeof(BPy_BMFace);
- BPy_BMLoop_Type.tp_basicsize = sizeof(BPy_BMLoop);
- BPy_BMVertSeq_Type.tp_basicsize = sizeof(BPy_BMGeneric);
- BPy_BMEdgeSeq_Type.tp_basicsize = sizeof(BPy_BMGeneric);
- BPy_BMFaceSeq_Type.tp_basicsize = sizeof(BPy_BMGeneric);
- BPy_BMIter_Type.tp_basicsize = sizeof(BPy_BMIter);
+ BPy_BMesh_Type.tp_basicsize = sizeof(BPy_BMesh);
+ BPy_BMVert_Type.tp_basicsize = sizeof(BPy_BMVert);
+ BPy_BMEdge_Type.tp_basicsize = sizeof(BPy_BMEdge);
+ BPy_BMFace_Type.tp_basicsize = sizeof(BPy_BMFace);
+ BPy_BMLoop_Type.tp_basicsize = sizeof(BPy_BMLoop);
+ BPy_BMElemSeq_Type.tp_basicsize = sizeof(BPy_BMElemSeq);
+ BPy_BMIter_Type.tp_basicsize = sizeof(BPy_BMIter);
BPy_BMesh_Type.tp_name = "BMesh";
@@ -1111,9 +995,7 @@ void BPy_BM_init_types(void)
BPy_BMEdge_Type.tp_name = "BMEdge";
BPy_BMFace_Type.tp_name = "BMFace";
BPy_BMLoop_Type.tp_name = "BMLoop";
- BPy_BMVertSeq_Type.tp_name = "BMVertSeq";
- BPy_BMEdgeSeq_Type.tp_name = "BMEdgeSeq";
- BPy_BMFaceSeq_Type.tp_name = "BMFaceSeq";
+ BPy_BMElemSeq_Type.tp_name = "BMElemSeq";
BPy_BMIter_Type.tp_name = "BMIter";
@@ -1122,9 +1004,7 @@ void BPy_BM_init_types(void)
BPy_BMEdge_Type.tp_getset = bpy_bmedge_getseters;
BPy_BMFace_Type.tp_getset = bpy_bmface_getseters;
BPy_BMLoop_Type.tp_getset = bpy_bmloop_getseters;
- BPy_BMVertSeq_Type.tp_getset = NULL;
- BPy_BMEdgeSeq_Type.tp_getset = NULL;
- BPy_BMFaceSeq_Type.tp_getset = NULL;
+ BPy_BMElemSeq_Type.tp_getset = NULL;
BPy_BMIter_Type.tp_getset = NULL;
@@ -1133,9 +1013,7 @@ void BPy_BM_init_types(void)
BPy_BMEdge_Type.tp_methods = bpy_bmedge_methods;
BPy_BMFace_Type.tp_methods = bpy_bmface_methods;
BPy_BMLoop_Type.tp_methods = bpy_bmloop_methods;
- BPy_BMVertSeq_Type.tp_methods = bpy_bmvert_seq_methods;
- BPy_BMEdgeSeq_Type.tp_methods = bpy_bmedge_seq_methods;
- BPy_BMFaceSeq_Type.tp_methods = bpy_bmface_seq_methods;
+ BPy_BMElemSeq_Type.tp_methods = bpy_bm_seq_methods;
BPy_BMIter_Type.tp_methods = NULL;
@@ -1144,36 +1022,33 @@ void BPy_BM_init_types(void)
BPy_BMEdge_Type.tp_hash = bpy_bm_elem_hash;
BPy_BMFace_Type.tp_hash = bpy_bm_elem_hash;
BPy_BMLoop_Type.tp_hash = bpy_bm_elem_hash;
- BPy_BMVertSeq_Type.tp_hash = NULL;
- BPy_BMEdgeSeq_Type.tp_hash = NULL;
- BPy_BMFaceSeq_Type.tp_hash = NULL;
+ BPy_BMElemSeq_Type.tp_hash = NULL;
BPy_BMIter_Type.tp_hash = NULL;
+ BPy_BMElemSeq_Type.tp_as_sequence = &bpy_bm_seq_as_sequence;
- BPy_BMVertSeq_Type.tp_as_sequence = &bpy_bmvert_seq_as_sequence;
- BPy_BMEdgeSeq_Type.tp_as_sequence = &bpy_bmedge_seq_as_sequence;
- BPy_BMFaceSeq_Type.tp_as_sequence = &bpy_bmface_seq_as_sequence;
-
- BPy_BMVertSeq_Type.tp_as_mapping = &bpy_bmvert_seq_as_mapping;
- BPy_BMEdgeSeq_Type.tp_as_mapping = &bpy_bmedge_seq_as_mapping;
- BPy_BMFaceSeq_Type.tp_as_mapping = &bpy_bmface_seq_as_mapping;
+ BPy_BMElemSeq_Type.tp_as_mapping = &bpy_bm_seq_as_mapping;
- BPy_BMVertSeq_Type.tp_iter = (getiterfunc)bpy_bmvert_seq_iter;
- BPy_BMEdgeSeq_Type.tp_iter = (getiterfunc)bpy_bmedge_seq_iter;
- BPy_BMFaceSeq_Type.tp_iter = (getiterfunc)bpy_bmface_seq_iter;
+ BPy_BMElemSeq_Type.tp_iter = (getiterfunc)bpy_bm_seq_iter;
/* only 1 iteratir so far */
BPy_BMIter_Type.tp_iternext = (iternextfunc)bpy_bm_iter_next;
+ BPy_BMesh_Type.tp_dealloc = NULL;
+ BPy_BMVert_Type.tp_dealloc = NULL;
+ BPy_BMEdge_Type.tp_dealloc = NULL;
+ BPy_BMFace_Type.tp_dealloc = NULL;
+ BPy_BMLoop_Type.tp_dealloc = NULL;
+ BPy_BMElemSeq_Type.tp_dealloc = (destructor)bpy_bm_seq_dealloc;
+ BPy_BMIter_Type.tp_dealloc = NULL;
+
/*
BPy_BMesh_Type.
BPy_BMVert_Type.
BPy_BMEdge_Type.
BPy_BMFace_Type.
BPy_BMLoop_Type.
- BPy_BMVertSeq_Type.
- BPy_BMEdgeSeq_Type.
- BPy_BMFaceSeq_Type.
+ BPy_BMElemSeq_Type.
BPy_BMIter_Type.
*/
@@ -1182,9 +1057,7 @@ void BPy_BM_init_types(void)
BPy_BMEdge_Type.tp_flags = Py_TPFLAGS_DEFAULT;
BPy_BMFace_Type.tp_flags = Py_TPFLAGS_DEFAULT;
BPy_BMLoop_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- BPy_BMVertSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- BPy_BMEdgeSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT;
- BPy_BMFaceSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+ BPy_BMElemSeq_Type.tp_flags = Py_TPFLAGS_DEFAULT;
BPy_BMIter_Type.tp_flags = Py_TPFLAGS_DEFAULT;
@@ -1193,9 +1066,7 @@ void BPy_BM_init_types(void)
PyType_Ready(&BPy_BMEdge_Type);
PyType_Ready(&BPy_BMFace_Type);
PyType_Ready(&BPy_BMLoop_Type);
- PyType_Ready(&BPy_BMVertSeq_Type);
- PyType_Ready(&BPy_BMEdgeSeq_Type);
- PyType_Ready(&BPy_BMFaceSeq_Type);
+ PyType_Ready(&BPy_BMElemSeq_Type);
PyType_Ready(&BPy_BMIter_Type);
}
@@ -1246,24 +1117,13 @@ PyObject *BPy_BMLoop_CreatePyObject(BMesh *bm, BMLoop *l)
return (PyObject *)self;
}
-PyObject *BPy_BMVertSeq_CreatePyObject(BMesh *bm)
-{
- BPy_BMGeneric *self = PyObject_New(BPy_BMGeneric, &BPy_BMVertSeq_Type);
- self->bm = bm;
- return (PyObject *)self;
-}
-
-PyObject *BPy_BMEdgeSeq_CreatePyObject(BMesh *bm)
-{
- BPy_BMGeneric *self = PyObject_New(BPy_BMGeneric, &BPy_BMEdgeSeq_Type);
- self->bm = bm;
- return (PyObject *)self;
-}
-
-PyObject *BPy_BMFaceSeq_CreatePyObject(BMesh *bm)
+PyObject *BPy_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, const char itype)
{
- BPy_BMGeneric *self = PyObject_New(BPy_BMGeneric, &BPy_BMFaceSeq_Type);
+ BPy_BMElemSeq *self = PyObject_New(BPy_BMElemSeq, &BPy_BMElemSeq_Type);
self->bm = bm;
+ self->py_ele = py_ele; /* can be NULL */
+ self->itype = itype;
+ Py_XINCREF(py_ele);
return (PyObject *)self;
}
diff --git a/source/blender/python/bmesh/bmesh_py_types.h b/source/blender/python/bmesh/bmesh_py_types.h
index 51d5e6aa5ee..541e93306ba 100644
--- a/source/blender/python/bmesh/bmesh_py_types.h
+++ b/source/blender/python/bmesh/bmesh_py_types.h
@@ -35,9 +35,7 @@ extern PyTypeObject BPy_BMVert_Type;
extern PyTypeObject BPy_BMEdge_Type;
extern PyTypeObject BPy_BMFace_Type;
extern PyTypeObject BPy_BMLoop_Type;
-extern PyTypeObject BPy_BMVertSeq_Type;
-extern PyTypeObject BPy_BMEdgeSeq_Type;
-extern PyTypeObject BPy_BMFaceSeq_Type;
+extern PyTypeObject BPy_BMElemSeq_Type;
extern PyTypeObject BPy_BMIter_Type;
#define BPy_BMesh_Check(v) (Py_TYPE(v) == &BPy_BMesh_Type)
@@ -45,9 +43,7 @@ extern PyTypeObject BPy_BMIter_Type;
#define BPy_BMEdge_Check(v) (Py_TYPE(v) == &BPy_BMEdge_Type)
#define BPy_BMFace_Check(v) (Py_TYPE(v) == &BPy_BMFace_Type)
#define BPy_BMLoop_Check(v) (Py_TYPE(v) == &BPy_BMLoop_Type)
-#define BPy_BMVertSeq_Check(v) (Py_TYPE(v) == &BPy_BMVertSeq_Type)
-#define BPy_BMEdgeSeq_Check(v) (Py_TYPE(v) == &BPy_BMEdgeSeq_Type)
-#define BPy_BMFaceSeq_Check(v) (Py_TYPE(v) == &BPy_BMFaceSeq_Type)
+#define BPy_BMElemSeq_Check(v) (Py_TYPE(v) == &BPy_BMElemSeq_Type)
#define BPy_BMIter_Check(v) (Py_TYPE(v) == &BPy_BMIter_Type)
/* cast from _any_ bmesh type - they all have BMesh first */
@@ -95,6 +91,24 @@ typedef struct BPy_BMLoop {
/* iterators */
+
+typedef struct BPy_BMElemSeq {
+ PyObject_VAR_HEAD
+ struct BMesh *bm; /* keep first */
+
+ /* if this is a sequence on an existing element,
+ * loops of faces for eg.
+ * If this veriable is set, it will be used */
+
+ /* we hold a reference to this.
+ * check incase the owner becomes invalid on access */
+ /* TODO - make this a GC'd object!, will function OK without this though */
+ BPy_BMElem *py_ele;
+
+ /* iterator type */
+ short itype;
+} BPy_BMElemSeq;
+
typedef struct BPy_BMIter {
PyObject_VAR_HEAD
struct BMesh *bm; /* keep first */
@@ -108,9 +122,7 @@ PyObject *BPy_BMVert_CreatePyObject(BMesh *bm, BMVert *v);
PyObject *BPy_BMEdge_CreatePyObject(BMesh *bm, BMEdge *e);
PyObject *BPy_BMFace_CreatePyObject(BMesh *bm, BMFace *f);
PyObject *BPy_BMLoop_CreatePyObject(BMesh *bm, BMLoop *l);
-PyObject *BPy_BMVertSeq_CreatePyObject(BMesh *bm);
-PyObject *BPy_BMEdgeSeq_CreatePyObject(BMesh *bm);
-PyObject *BPy_BMFaceSeq_CreatePyObject(BMesh *bm);
+PyObject *BPy_BMElemSeq_CreatePyObject(BMesh *bm, BPy_BMElem *py_ele, const char itype);
PyObject *BPy_BMIter_CreatePyObject(BMesh *bm);
PyObject *BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele); /* just checks type and creates v/e/f/l */
diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c
index 5d05c688028..1df5e94e9fa 100644
--- a/source/blender/python/intern/bpy_interface.c
+++ b/source/blender/python/intern/bpy_interface.c
@@ -193,7 +193,7 @@ static struct _inittab bpy_internal_modules[] = {
// {(char *)"mathutils.noise", PyInit_mathutils_noise},
{(char *)"bgl", BPyInit_bgl},
{(char *)"blf", BPyInit_blf},
- {(char *)"bme", BPyInit_bmesh},
+ {(char *)"bmesh", BPyInit_bmesh},
#ifdef WITH_AUDASPACE
{(char *)"aud", AUD_initPython},
#endif