Blender V4.5
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 he 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`, or\n"
38 " :class:`StrokeVertexIterator`");
39
40static int convert_nested_it(PyObject *obj, void *v)
41{
42 if (!obj || !BPy_Iterator_Check(obj)) {
43 return 0;
44 }
45 Interface0DIteratorNested *nested_it = dynamic_cast<Interface0DIteratorNested *>(
46 ((BPy_Iterator *)obj)->it);
47 if (!nested_it) {
48 return 0;
49 }
50 *((Interface0DIteratorNested **)v) = nested_it;
51 return 1;
52}
53
54static int Interface0DIterator_init(BPy_Interface0DIterator *self, PyObject *args, PyObject *kwds)
55{
56 static const char *kwlist_1[] = {"it", nullptr};
57 static const char *kwlist_2[] = {"inter", nullptr};
58 static const char *kwlist_3[] = {"brother", nullptr};
60 PyObject *brother, *inter;
61
62 if (PyArg_ParseTupleAndKeywords(
63 args, kwds, "O&", (char **)kwlist_1, convert_nested_it, &nested_it))
64 {
65 self->if0D_it = new Interface0DIterator(nested_it->copy());
66 self->at_start = true;
67 self->reversed = false;
68 }
69 else if ((void)PyErr_Clear(),
70 PyArg_ParseTupleAndKeywords(
71 args, kwds, "O!", (char **)kwlist_2, &Interface1D_Type, &inter))
72 {
73 self->if0D_it = new Interface0DIterator(((BPy_Interface1D *)inter)->if1D->verticesBegin());
74 self->at_start = true;
75 self->reversed = false;
76 }
77 else if ((void)PyErr_Clear(),
78 PyArg_ParseTupleAndKeywords(
79 args, kwds, "O!", (char **)kwlist_3, &Interface0DIterator_Type, &brother))
80 {
81 self->if0D_it = new Interface0DIterator(*(((BPy_Interface0DIterator *)brother)->if0D_it));
82 self->at_start = ((BPy_Interface0DIterator *)brother)->at_start;
83 self->reversed = ((BPy_Interface0DIterator *)brother)->reversed;
84 }
85 else {
86 PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
87 return -1;
88 }
89 self->py_it.it = self->if0D_it;
90 return 0;
91}
92
94{
95 Py_INCREF(self);
96 self->at_start = true;
97 return (PyObject *)self;
98}
99
101{
102 if (self->reversed) {
103 if (self->if0D_it->isBegin()) {
104 PyErr_SetNone(PyExc_StopIteration);
105 return nullptr;
106 }
107 self->if0D_it->decrement();
108 }
109 else {
110 if (self->if0D_it->isEnd()) {
111 PyErr_SetNone(PyExc_StopIteration);
112 return nullptr;
113 }
114 if (self->at_start) {
115 self->at_start = false;
116 }
117 else if (self->if0D_it->atLast()) {
118 PyErr_SetNone(PyExc_StopIteration);
119 return nullptr;
120 }
121 else {
122 self->if0D_it->increment();
123 }
124 }
125 Interface0D *if0D = self->if0D_it->operator->();
127}
128
129/*----------------------Interface0DIterator get/setters ----------------------------*/
130
132 /* Wrap. */
133 Interface0DIterator_object_doc,
134 "The 0D object currently pointed to by this iterator. Note that the object\n"
135 "may be an instance of an Interface0D subclass. For example if the iterator\n"
136 "has been created from the `vertices_begin()` method of the :class:`Stroke`\n"
137 "class, the .object property refers to a :class:`StrokeVertex` object.\n"
138 "\n"
139 ":type: :class:`Interface0D` or one of its subclasses.");
140
141static PyObject *Interface0DIterator_object_get(BPy_Interface0DIterator *self, void * /*closure*/)
142{
143 if (self->if0D_it->isEnd()) {
144 PyErr_SetString(PyExc_RuntimeError, "iteration has stopped");
145 return nullptr;
146 }
147 return Any_BPy_Interface0D_from_Interface0D(self->if0D_it->operator*());
148}
149
151 /* Wrap. */
152 Interface0DIterator_t_doc,
153 "The curvilinear abscissa of the current point.\n"
154 "\n"
155 ":type: float");
156
157static PyObject *Interface0DIterator_t_get(BPy_Interface0DIterator *self, void * /*closure*/)
158{
159 return PyFloat_FromDouble(self->if0D_it->t());
160}
161
163 /* Wrap. */
164 Interface0DIterator_u_doc,
165 "The point parameter at the current point in the 1D element (0 <= u <= 1).\n"
166 "\n"
167 ":type: float");
168
169static PyObject *Interface0DIterator_u_get(BPy_Interface0DIterator *self, void * /*closure*/)
170{
171 return PyFloat_FromDouble(self->if0D_it->u());
172}
173
175 /* Wrap. */
176 Interface0DIterator_at_last_doc,
177 "True if the iterator points to the last valid element.\n"
178 "For its counterpart (pointing to the first valid element), use it.is_begin.\n"
179 "\n"
180 ":type: bool");
181
183{
184 return PyBool_from_bool(self->if0D_it->atLast());
185}
186
187static PyGetSetDef BPy_Interface0DIterator_getseters[] = {
188 {"object",
190 (setter) nullptr,
191 Interface0DIterator_object_doc,
192 nullptr},
193 {"t", (getter)Interface0DIterator_t_get, (setter) nullptr, Interface0DIterator_t_doc, nullptr},
194 {"u", (getter)Interface0DIterator_u_get, (setter) nullptr, Interface0DIterator_u_doc, nullptr},
195 {"at_last",
197 (setter) nullptr,
198 Interface0DIterator_at_last_doc,
199 nullptr},
200 {nullptr, nullptr, nullptr, nullptr, nullptr} /* Sentinel */
201};
202
203/*-----------------------BPy_Interface0DIterator type definition ------------------------------*/
204
206 /*ob_base*/ PyVarObject_HEAD_INIT(nullptr, 0)
207 /*tp_name*/ "Interface0DIterator",
208 /*tp_basicsize*/ sizeof(BPy_Interface0DIterator),
209 /*tp_itemsize*/ 0,
210 /*tp_dealloc*/ nullptr,
211 /*tp_vectorcall_offset*/ 0,
212 /*tp_getattr*/ nullptr,
213 /*tp_setattr*/ nullptr,
214 /*tp_as_async*/ nullptr,
215 /*tp_repr*/ nullptr,
216 /*tp_as_number*/ nullptr,
217 /*tp_as_sequence*/ nullptr,
218 /*tp_as_mapping*/ nullptr,
219 /*tp_hash*/ nullptr,
220 /*tp_call*/ nullptr,
221 /*tp_str*/ nullptr,
222 /*tp_getattro*/ nullptr,
223 /*tp_setattro*/ nullptr,
224 /*tp_as_buffer*/ nullptr,
225 /*tp_flags*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
226 /*tp_doc*/ Interface0DIterator_doc,
227 /*tp_traverse*/ nullptr,
228 /*tp_clear*/ nullptr,
229 /*tp_richcompare*/ nullptr,
230 /*tp_weaklistoffset*/ 0,
231 /*tp_iter*/ (getiterfunc)Interface0DIterator_iter,
232 /*tp_iternext*/ (iternextfunc)Interface0DIterator_iternext,
233 /*tp_methods*/ nullptr,
234 /*tp_members*/ nullptr,
236 /*tp_base*/ &Iterator_Type,
237 /*tp_dict*/ nullptr,
238 /*tp_descr_get*/ nullptr,
239 /*tp_descr_set*/ nullptr,
240 /*tp_dictoffset*/ 0,
241 /*tp_init*/ (initproc)Interface0DIterator_init,
242 /*tp_alloc*/ nullptr,
243 /*tp_new*/ nullptr,
244};
245
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)
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[]
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 he 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`, or\n" " :class:`StrokeVertexIterator`")
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