29 bpy_bmeditselseq_active_doc,
30 "The last selected element or None (read-only).\n"
32 ":type: :class:`BMVert`, "
33 ":class:`BMEdge` or :class:`BMFace`");
50 bpy_bmeditselseq_active_doc,
52 {
nullptr,
nullptr,
nullptr,
nullptr,
nullptr}
57 bpy_bmeditselseq_validate_doc,
58 ".. method:: validate()\n"
60 " Ensures all elements in the selection history are selected.\n");
70 bpy_bmeditselseq_clear_doc,
71 ".. method:: clear()\n"
73 " Empties the selection history.\n");
83 bpy_bmeditselseq_add_doc,
84 ".. method:: add(element)\n"
86 " Add an element to the selection history (no action taken if its already added).\n");
93 PyExc_TypeError,
"Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
106 bpy_bmeditselseq_remove_doc,
107 ".. method:: remove(element)\n"
109 " Remove an element from the selection history.\n");
116 PyExc_TypeError,
"Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
123 PyErr_SetString(PyExc_ValueError,
"Element not found in selection history");
132 bpy_bmeditselseq_discard_doc,
133 ".. method:: discard(element)\n"
135 " Discard an element from the selection history.\n"
137 " Like remove but doesn't raise an error when the elements not in the selection list.\n");
144 PyExc_TypeError,
"Expected a BMVert/BMedge/BMFace not a %.200s", Py_TYPE(value)->tp_name);
155#if (defined(__GNUC__) && !defined(__clang__))
156# pragma GCC diagnostic push
157# pragma GCC diagnostic ignored "-Wcast-function-type"
164 bpy_bmeditselseq_validate_doc},
170 {
nullptr,
nullptr, 0,
nullptr},
173#if (defined(__GNUC__) && !defined(__clang__))
174# pragma GCC diagnostic pop
204 PyErr_Format(PyExc_IndexError,
"BMElemSeq[index]: index %d out of range", keynum);
219 list = PyList_New(0);
223 if (
count == start) {
230 for (; ese; ese = ese->
next) {
244 if (PyIndex_Check(key)) {
245 const Py_ssize_t i = PyNumber_AsSsize_t(key, PyExc_IndexError);
246 if (i == -1 && PyErr_Occurred()) {
251 if (PySlice_Check(key)) {
252 PySliceObject *key_slice = (PySliceObject *)key;
255 if (key_slice->step != Py_None && !_PyEval_SliceIndex(key, &step)) {
259 PyErr_SetString(PyExc_TypeError,
"BMElemSeq[slice]: slice steps not supported");
262 if (key_slice->start == Py_None && key_slice->stop == Py_None) {
266 Py_ssize_t start = 0, stop = PY_SSIZE_T_MAX;
269 if (key_slice->start != Py_None && !_PyEval_SliceIndex(key_slice->start, &start)) {
272 if (key_slice->stop != Py_None && !_PyEval_SliceIndex(key_slice->stop, &stop)) {
276 if (start < 0 || stop < 0) {
289 if (stop - start <= 0) {
290 return PyList_New(0);
296 PyErr_SetString(PyExc_AttributeError,
"BMElemSeq[key]: invalid key, key must be an int");
307 if (value_bm_ele->
bm ==
self->bm) {
331 (objobjargproc)
nullptr,
344 return (PyObject *)py_iter;
350 if (ese ==
nullptr) {
351 PyErr_SetNone(PyExc_StopIteration);
367 return (PyObject *)
self;
375 return (PyObject *)
self;
422 Py_ssize_t value_len;
424 BMElem **value_array =
nullptr;
438 "BMesh.select_history = value"));
440 if (value_array ==
nullptr) {
446 for (i = 0; i < value_len; i++) {
450 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 int bpy_bmeditselseq_contains(BPy_BMEditSelSeq *self, PyObject *value)
static PyObject * bpy_bmeditselseq_remove(BPy_BMEditSelSeq *self, BPy_BMElem *value)
static PyObject * bpy_bmeditselseq_discard(BPy_BMEditSelSeq *self, BPy_BMElem *value)
static PyMethodDef bpy_bmeditselseq_methods[]
int BPy_BMEditSel_Assign(BPy_BMesh *self, PyObject *value)
static PyObject * bpy_bmeditselseq_active_get(BPy_BMEditSelSeq *self, void *)
void BPy_BM_init_types_select()
static PyObject * bpy_bmeditselseq_add(BPy_BMEditSelSeq *self, BPy_BMElem *value)
static PyObject * bpy_bmeditselseq_clear(BPy_BMEditSelSeq *self)
static PyMappingMethods bpy_bmeditselseq_as_mapping
static PyObject * bpy_bmeditselseq_iter(BPy_BMEditSelSeq *self)
static PyObject * bpy_bmeditselseq_subscript(BPy_BMEditSelSeq *self, PyObject *key)
static PyObject * bpy_bmeditselseq_subscript_int(BPy_BMEditSelSeq *self, Py_ssize_t keynum)
PyTypeObject BPy_BMEditSelSeq_Type
static PyGetSetDef bpy_bmeditselseq_getseters[]
static PyObject * bpy_bmeditseliter_next(BPy_BMEditSelIter *self)
PyObject * BPy_BMEditSelIter_CreatePyObject(BMesh *bm)
static Py_ssize_t bpy_bmeditselseq_length(BPy_BMEditSelSeq *self)
static PyObject * bpy_bmeditselseq_subscript_slice(BPy_BMEditSelSeq *self, Py_ssize_t start, Py_ssize_t stop)
static PyObject * bpy_bmeditselseq_validate(BPy_BMEditSelSeq *self)
PyTypeObject BPy_BMEditSelIter_Type
PyObject * BPy_BMEditSel_CreatePyObject(BMesh *bm)
PyDoc_STRVAR(bpy_bmeditselseq_active_doc, "The last selected element or None (read-only).\n" "\n" ":type: :class:`BMVert`, " ":class:`BMEdge` or :class:`BMFace`")
static PySequenceMethods bpy_bmeditselseq_as_sequence
struct BMEditSelection * next
PyObject_VAR_HEAD BMesh * bm