Blender V5.0
BPy_Interface0DIterator.cpp
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2004-2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
10
11#include "../BPy_Convert.h"
12#include "../BPy_Interface1D.h"
13
14using namespace Freestyle;
15
17
18//------------------------INSTANCE METHODS ----------------------------------
19
21 /* Wrap. */
22 Interface0DIterator_doc,
23 "Class hierarchy: :class:`Iterator` > :class:`Interface0DIterator`\n"
24 "\n"
25 "Class defining an iterator over Interface0D elements. An instance of\n"
26 "this iterator is always obtained from a 1D element.\n"
27 "\n"
28 ".. method:: __init__(brother)\n"
29 " __init__(it)\n"
30 "\n"
31 " Construct a nested Interface0DIterator using either the copy constructor\n"
32 " or the constructor that takes an argument of a Function0D.\n"
33 "\n"
34 " :arg brother: An Interface0DIterator object.\n"
35 " :type brother: :class:`Interface0DIterator`\n"
36 " :arg it: An iterator object to be nested.\n"
37 " :type it: :class:`SVertexIterator` | :class:`CurvePointIterator` | "
38 ":class:`StrokeVertexIterator`\n");
39static int convert_nested_it(PyObject *obj, void *v)
40{
41 if (!obj || !BPy_Iterator_Check(obj)) {
42 return 0;
43 }
44 Interface0DIteratorNested *nested_it = dynamic_cast<Interface0DIteratorNested *>(
45 ((BPy_Iterator *)obj)->it);
46 if (!nested_it) {
47 return 0;
48 }
49 *((Interface0DIteratorNested **)v) = nested_it;
50 return 1;
51}
52
53static int Interface0DIterator_init(BPy_Interface0DIterator *self, PyObject *args, PyObject *kwds)
54{
55 static const char *kwlist_1[] = {"it", nullptr};
56 static const char *kwlist_2[] = {"inter", nullptr};
57 static const char *kwlist_3[] = {"brother", nullptr};
59 PyObject *brother, *inter;
60
61 if (PyArg_ParseTupleAndKeywords(
62 args, kwds, "O&", (char **)kwlist_1, convert_nested_it, &nested_it))
63 {
64 self->if0D_it = new Interface0DIterator(nested_it->copy());
65 self->at_start = true;
66 self->reversed = false;
67 }
68 else if ((void)PyErr_Clear(),
69 PyArg_ParseTupleAndKeywords(
70 args, kwds, "O!", (char **)kwlist_2, &Interface1D_Type, &inter))
71 {
72 self->if0D_it = new Interface0DIterator(((BPy_Interface1D *)inter)->if1D->verticesBegin());
73 self->at_start = true;
74 self->reversed = false;
75 }
76 else if ((void)PyErr_Clear(),
77 PyArg_ParseTupleAndKeywords(
78 args, kwds, "O!", (char **)kwlist_3, &Interface0DIterator_Type, &brother))
79 {
80 self->if0D_it = new Interface0DIterator(*(((BPy_Interface0DIterator *)brother)->if0D_it));
81 self->at_start = ((BPy_Interface0DIterator *)brother)->at_start;
82 self->reversed = ((BPy_Interface0DIterator *)brother)->reversed;
83 }
84 else {
85 PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
86 return -1;
87 }
88 self->py_it.it = self->if0D_it;
89 return 0;
90}
91
93{
94 Py_INCREF(self);
95 self->at_start = true;
96 return (PyObject *)self;
97}
98
100{
101 if (self->reversed) {
102 if (self->if0D_it->isBegin()) {
103 PyErr_SetNone(PyExc_StopIteration);
104 return nullptr;
105 }
106 self->if0D_it->decrement();
107 }
108 else {
109 if (self->if0D_it->isEnd()) {
110 PyErr_SetNone(PyExc_StopIteration);
111 return nullptr;
112 }
113 if (self->at_start) {
114 self->at_start = false;
115 }
116 else if (self->if0D_it->atLast()) {
117 PyErr_SetNone(PyExc_StopIteration);
118 return nullptr;
119 }
120 else {
121 self->if0D_it->increment();
122 }
123 }
124 Interface0D *if0D = self->if0D_it->operator->();
126}
127
128/*----------------------Interface0DIterator get/setters ----------------------------*/
129
131 /* Wrap. */
132 Interface0DIterator_object_doc,
133 "The 0D object currently pointed to by this iterator. Note that the object\n"
134 "may be an instance of an Interface0D subclass. For example if the iterator\n"
135 "has been created from the `vertices_begin()` method of the :class:`Stroke`\n"
136 "class, the .object property refers to a :class:`StrokeVertex` object.\n"
137 "\n"
138 ":type: :class:`Interface0D` or one of its subclasses.\n");
139static PyObject *Interface0DIterator_object_get(BPy_Interface0DIterator *self, void * /*closure*/)
140{
141 if (self->if0D_it->isEnd()) {
142 PyErr_SetString(PyExc_RuntimeError, "iteration has stopped");
143 return nullptr;
144 }
145 return Any_BPy_Interface0D_from_Interface0D(self->if0D_it->operator*());
146}
147
149 /* Wrap. */
150 Interface0DIterator_t_doc,
151 "The curvilinear abscissa of the current point.\n"
152 "\n"
153 ":type: float\n");
154static PyObject *Interface0DIterator_t_get(BPy_Interface0DIterator *self, void * /*closure*/)
155{
156 return PyFloat_FromDouble(self->if0D_it->t());
157}
158
160 /* Wrap. */
161 Interface0DIterator_u_doc,
162 "The point parameter at the current point in the 1D element (0 <= u <= 1).\n"
163 "\n"
164 ":type: float\n");
165static PyObject *Interface0DIterator_u_get(BPy_Interface0DIterator *self, void * /*closure*/)
166{
167 return PyFloat_FromDouble(self->if0D_it->u());
168}
169
171 /* Wrap. */
172 Interface0DIterator_at_last_doc,
173 "True if the iterator points to the last valid element.\n"
174 "For its counterpart (pointing to the first valid element), use it.is_begin.\n"
175 "\n"
176 ":type: bool\n");
178{
179 return PyBool_from_bool(self->if0D_it->atLast());
180}
181
182static PyGetSetDef BPy_Interface0DIterator_getseters[] = {
183 {"object",
185 (setter) nullptr,
186 Interface0DIterator_object_doc,
187 nullptr},
188 {"t", (getter)Interface0DIterator_t_get, (setter) nullptr, Interface0DIterator_t_doc, nullptr},
189 {"u", (getter)Interface0DIterator_u_get, (setter) nullptr, Interface0DIterator_u_doc, nullptr},
190 {"at_last",
192 (setter) nullptr,
193 Interface0DIterator_at_last_doc,
194 nullptr},
195 {nullptr, nullptr, nullptr, nullptr, nullptr} /* Sentinel */
196};
197
198/*-----------------------BPy_Interface0DIterator type definition ------------------------------*/
199
201 /*ob_base*/ PyVarObject_HEAD_INIT(nullptr, 0)
202 /*tp_name*/ "Interface0DIterator",
203 /*tp_basicsize*/ sizeof(BPy_Interface0DIterator),
204 /*tp_itemsize*/ 0,
205 /*tp_dealloc*/ nullptr,
206 /*tp_vectorcall_offset*/ 0,
207 /*tp_getattr*/ nullptr,
208 /*tp_setattr*/ nullptr,
209 /*tp_as_async*/ nullptr,
210 /*tp_repr*/ nullptr,
211 /*tp_as_number*/ nullptr,
212 /*tp_as_sequence*/ nullptr,
213 /*tp_as_mapping*/ nullptr,
214 /*tp_hash*/ nullptr,
215 /*tp_call*/ nullptr,
216 /*tp_str*/ nullptr,
217 /*tp_getattro*/ nullptr,
218 /*tp_setattro*/ nullptr,
219 /*tp_as_buffer*/ nullptr,
220 /*tp_flags*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
221 /*tp_doc*/ Interface0DIterator_doc,
222 /*tp_traverse*/ nullptr,
223 /*tp_clear*/ nullptr,
224 /*tp_richcompare*/ nullptr,
225 /*tp_weaklistoffset*/ 0,
226 /*tp_iter*/ (getiterfunc)Interface0DIterator_iter,
227 /*tp_iternext*/ (iternextfunc)Interface0DIterator_iternext,
228 /*tp_methods*/ nullptr,
229 /*tp_members*/ nullptr,
231 /*tp_base*/ &Iterator_Type,
232 /*tp_dict*/ nullptr,
233 /*tp_descr_get*/ nullptr,
234 /*tp_descr_set*/ nullptr,
235 /*tp_dictoffset*/ 0,
236 /*tp_init*/ (initproc)Interface0DIterator_init,
237 /*tp_alloc*/ nullptr,
238 /*tp_new*/ nullptr,
239};
240
PyObject * PyBool_from_bool(bool b)
PyObject * Any_BPy_Interface0D_from_Interface0D(Interface0D &if0D)
static PyObject * Interface0DIterator_object_get(BPy_Interface0DIterator *self, void *)
static int Interface0DIterator_init(BPy_Interface0DIterator *self, PyObject *args, PyObject *kwds)
PyDoc_STRVAR(Interface0DIterator_doc, "Class hierarchy: :class:`Iterator` > :class:`Interface0DIterator`\n" "\n" "Class defining an iterator over Interface0D elements. An instance of\n" "this iterator is always obtained from a 1D element.\n" "\n" ".. method:: __init__(brother)\n" " __init__(it)\n" "\n" " Construct a nested Interface0DIterator using either the copy constructor\n" " or the constructor that takes an argument of a Function0D.\n" "\n" " :arg brother: An Interface0DIterator object.\n" " :type brother: :class:`Interface0DIterator`\n" " :arg it: An iterator object to be nested.\n" " :type it: :class:`SVertexIterator` | :class:`CurvePointIterator` | " ":class:`StrokeVertexIterator`\n")
static PyObject * Interface0DIterator_t_get(BPy_Interface0DIterator *self, void *)
static int convert_nested_it(PyObject *obj, void *v)
static PyObject * Interface0DIterator_iternext(BPy_Interface0DIterator *self)
static PyObject * Interface0DIterator_at_last_get(BPy_Interface0DIterator *self, void *)
static PyObject * Interface0DIterator_u_get(BPy_Interface0DIterator *self, void *)
static PyGetSetDef BPy_Interface0DIterator_getseters[]
PyTypeObject Interface0DIterator_Type
static PyObject * Interface0DIterator_iter(BPy_Interface0DIterator *self)
PyTypeObject Interface1D_Type
PyTypeObject Iterator_Type
#define BPy_Iterator_Check(v)
ATTR_WARN_UNUSED_RESULT const BMVert * v
PyObject * self
inherits from class Rep
Definition AppCanvas.cpp:20