Blender V5.0
BPy_ViewEdgeIterator.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"
13
14using namespace Freestyle;
15
17
18//------------------------INSTANCE METHODS ----------------------------------
19
21 /* Wrap. */
22 ViewEdgeIterator_doc,
23 "Class hierarchy: :class:`Iterator` > :class:`ViewEdgeIterator`\n"
24 "\n"
25 "Base class for iterators over ViewEdges of the :class:`ViewMap` Graph.\n"
26 "Basically the increment() operator of this class should be able to\n"
27 "take the decision of \"where\" (on which ViewEdge) to go when pointing\n"
28 "on a given ViewEdge.\n"
29 "\n"
30 ".. method:: __init__(begin=None, orientation=True)\n"
31 " __init__(brother)\n"
32 "\n"
33 " Builds a ViewEdgeIterator from a starting ViewEdge and its\n"
34 " orientation or the copy constructor.\n"
35 "\n"
36 " :arg begin: The ViewEdge from where to start the iteration.\n"
37 " :type begin: :class:`ViewEdge` | None\n"
38 " :arg orientation: If true, we'll look for the next ViewEdge among\n"
39 " the ViewEdges that surround the ending ViewVertex of begin. If\n"
40 " false, we'll search over the ViewEdges surrounding the ending\n"
41 " ViewVertex of begin.\n"
42 " :type orientation: bool\n"
43 " :arg brother: A ViewEdgeIterator object.\n"
44 " :type brother: :class:`ViewEdgeIterator`\n");
45static int check_begin(PyObject *obj, void *v)
46{
47 if (obj != nullptr && obj != Py_None && !BPy_ViewEdge_Check(obj)) {
48 return 0;
49 }
50 *((PyObject **)v) = obj;
51 return 1;
52}
53
54static int ViewEdgeIterator_init(BPy_ViewEdgeIterator *self, PyObject *args, PyObject *kwds)
55{
56 static const char *kwlist_1[] = {"brother", nullptr};
57 static const char *kwlist_2[] = {"begin", "orientation", nullptr};
58 PyObject *obj1 = nullptr, *obj2 = nullptr;
59
60 if (PyArg_ParseTupleAndKeywords(
61 args, kwds, "O!", (char **)kwlist_1, &ViewEdgeIterator_Type, &obj1))
62 {
63 self->ve_it = new ViewEdgeInternal::ViewEdgeIterator(*(((BPy_ViewEdgeIterator *)obj1)->ve_it));
64 }
65 else if ((void)PyErr_Clear(),
66 (void)(obj1 = obj2 = nullptr),
67 PyArg_ParseTupleAndKeywords(
68 args, kwds, "|O&O!", (char **)kwlist_2, check_begin, &obj1, &PyBool_Type, &obj2))
69 {
70 ViewEdge *begin = (!obj1 || obj1 == Py_None) ? nullptr : ((BPy_ViewEdge *)obj1)->ve;
71 bool orientation = (!obj2) ? true : bool_from_PyBool(obj2);
72 self->ve_it = new ViewEdgeInternal::ViewEdgeIterator(begin, orientation);
73 }
74 else {
75 PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
76 return -1;
77 }
78 self->py_it.it = self->ve_it;
79 return 0;
80}
81
83 /* Wrap. */
84 ViewEdgeIterator_change_orientation_doc,
85 ".. method:: change_orientation()\n"
86 "\n"
87 " Changes the current orientation.\n");
89{
90 self->ve_it->changeOrientation();
91 Py_RETURN_NONE;
92}
93
94#ifdef __GNUC__
95# ifdef __clang__
96# pragma clang diagnostic push
97# pragma clang diagnostic ignored "-Wcast-function-type"
98# else
99# pragma GCC diagnostic push
100# pragma GCC diagnostic ignored "-Wcast-function-type"
101# endif
102#endif
103
104static PyMethodDef BPy_ViewEdgeIterator_methods[] = {
105 {"change_orientation",
107 METH_NOARGS,
108 ViewEdgeIterator_change_orientation_doc},
109 {nullptr, nullptr, 0, nullptr},
110};
111
112#ifdef __GNUC__
113# ifdef __clang__
114# pragma clang diagnostic pop
115# else
116# pragma GCC diagnostic pop
117# endif
118#endif
119
120/*----------------------ViewEdgeIterator get/setters ----------------------------*/
121
123 /* Wrap. */
124 ViewEdgeIterator_object_doc,
125 "The ViewEdge object currently pointed by this iterator.\n"
126 "\n"
127 ":type: :class:`ViewEdge`\n");
128static PyObject *ViewEdgeIterator_object_get(BPy_ViewEdgeIterator *self, void * /*closure*/)
129{
130 if (!self->ve_it->isEnd()) {
131 PyErr_SetString(PyExc_RuntimeError, "iteration has stopped");
132 return nullptr;
133 }
134 ViewEdge *ve = self->ve_it->operator*();
135 if (ve) {
136 return BPy_ViewEdge_from_ViewEdge(*ve);
137 }
138 Py_RETURN_NONE;
139}
140
142 /* Wrap. */
143 ViewEdgeIterator_current_edge_doc,
144 "The ViewEdge object currently pointed by this iterator.\n"
145 "\n"
146 ":type: :class:`ViewEdge`\n");
147static PyObject *ViewEdgeIterator_current_edge_get(BPy_ViewEdgeIterator *self, void * /*closure*/)
148{
149 ViewEdge *ve = self->ve_it->getCurrentEdge();
150 if (ve) {
151 return BPy_ViewEdge_from_ViewEdge(*ve);
152 }
153 Py_RETURN_NONE;
154}
155
157 PyObject *value,
158 void * /*closure*/)
159{
160 if (!BPy_ViewEdge_Check(value)) {
161 PyErr_SetString(PyExc_TypeError, "value must be a ViewEdge");
162 return -1;
163 }
164 self->ve_it->setCurrentEdge(((BPy_ViewEdge *)value)->ve);
165 return 0;
166}
167
169 /* Wrap. */
170 ViewEdgeIterator_orientation_doc,
171 "The orientation of the pointed ViewEdge in the iteration.\n"
172 "If true, the iterator looks for the next ViewEdge among those ViewEdges\n"
173 "that surround the ending ViewVertex of the \"begin\" ViewEdge. If false,\n"
174 "the iterator searches over the ViewEdges surrounding the ending ViewVertex\n"
175 "of the \"begin\" ViewEdge.\n"
176 "\n"
177 ":type: bool\n");
178static PyObject *ViewEdgeIterator_orientation_get(BPy_ViewEdgeIterator *self, void * /*closure*/)
179{
180 return PyBool_from_bool(self->ve_it->getOrientation());
181}
182
184 PyObject *value,
185 void * /*closure*/)
186{
187 if (!PyBool_Check(value)) {
188 PyErr_SetString(PyExc_TypeError, "value must be a boolean");
189 return -1;
190 }
191 self->ve_it->setOrientation(bool_from_PyBool(value));
192 return 0;
193}
194
196 /* Wrap. */
197 ViewEdgeIterator_begin_doc,
198 "The first ViewEdge used for the iteration.\n"
199 "\n"
200 ":type: :class:`ViewEdge`\n");
201static PyObject *ViewEdgeIterator_begin_get(BPy_ViewEdgeIterator *self, void * /*closure*/)
202{
203 ViewEdge *ve = self->ve_it->getBegin();
204 if (ve) {
205 return BPy_ViewEdge_from_ViewEdge(*ve);
206 }
207 Py_RETURN_NONE;
208}
209
211 PyObject *value,
212 void * /*closure*/)
213{
214 if (!BPy_ViewEdge_Check(value)) {
215 PyErr_SetString(PyExc_TypeError, "value must be a ViewEdge");
216 return -1;
217 }
218 self->ve_it->setBegin(((BPy_ViewEdge *)value)->ve);
219 return 0;
220}
221
222static PyGetSetDef BPy_ViewEdgeIterator_getseters[] = {
223 {"object",
225 (setter) nullptr,
226 ViewEdgeIterator_object_doc,
227 nullptr},
228 {"current_edge",
231 ViewEdgeIterator_current_edge_doc,
232 nullptr},
233 {"orientation",
236 ViewEdgeIterator_orientation_doc,
237 nullptr},
238 {"begin",
241 ViewEdgeIterator_begin_doc,
242 nullptr},
243 {nullptr, nullptr, nullptr, nullptr, nullptr} /* Sentinel */
244};
245
246/*-----------------------BPy_ViewEdgeIterator type definition ------------------------------*/
247
248PyTypeObject ViewEdgeIterator_Type = {
249 /*ob_base*/ PyVarObject_HEAD_INIT(nullptr, 0)
250 /*tp_name*/ "ViewEdgeIterator",
251 /*tp_basicsize*/ sizeof(BPy_ViewEdgeIterator),
252 /*tp_itemsize*/ 0,
253 /*tp_dealloc*/ nullptr,
254 /*tp_vectorcall_offset*/ 0,
255 /*tp_getattr*/ nullptr,
256 /*tp_setattr*/ nullptr,
257 /*tp_as_async*/ nullptr,
258 /*tp_repr*/ nullptr,
259 /*tp_as_number*/ nullptr,
260 /*tp_as_sequence*/ nullptr,
261 /*tp_as_mapping*/ nullptr,
262 /*tp_hash*/ nullptr,
263 /*tp_call*/ nullptr,
264 /*tp_str*/ nullptr,
265 /*tp_getattro*/ nullptr,
266 /*tp_setattro*/ nullptr,
267 /*tp_as_buffer*/ nullptr,
268 /*tp_flags*/ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
269 /*tp_doc*/ ViewEdgeIterator_doc,
270 /*tp_traverse*/ nullptr,
271 /*tp_clear*/ nullptr,
272 /*tp_richcompare*/ nullptr,
273 /*tp_weaklistoffset*/ 0,
274 /*tp_iter*/ nullptr,
275 /*tp_iternext*/ nullptr,
276 /*tp_methods*/ BPy_ViewEdgeIterator_methods,
277 /*tp_members*/ nullptr,
278 /*tp_getset*/ BPy_ViewEdgeIterator_getseters,
279 /*tp_base*/ &Iterator_Type,
280 /*tp_dict*/ nullptr,
281 /*tp_descr_get*/ nullptr,
282 /*tp_descr_set*/ nullptr,
283 /*tp_dictoffset*/ 0,
284 /*tp_init*/ (initproc)ViewEdgeIterator_init,
285 /*tp_alloc*/ nullptr,
286 /*tp_new*/ nullptr,
287};
288
static int check_begin(PyObject *obj, void *v)
bool bool_from_PyBool(PyObject *b)
PyObject * BPy_ViewEdge_from_ViewEdge(ViewEdge &ve)
PyObject * PyBool_from_bool(bool b)
PyTypeObject Iterator_Type
PyDoc_STRVAR(ViewEdgeIterator_doc, "Class hierarchy: :class:`Iterator` > :class:`ViewEdgeIterator`\n" "\n" "Base class for iterators over ViewEdges of the :class:`ViewMap` Graph.\n" "Basically the increment() operator of this class should be able to\n" "take the decision of \"where\" (on which ViewEdge) to go when pointing\n" "on a given ViewEdge.\n" "\n" ".. method:: __init__(begin=None, orientation=True)\n" " __init__(brother)\n" "\n" " Builds a ViewEdgeIterator from a starting ViewEdge and its\n" " orientation or the copy constructor.\n" "\n" " :arg begin: The ViewEdge from where to start the iteration.\n" " :type begin: :class:`ViewEdge` | None\n" " :arg orientation: If true, we'll look for the next ViewEdge among\n" " the ViewEdges that surround the ending ViewVertex of begin. If\n" " false, we'll search over the ViewEdges surrounding the ending\n" " ViewVertex of begin.\n" " :type orientation: bool\n" " :arg brother: A ViewEdgeIterator object.\n" " :type brother: :class:`ViewEdgeIterator`\n")
static int check_begin(PyObject *obj, void *v)
static PyObject * ViewEdgeIterator_orientation_get(BPy_ViewEdgeIterator *self, void *)
static int ViewEdgeIterator_current_edge_set(BPy_ViewEdgeIterator *self, PyObject *value, void *)
static PyObject * ViewEdgeIterator_change_orientation(BPy_ViewEdgeIterator *self)
static int ViewEdgeIterator_init(BPy_ViewEdgeIterator *self, PyObject *args, PyObject *kwds)
static PyMethodDef BPy_ViewEdgeIterator_methods[]
static PyObject * ViewEdgeIterator_current_edge_get(BPy_ViewEdgeIterator *self, void *)
PyTypeObject ViewEdgeIterator_Type
static PyGetSetDef BPy_ViewEdgeIterator_getseters[]
static int ViewEdgeIterator_orientation_set(BPy_ViewEdgeIterator *self, PyObject *value, void *)
static int ViewEdgeIterator_begin_set(BPy_ViewEdgeIterator *self, PyObject *value, void *)
static PyObject * ViewEdgeIterator_begin_get(BPy_ViewEdgeIterator *self, void *)
static PyObject * ViewEdgeIterator_object_get(BPy_ViewEdgeIterator *self, void *)
#define BPy_ViewEdge_Check(v)
iter begin(iter)
ATTR_WARN_UNUSED_RESULT const BMVert * v
PyObject * self
inherits from class Rep
Definition AppCanvas.cpp:20