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