Blender  V3.3
BPy_Iterator.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include "BPy_Iterator.h"
8 
9 #include "BPy_Convert.h"
20 
21 #ifdef __cplusplus
22 extern "C" {
23 #endif
24 
25 using namespace Freestyle;
26 
28 
29 //-------------------MODULE INITIALIZATION--------------------------------
30 int Iterator_Init(PyObject *module)
31 {
32  if (module == nullptr) {
33  return -1;
34  }
35 
36  if (PyType_Ready(&Iterator_Type) < 0) {
37  return -1;
38  }
39  Py_INCREF(&Iterator_Type);
40  PyModule_AddObject(module, "Iterator", (PyObject *)&Iterator_Type);
41 
42  if (PyType_Ready(&AdjacencyIterator_Type) < 0) {
43  return -1;
44  }
45  Py_INCREF(&AdjacencyIterator_Type);
46  PyModule_AddObject(module, "AdjacencyIterator", (PyObject *)&AdjacencyIterator_Type);
47 
48  if (PyType_Ready(&Interface0DIterator_Type) < 0) {
49  return -1;
50  }
51  Py_INCREF(&Interface0DIterator_Type);
52  PyModule_AddObject(module, "Interface0DIterator", (PyObject *)&Interface0DIterator_Type);
53 
54  if (PyType_Ready(&CurvePointIterator_Type) < 0) {
55  return -1;
56  }
57  Py_INCREF(&CurvePointIterator_Type);
58  PyModule_AddObject(module, "CurvePointIterator", (PyObject *)&CurvePointIterator_Type);
59 
60  if (PyType_Ready(&StrokeVertexIterator_Type) < 0) {
61  return -1;
62  }
63  Py_INCREF(&StrokeVertexIterator_Type);
64  PyModule_AddObject(module, "StrokeVertexIterator", (PyObject *)&StrokeVertexIterator_Type);
65 
66  if (PyType_Ready(&SVertexIterator_Type) < 0) {
67  return -1;
68  }
69  Py_INCREF(&SVertexIterator_Type);
70  PyModule_AddObject(module, "SVertexIterator", (PyObject *)&SVertexIterator_Type);
71 
72  if (PyType_Ready(&orientedViewEdgeIterator_Type) < 0) {
73  return -1;
74  }
76  PyModule_AddObject(
77  module, "orientedViewEdgeIterator", (PyObject *)&orientedViewEdgeIterator_Type);
78 
79  if (PyType_Ready(&ViewEdgeIterator_Type) < 0) {
80  return -1;
81  }
82  Py_INCREF(&ViewEdgeIterator_Type);
83  PyModule_AddObject(module, "ViewEdgeIterator", (PyObject *)&ViewEdgeIterator_Type);
84 
85  if (PyType_Ready(&ChainingIterator_Type) < 0) {
86  return -1;
87  }
88  Py_INCREF(&ChainingIterator_Type);
89  PyModule_AddObject(module, "ChainingIterator", (PyObject *)&ChainingIterator_Type);
90 
91  if (PyType_Ready(&ChainPredicateIterator_Type) < 0) {
92  return -1;
93  }
94  Py_INCREF(&ChainPredicateIterator_Type);
95  PyModule_AddObject(module, "ChainPredicateIterator", (PyObject *)&ChainPredicateIterator_Type);
96 
97  if (PyType_Ready(&ChainSilhouetteIterator_Type) < 0) {
98  return -1;
99  }
100  Py_INCREF(&ChainSilhouetteIterator_Type);
101  PyModule_AddObject(module, "ChainSilhouetteIterator", (PyObject *)&ChainSilhouetteIterator_Type);
102 
103  return 0;
104 }
105 
106 //------------------------INSTANCE METHODS ----------------------------------
107 
108 PyDoc_STRVAR(Iterator_doc,
109  "Base class to define iterators.\n"
110  "\n"
111  ".. method:: __init__()\n"
112  "\n"
113  " Default constructor.");
114 
115 static int Iterator_init(BPy_Iterator *self, PyObject *args, PyObject *kwds)
116 {
117  static const char *kwlist[] = {nullptr};
118 
119  if (!PyArg_ParseTupleAndKeywords(args, kwds, "", (char **)kwlist)) {
120  return -1;
121  }
122  self->it = new Iterator();
123  return 0;
124 }
125 
126 static void Iterator_dealloc(BPy_Iterator *self)
127 {
128  delete self->it;
129  Py_TYPE(self)->tp_free((PyObject *)self);
130 }
131 
132 static PyObject *Iterator_repr(BPy_Iterator *self)
133 {
134  return PyUnicode_FromFormat("type: %s - address: %p", Py_TYPE(self)->tp_name, self->it);
135 }
136 
137 PyDoc_STRVAR(Iterator_increment_doc,
138  ".. method:: increment()\n"
139  "\n"
140  " Makes the iterator point the next element.");
141 
142 static PyObject *Iterator_increment(BPy_Iterator *self)
143 {
144  if (self->it->isEnd()) {
145  PyErr_SetString(PyExc_RuntimeError, "cannot increment any more");
146  return nullptr;
147  }
148  self->it->increment();
149  Py_RETURN_NONE;
150 }
151 
152 PyDoc_STRVAR(Iterator_decrement_doc,
153  ".. method:: decrement()\n"
154  "\n"
155  " Makes the iterator point the previous element.");
156 
157 static PyObject *Iterator_decrement(BPy_Iterator *self)
158 {
159  if (self->it->isBegin()) {
160  PyErr_SetString(PyExc_RuntimeError, "cannot decrement any more");
161  return nullptr;
162  }
163  self->it->decrement();
164  Py_RETURN_NONE;
165 }
166 
167 static PyMethodDef BPy_Iterator_methods[] = {
168  {"increment", (PyCFunction)Iterator_increment, METH_NOARGS, Iterator_increment_doc},
169  {"decrement", (PyCFunction)Iterator_decrement, METH_NOARGS, Iterator_decrement_doc},
170  {nullptr, nullptr, 0, nullptr},
171 };
172 
173 /*----------------------Iterator get/setters ----------------------------*/
174 
175 PyDoc_STRVAR(Iterator_name_doc,
176  "The string of the name of this iterator.\n"
177  "\n"
178  ":type: str");
179 
180 static PyObject *Iterator_name_get(BPy_Iterator *self, void *UNUSED(closure))
181 {
182  return PyUnicode_FromString(Py_TYPE(self)->tp_name);
183 }
184 
185 PyDoc_STRVAR(Iterator_is_begin_doc,
186  "True if the iterator points to the first element.\n"
187  "\n"
188  ":type: bool");
189 
190 static PyObject *Iterator_is_begin_get(BPy_Iterator *self, void *UNUSED(closure))
191 {
192  return PyBool_from_bool(self->it->isBegin());
193 }
194 
195 PyDoc_STRVAR(Iterator_is_end_doc,
196  "True if the iterator points to the last element.\n"
197  "\n"
198  ":type: bool");
199 
200 static PyObject *Iterator_is_end_get(BPy_Iterator *self, void *UNUSED(closure))
201 {
202  return PyBool_from_bool(self->it->isEnd());
203 }
204 
205 static PyGetSetDef BPy_Iterator_getseters[] = {
206  {"name", (getter)Iterator_name_get, (setter) nullptr, Iterator_name_doc, nullptr},
207  {"is_begin", (getter)Iterator_is_begin_get, (setter) nullptr, Iterator_is_begin_doc, nullptr},
208  {"is_end", (getter)Iterator_is_end_get, (setter) nullptr, Iterator_is_end_doc, nullptr},
209  {nullptr, nullptr, nullptr, nullptr, nullptr} /* Sentinel */
210 };
211 
212 /*-----------------------BPy_Iterator type definition ------------------------------*/
213 
214 PyTypeObject Iterator_Type = {
215  PyVarObject_HEAD_INIT(nullptr, 0) "Iterator", /* tp_name */
216  sizeof(BPy_Iterator), /* tp_basicsize */
217  0, /* tp_itemsize */
218  (destructor)Iterator_dealloc, /* tp_dealloc */
219  0, /* tp_vectorcall_offset */
220  nullptr, /* tp_getattr */
221  nullptr, /* tp_setattr */
222  nullptr, /* tp_reserved */
223  (reprfunc)Iterator_repr, /* tp_repr */
224  nullptr, /* tp_as_number */
225  nullptr, /* tp_as_sequence */
226  nullptr, /* tp_as_mapping */
227  nullptr, /* tp_hash */
228  nullptr, /* tp_call */
229  nullptr, /* tp_str */
230  nullptr, /* tp_getattro */
231  nullptr, /* tp_setattro */
232  nullptr, /* tp_as_buffer */
233  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
234  Iterator_doc, /* tp_doc */
235  nullptr, /* tp_traverse */
236  nullptr, /* tp_clear */
237  nullptr, /* tp_richcompare */
238  0, /* tp_weaklistoffset */
239  nullptr, /* tp_iter */
240  nullptr, /* tp_iternext */
241  BPy_Iterator_methods, /* tp_methods */
242  nullptr, /* tp_members */
243  BPy_Iterator_getseters, /* tp_getset */
244  nullptr, /* tp_base */
245  nullptr, /* tp_dict */
246  nullptr, /* tp_descr_get */
247  nullptr, /* tp_descr_set */
248  0, /* tp_dictoffset */
249  (initproc)Iterator_init, /* tp_init */
250  nullptr, /* tp_alloc */
251  PyType_GenericNew, /* tp_new */
252 };
253 
255 
256 #ifdef __cplusplus
257 }
258 #endif
#define UNUSED(x)
PyTypeObject AdjacencyIterator_Type
PyTypeObject ChainPredicateIterator_Type
PyTypeObject ChainSilhouetteIterator_Type
PyTypeObject ChainingIterator_Type
PyObject * PyBool_from_bool(bool b)
Definition: BPy_Convert.cpp:59
PyTypeObject CurvePointIterator_Type
PyTypeObject Interface0DIterator_Type
static PyObject * Iterator_name_get(BPy_Iterator *self, void *UNUSED(closure))
static PyObject * Iterator_decrement(BPy_Iterator *self)
static PyGetSetDef BPy_Iterator_getseters[]
static PyObject * Iterator_repr(BPy_Iterator *self)
static PyObject * Iterator_is_end_get(BPy_Iterator *self, void *UNUSED(closure))
static PyMethodDef BPy_Iterator_methods[]
static void Iterator_dealloc(BPy_Iterator *self)
static PyObject * Iterator_is_begin_get(BPy_Iterator *self, void *UNUSED(closure))
static PyObject * Iterator_increment(BPy_Iterator *self)
static int Iterator_init(BPy_Iterator *self, PyObject *args, PyObject *kwds)
PyTypeObject Iterator_Type
int Iterator_Init(PyObject *module)
PyDoc_STRVAR(Iterator_doc, "Base class to define iterators.\n" "\n" ".. method:: __init__()\n" "\n" " Default constructor.")
PyTypeObject SVertexIterator_Type
PyTypeObject StrokeVertexIterator_Type
PyTypeObject ViewEdgeIterator_Type
PyTypeObject orientedViewEdgeIterator_Type
PyObject * self
Definition: bpy_driver.c:165
inherits from class Rep
Definition: AppCanvas.cpp:18
static struct PyModuleDef module
Definition: python.cpp:972