Blender  V3.3
BPy_Interface0DIterator.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
8 
9 #include "../BPy_Convert.h"
10 #include "../BPy_Interface1D.h"
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 using namespace Freestyle;
17 
19 
20 //------------------------INSTANCE METHODS ----------------------------------
21 
22 PyDoc_STRVAR(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 
40 static 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 
54 static 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};
59  Interface0DIteratorNested *nested_it;
60  PyObject *brother, *inter;
61 
62  if (PyArg_ParseTupleAndKeywords(
63  args, kwds, "O&", (char **)kwlist_1, convert_nested_it, &nested_it)) {
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  self->if0D_it = new Interface0DIterator(((BPy_Interface1D *)inter)->if1D->verticesBegin());
72  self->at_start = true;
73  self->reversed = false;
74  }
75  else if ((void)PyErr_Clear(),
76  PyArg_ParseTupleAndKeywords(
77  args, kwds, "O!", (char **)kwlist_3, &Interface0DIterator_Type, &brother)) {
78  self->if0D_it = new Interface0DIterator(*(((BPy_Interface0DIterator *)brother)->if0D_it));
79  self->at_start = ((BPy_Interface0DIterator *)brother)->at_start;
80  self->reversed = ((BPy_Interface0DIterator *)brother)->reversed;
81  }
82  else {
83  PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
84  return -1;
85  }
86  self->py_it.it = self->if0D_it;
87  return 0;
88 }
89 
91 {
92  Py_INCREF(self);
93  self->at_start = true;
94  return (PyObject *)self;
95 }
96 
98 {
99  if (self->reversed) {
100  if (self->if0D_it->isBegin()) {
101  PyErr_SetNone(PyExc_StopIteration);
102  return nullptr;
103  }
104  self->if0D_it->decrement();
105  }
106  else {
107  if (self->if0D_it->isEnd()) {
108  PyErr_SetNone(PyExc_StopIteration);
109  return nullptr;
110  }
111  if (self->at_start) {
112  self->at_start = false;
113  }
114  else if (self->if0D_it->atLast()) {
115  PyErr_SetNone(PyExc_StopIteration);
116  return nullptr;
117  }
118  else {
119  self->if0D_it->increment();
120  }
121  }
122  Interface0D *if0D = self->if0D_it->operator->();
124 }
125 
126 /*----------------------Interface0DIterator get/setters ----------------------------*/
127 
128 PyDoc_STRVAR(Interface0DIterator_object_doc,
129  "The 0D object currently pointed to by this iterator. Note that the object\n"
130  "may be an instance of an Interface0D subclass. For example if the iterator\n"
131  "has been created from the `vertices_begin()` method of the :class:`Stroke`\n"
132  "class, the .object property refers to a :class:`StrokeVertex` object.\n"
133  "\n"
134  ":type: :class:`Interface0D` or one of its subclasses.");
135 
137  void *UNUSED(closure))
138 {
139  if (self->if0D_it->isEnd()) {
140  PyErr_SetString(PyExc_RuntimeError, "iteration has stopped");
141  return nullptr;
142  }
143  return Any_BPy_Interface0D_from_Interface0D(self->if0D_it->operator*());
144 }
145 
146 PyDoc_STRVAR(Interface0DIterator_t_doc,
147  "The curvilinear abscissa of the current point.\n"
148  "\n"
149  ":type: float");
150 
151 static PyObject *Interface0DIterator_t_get(BPy_Interface0DIterator *self, void *UNUSED(closure))
152 {
153  return PyFloat_FromDouble(self->if0D_it->t());
154 }
155 
156 PyDoc_STRVAR(Interface0DIterator_u_doc,
157  "The point parameter at the current point in the 1D element (0 <= u <= 1).\n"
158  "\n"
159  ":type: float");
160 
161 static PyObject *Interface0DIterator_u_get(BPy_Interface0DIterator *self, void *UNUSED(closure))
162 {
163  return PyFloat_FromDouble(self->if0D_it->u());
164 }
165 
166 PyDoc_STRVAR(Interface0DIterator_at_last_doc,
167  "True if the iterator points to the last valid element.\n"
168  "For its counterpart (pointing to the first valid element), use it.is_begin.\n"
169  "\n"
170  ":type: bool");
171 
173  void *UNUSED(closure))
174 {
175  return PyBool_from_bool(self->if0D_it->atLast());
176 }
177 
178 static PyGetSetDef BPy_Interface0DIterator_getseters[] = {
179  {"object",
181  (setter) nullptr,
182  Interface0DIterator_object_doc,
183  nullptr},
184  {"t", (getter)Interface0DIterator_t_get, (setter) nullptr, Interface0DIterator_t_doc, nullptr},
185  {"u", (getter)Interface0DIterator_u_get, (setter) nullptr, Interface0DIterator_u_doc, nullptr},
186  {"at_last",
188  (setter) nullptr,
189  Interface0DIterator_at_last_doc,
190  nullptr},
191  {nullptr, nullptr, nullptr, nullptr, nullptr} /* Sentinel */
192 };
193 
194 /*-----------------------BPy_Interface0DIterator type definition ------------------------------*/
195 
196 PyTypeObject Interface0DIterator_Type = {
197  PyVarObject_HEAD_INIT(nullptr, 0) "Interface0DIterator", /* tp_name */
198  sizeof(BPy_Interface0DIterator), /* tp_basicsize */
199  0, /* tp_itemsize */
200  nullptr, /* tp_dealloc */
201  0, /* tp_vectorcall_offset */
202  nullptr, /* tp_getattr */
203  nullptr, /* tp_setattr */
204  nullptr, /* tp_reserved */
205  nullptr, /* tp_repr */
206  nullptr, /* tp_as_number */
207  nullptr, /* tp_as_sequence */
208  nullptr, /* tp_as_mapping */
209  nullptr, /* tp_hash */
210  nullptr, /* tp_call */
211  nullptr, /* tp_str */
212  nullptr, /* tp_getattro */
213  nullptr, /* tp_setattro */
214  nullptr, /* tp_as_buffer */
215  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
216  Interface0DIterator_doc, /* tp_doc */
217  nullptr, /* tp_traverse */
218  nullptr, /* tp_clear */
219  nullptr, /* tp_richcompare */
220  0, /* tp_weaklistoffset */
221  (getiterfunc)Interface0DIterator_iter, /* tp_iter */
222  (iternextfunc)Interface0DIterator_iternext, /* tp_iternext */
223  nullptr, /* tp_methods */
224  nullptr, /* tp_members */
225  BPy_Interface0DIterator_getseters, /* tp_getset */
226  &Iterator_Type, /* tp_base */
227  nullptr, /* tp_dict */
228  nullptr, /* tp_descr_get */
229  nullptr, /* tp_descr_set */
230  0, /* tp_dictoffset */
231  (initproc)Interface0DIterator_init, /* tp_init */
232  nullptr, /* tp_alloc */
233  nullptr, /* tp_new */
234 };
235 
237 
238 #ifdef __cplusplus
239 }
240 #endif
#define UNUSED(x)
PyObject * PyBool_from_bool(bool b)
Definition: BPy_Convert.cpp:59
PyObject * Any_BPy_Interface0D_from_Interface0D(Interface0D &if0D)
Definition: BPy_Convert.cpp:97
static PyObject * Interface0DIterator_iternext(BPy_Interface0DIterator *self)
static int Interface0DIterator_init(BPy_Interface0DIterator *self, PyObject *args, PyObject *kwds)
static PyObject * Interface0DIterator_u_get(BPy_Interface0DIterator *self, void *UNUSED(closure))
static PyObject * Interface0DIterator_object_get(BPy_Interface0DIterator *self, void *UNUSED(closure))
static int convert_nested_it(PyObject *obj, void *v)
static PyObject * Interface0DIterator_iter(BPy_Interface0DIterator *self)
static PyObject * Interface0DIterator_t_get(BPy_Interface0DIterator *self, void *UNUSED(closure))
static PyObject * Interface0DIterator_at_last_get(BPy_Interface0DIterator *self, void *UNUSED(closure))
static PyGetSetDef BPy_Interface0DIterator_getseters[]
PyTypeObject Interface0DIterator_Type
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 Interface1D_Type
PyTypeObject Iterator_Type
#define BPy_Iterator_Check(v)
Definition: BPy_Iterator.h:23
ATTR_WARN_UNUSED_RESULT const BMVert * v
PyObject * self
Definition: bpy_driver.c:165
inherits from class Rep
Definition: AppCanvas.cpp:18