24 #include "../generic/py_capi_utils.h"
25 #include "../generic/python_utildefines.h"
28 "The last selected element or None (read-only).\n\n:type: :class:`BMVert`, "
29 ":class:`BMEdge` or :class:`BMFace`");
35 if ((ese =
self->bm->selected.last)) {
46 bpy_bmeditselseq_active_doc,
52 ".. method:: validate()\n"
54 " Ensures all elements in the selection history are selected.\n");
63 ".. method:: clear()\n"
65 " Empties the selection history.\n");
74 bpy_bmeditselseq_add_doc,
75 ".. method:: add(element)\n"
77 " Add an element to the selection history (no action taken if its already added).\n");
84 PyExc_TypeError,
"Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
96 ".. method:: remove(element)\n"
98 " Remove an element from the selection history.\n");
105 PyExc_TypeError,
"Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
112 PyErr_SetString(PyExc_ValueError,
"Element not found in selection history");
120 bpy_bmeditselseq_discard_doc,
121 ".. method:: discard(element)\n"
123 " Discard an element from the selection history.\n"
125 " Like remove but doesn't raise an error when the elements not in the selection list.\n");
132 PyExc_TypeError,
"Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
147 bpy_bmeditselseq_validate_doc},
183 PyErr_Format(PyExc_IndexError,
"BMElemSeq[index]: index %d out of range", keynum);
198 list = PyList_New(0);
201 for (ese =
self->bm->selected.first; ese; ese = ese->
next) {
202 if (
count == start) {
209 for (; ese; ese = ese->
next) {
223 if (PyIndex_Check(key)) {
224 const Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
225 if (i == -1 && PyErr_Occurred()) {
230 if (PySlice_Check(key)) {
231 PySliceObject *key_slice = (PySliceObject *)key;
234 if (key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
238 PyErr_SetString(PyExc_TypeError,
"BMElemSeq[slice]: slice steps not supported");
241 if (key_slice->start == Py_None && key_slice->stop == Py_None) {
245 Py_ssize_t start = 0, stop = PY_SSIZE_T_MAX;
248 if (key_slice->start != Py_None && !_PyEval_SliceIndex(key_slice->start, &start)) {
251 if (key_slice->stop != Py_None && !_PyEval_SliceIndex(key_slice->stop, &stop)) {
255 if (start < 0 || stop < 0) {
268 if (stop - start <= 0) {
269 return PyList_New(0);
275 PyErr_SetString(PyExc_AttributeError,
"BMElemSeq[key]: invalid key, key must be an int");
286 if (value_bm_ele->
bm ==
self->bm) {
300 (ssizeobjargproc)
NULL,
322 py_iter->
ese =
self->bm->selected.first;
323 return (PyObject *)py_iter;
330 PyErr_SetNone(PyExc_StopIteration);
334 self->ese = ese->
next;
346 return (PyObject *)
self;
354 return (PyObject *)
self;
401 Py_ssize_t value_len;
417 "BMesh.select_history = value");
419 if (value_array ==
NULL) {
425 for (i = 0; i < value_len; i++) {
429 PyMem_FREE(value_array);
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