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