40 #include "../generic/py_capi_utils.h"
41 #include "../generic/python_utildefines.h"
44 "The last selected element or None (read-only).\n\n:type: :class:`BMVert`, "
45 ":class:`BMEdge` or :class:`BMFace`");
51 if ((ese =
self->bm->selected.last)) {
62 bpy_bmeditselseq_active_doc,
68 ".. method:: validate()\n"
70 " Ensures all elements in the selection history are selected.\n");
79 ".. method:: clear()\n"
81 " Empties the selection history.\n");
90 bpy_bmeditselseq_add_doc,
91 ".. method:: add(element)\n"
93 " Add an element to the selection history (no action taken if its already added).\n");
100 PyExc_TypeError,
"Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
112 ".. method:: remove(element)\n"
114 " Remove an element from the selection history.\n");
121 PyExc_TypeError,
"Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
128 PyErr_SetString(PyExc_ValueError,
"Element not found in selection history");
136 bpy_bmeditselseq_discard_doc,
137 ".. method:: discard(element)\n"
139 " Discard an element from the selection history.\n"
141 " Like remove but doesn't raise an error when the elements not in the selection list.\n");
148 PyExc_TypeError,
"Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
163 bpy_bmeditselseq_validate_doc},
199 PyErr_Format(PyExc_IndexError,
"BMElemSeq[index]: index %d out of range", keynum);
214 list = PyList_New(0);
217 for (ese =
self->bm->selected.first; ese; ese = ese->
next) {
218 if (
count == start) {
225 for (; ese; ese = ese->
next) {
239 if (PyIndex_Check(key)) {
240 const Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
241 if (i == -1 && PyErr_Occurred()) {
246 if (PySlice_Check(key)) {
247 PySliceObject *key_slice = (PySliceObject *)key;
250 if (key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
254 PyErr_SetString(PyExc_TypeError,
"BMElemSeq[slice]: slice steps not supported");
257 if (key_slice->start == Py_None && key_slice->stop == Py_None) {
261 Py_ssize_t start = 0, stop = PY_SSIZE_T_MAX;
264 if (key_slice->start != Py_None && !_PyEval_SliceIndex(key_slice->start, &start)) {
267 if (key_slice->stop != Py_None && !_PyEval_SliceIndex(key_slice->stop, &stop)) {
271 if (start < 0 || stop < 0) {
284 if (stop - start <= 0) {
285 return PyList_New(0);
291 PyErr_SetString(PyExc_AttributeError,
"BMElemSeq[key]: invalid key, key must be an int");
302 if (value_bm_ele->
bm ==
self->bm) {
316 (ssizeobjargproc)
NULL,
338 py_iter->
ese =
self->bm->selected.first;
339 return (PyObject *)py_iter;
346 PyErr_SetNone(PyExc_StopIteration);
350 self->ese = ese->
next;
362 return (PyObject *)
self;
370 return (PyObject *)
self;
420 Py_ssize_t value_len;
436 "BMesh.select_history = value");
438 if (value_array ==
NULL) {
444 for (i = 0; i < value_len; i++) {
448 PyMem_FREE(value_array);
void void * BLI_rfindlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_select_history_clear(BMesh *bm)
void BM_select_history_validate(BMesh *bm)
#define BM_select_history_store_notest(bm, ele)
#define BM_select_history_store(bm, ele)
#define BM_select_history_check(bm, ele)
#define BM_select_history_remove(bm, ele)
PyObject * BPy_BMElem_CreatePyObject(BMesh *bm, BMHeader *ele)
void * BPy_BMElem_PySeq_As_Array(BMesh **r_bm, PyObject *seq, Py_ssize_t min, Py_ssize_t max, Py_ssize_t *r_size, const char htype, const bool do_unique_check, const bool do_bm_check, const char *error_prefix)
#define BPy_BMFace_Check(v)
#define BPY_BM_CHECK_OBJ(obj)
#define BPy_BMVert_Check(v)
#define BPy_BMEdge_Check(v)
#define BPY_BM_CHECK_SOURCE_OBJ(bm, errmsg,...)
#define BPY_BM_CHECK_INT(obj)
static PyObject * bpy_bmeditselseq_remove(BPy_BMEditSelSeq *self, BPy_BMElem *value)
static PyObject * bpy_bmeditselseq_clear(BPy_BMEditSelSeq *self)
static int bpy_bmeditselseq_contains(BPy_BMEditSelSeq *self, PyObject *value)
static PyObject * bpy_bmeditselseq_add(BPy_BMEditSelSeq *self, BPy_BMElem *value)
static PyObject * bpy_bmeditseliter_next(BPy_BMEditSelIter *self)
PyDoc_STRVAR(bpy_bmeditselseq_active_doc, "The last selected element or None (read-only).\n\n:type: :class:`BMVert`, " ":class:`BMEdge` or :class:`BMFace`")
int BPy_BMEditSel_Assign(BPy_BMesh *self, PyObject *value)
void BPy_BM_init_types_select(void)
static PyObject * bpy_bmeditselseq_iter(BPy_BMEditSelSeq *self)
static PyObject * bpy_bmeditselseq_validate(BPy_BMEditSelSeq *self)
static PyMappingMethods bpy_bmeditselseq_as_mapping
static PyObject * bpy_bmeditselseq_subscript(BPy_BMEditSelSeq *self, PyObject *key)
PyObject * BPy_BMEditSel_CreatePyObject(BMesh *bm)
PyTypeObject BPy_BMEditSelSeq_Type
static PyGetSetDef bpy_bmeditselseq_getseters[]
static Py_ssize_t bpy_bmeditselseq_length(BPy_BMEditSelSeq *self)
static PyObject * bpy_bmeditselseq_active_get(BPy_BMEditSelSeq *self, void *UNUSED(closure))
PyTypeObject BPy_BMEditSelIter_Type
static struct PyMethodDef bpy_bmeditselseq_methods[]
static PyObject * bpy_bmeditselseq_subscript_int(BPy_BMEditSelSeq *self, int keynum)
static PyObject * bpy_bmeditselseq_subscript_slice(BPy_BMEditSelSeq *self, Py_ssize_t start, Py_ssize_t stop)
PyObject * BPy_BMEditSelIter_CreatePyObject(BMesh *bm)
static PySequenceMethods bpy_bmeditselseq_as_sequence
static PyObject * bpy_bmeditselseq_discard(BPy_BMEditSelSeq *self, BPy_BMElem *value)
struct BPy_BMEditSelIter BPy_BMEditSelIter
struct BPy_BMEditSelSeq BPy_BMEditSelSeq
struct BMEditSelection * next
struct BMEditSelection * ese
PyObject_VAR_HEAD struct BMesh * bm