Blender  V3.3
BPy_ViewEdgeIterator.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
7 #include "BPy_ViewEdgeIterator.h"
8 
9 #include "../BPy_Convert.h"
10 #include "../Interface1D/BPy_ViewEdge.h"
11 
12 #ifdef __cplusplus
13 extern "C" {
14 #endif
15 
16 using namespace Freestyle;
17 
19 
20 //------------------------INSTANCE METHODS ----------------------------------
21 
22 PyDoc_STRVAR(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` or 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`");
45 
46 static int check_begin(PyObject *obj, void *v)
47 {
48  if (obj != nullptr && obj != Py_None && !BPy_ViewEdge_Check(obj)) {
49  return 0;
50  }
51  *((PyObject **)v) = obj;
52  return 1;
53 }
54 
55 static int ViewEdgeIterator_init(BPy_ViewEdgeIterator *self, PyObject *args, PyObject *kwds)
56 {
57  static const char *kwlist_1[] = {"brother", nullptr};
58  static const char *kwlist_2[] = {"begin", "orientation", nullptr};
59  PyObject *obj1 = nullptr, *obj2 = nullptr;
60 
61  if (PyArg_ParseTupleAndKeywords(
62  args, kwds, "O!", (char **)kwlist_1, &ViewEdgeIterator_Type, &obj1)) {
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  ViewEdge *begin = (!obj1 || obj1 == Py_None) ? nullptr : ((BPy_ViewEdge *)obj1)->ve;
70  bool orientation = (!obj2) ? true : bool_from_PyBool(obj2);
71  self->ve_it = new ViewEdgeInternal::ViewEdgeIterator(begin, orientation);
72  }
73  else {
74  PyErr_SetString(PyExc_TypeError, "invalid argument(s)");
75  return -1;
76  }
77  self->py_it.it = self->ve_it;
78  return 0;
79 }
80 
81 PyDoc_STRVAR(ViewEdgeIterator_change_orientation_doc,
82  ".. method:: change_orientation()\n"
83  "\n"
84  " Changes the current orientation.");
85 
87 {
88  self->ve_it->changeOrientation();
89  Py_RETURN_NONE;
90 }
91 
92 static PyMethodDef BPy_ViewEdgeIterator_methods[] = {
93  {"change_orientation",
95  METH_NOARGS,
96  ViewEdgeIterator_change_orientation_doc},
97  {nullptr, nullptr, 0, nullptr},
98 };
99 
100 /*----------------------ViewEdgeIterator get/setters ----------------------------*/
101 
102 PyDoc_STRVAR(ViewEdgeIterator_object_doc,
103  "The ViewEdge object currently pointed by this iterator.\n"
104  "\n"
105  ":type: :class:`ViewEdge`");
106 
107 static PyObject *ViewEdgeIterator_object_get(BPy_ViewEdgeIterator *self, void *UNUSED(closure))
108 {
109  if (!self->ve_it->isEnd()) {
110  PyErr_SetString(PyExc_RuntimeError, "iteration has stopped");
111  return nullptr;
112  }
113  ViewEdge *ve = self->ve_it->operator*();
114  if (ve) {
115  return BPy_ViewEdge_from_ViewEdge(*ve);
116  }
117  Py_RETURN_NONE;
118 }
119 
120 PyDoc_STRVAR(ViewEdgeIterator_current_edge_doc,
121  "The ViewEdge object currently pointed by this iterator.\n"
122  "\n"
123  ":type: :class:`ViewEdge`");
124 
126  void *UNUSED(closure))
127 {
128  ViewEdge *ve = self->ve_it->getCurrentEdge();
129  if (ve) {
130  return BPy_ViewEdge_from_ViewEdge(*ve);
131  }
132  Py_RETURN_NONE;
133 }
134 
136  PyObject *value,
137  void *UNUSED(closure))
138 {
139  if (!BPy_ViewEdge_Check(value)) {
140  PyErr_SetString(PyExc_TypeError, "value must be a ViewEdge");
141  return -1;
142  }
143  self->ve_it->setCurrentEdge(((BPy_ViewEdge *)value)->ve);
144  return 0;
145 }
146 
147 PyDoc_STRVAR(ViewEdgeIterator_orientation_doc,
148  "The orientation of the pointed ViewEdge in the iteration.\n"
149  "If true, the iterator looks for the next ViewEdge among those ViewEdges\n"
150  "that surround the ending ViewVertex of the \"begin\" ViewEdge. If false,\n"
151  "the iterator searches over the ViewEdges surrounding the ending ViewVertex\n"
152  "of the \"begin\" ViewEdge.\n"
153  "\n"
154  ":type: bool");
155 
157  void *UNUSED(closure))
158 {
159  return PyBool_from_bool(self->ve_it->getOrientation());
160 }
161 
163  PyObject *value,
164  void *UNUSED(closure))
165 {
166  if (!PyBool_Check(value)) {
167  PyErr_SetString(PyExc_TypeError, "value must be a boolean");
168  return -1;
169  }
170  self->ve_it->setOrientation(bool_from_PyBool(value));
171  return 0;
172 }
173 
174 PyDoc_STRVAR(ViewEdgeIterator_begin_doc,
175  "The first ViewEdge used for the iteration.\n"
176  "\n"
177  ":type: :class:`ViewEdge`");
178 
179 static PyObject *ViewEdgeIterator_begin_get(BPy_ViewEdgeIterator *self, void *UNUSED(closure))
180 {
181  ViewEdge *ve = self->ve_it->getBegin();
182  if (ve) {
183  return BPy_ViewEdge_from_ViewEdge(*ve);
184  }
185  Py_RETURN_NONE;
186 }
187 
189  PyObject *value,
190  void *UNUSED(closure))
191 {
192  if (!BPy_ViewEdge_Check(value)) {
193  PyErr_SetString(PyExc_TypeError, "value must be a ViewEdge");
194  return -1;
195  }
196  self->ve_it->setBegin(((BPy_ViewEdge *)value)->ve);
197  return 0;
198 }
199 
200 static PyGetSetDef BPy_ViewEdgeIterator_getseters[] = {
201  {"object",
203  (setter) nullptr,
204  ViewEdgeIterator_object_doc,
205  nullptr},
206  {"current_edge",
209  ViewEdgeIterator_current_edge_doc,
210  nullptr},
211  {"orientation",
214  ViewEdgeIterator_orientation_doc,
215  nullptr},
216  {"begin",
219  ViewEdgeIterator_begin_doc,
220  nullptr},
221  {nullptr, nullptr, nullptr, nullptr, nullptr} /* Sentinel */
222 };
223 
224 /*-----------------------BPy_ViewEdgeIterator type definition ------------------------------*/
225 
226 PyTypeObject ViewEdgeIterator_Type = {
227  PyVarObject_HEAD_INIT(nullptr, 0) "ViewEdgeIterator", /* tp_name */
228  sizeof(BPy_ViewEdgeIterator), /* tp_basicsize */
229  0, /* tp_itemsize */
230  nullptr, /* tp_dealloc */
231  0, /* tp_vectorcall_offset */
232  nullptr, /* tp_getattr */
233  nullptr, /* tp_setattr */
234  nullptr, /* tp_reserved */
235  nullptr, /* tp_repr */
236  nullptr, /* tp_as_number */
237  nullptr, /* tp_as_sequence */
238  nullptr, /* tp_as_mapping */
239  nullptr, /* tp_hash */
240  nullptr, /* tp_call */
241  nullptr, /* tp_str */
242  nullptr, /* tp_getattro */
243  nullptr, /* tp_setattro */
244  nullptr, /* tp_as_buffer */
245  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
246  ViewEdgeIterator_doc, /* tp_doc */
247  nullptr, /* tp_traverse */
248  nullptr, /* tp_clear */
249  nullptr, /* tp_richcompare */
250  0, /* tp_weaklistoffset */
251  nullptr, /* tp_iter */
252  nullptr, /* tp_iternext */
253  BPy_ViewEdgeIterator_methods, /* tp_methods */
254  nullptr, /* tp_members */
255  BPy_ViewEdgeIterator_getseters, /* tp_getset */
256  &Iterator_Type, /* tp_base */
257  nullptr, /* tp_dict */
258  nullptr, /* tp_descr_get */
259  nullptr, /* tp_descr_set */
260  0, /* tp_dictoffset */
261  (initproc)ViewEdgeIterator_init, /* tp_init */
262  nullptr, /* tp_alloc */
263  nullptr, /* tp_new */
264 };
265 
267 
268 #ifdef __cplusplus
269 }
270 #endif
#define UNUSED(x)
PyObject * PyBool_from_bool(bool b)
Definition: BPy_Convert.cpp:59
bool bool_from_PyBool(PyObject *b)
PyObject * BPy_ViewEdge_from_ViewEdge(ViewEdge &ve)
PyTypeObject Iterator_Type
static PyObject * ViewEdgeIterator_orientation_get(BPy_ViewEdgeIterator *self, void *UNUSED(closure))
static int check_begin(PyObject *obj, void *v)
static int ViewEdgeIterator_current_edge_set(BPy_ViewEdgeIterator *self, PyObject *value, void *UNUSED(closure))
static PyObject * ViewEdgeIterator_begin_get(BPy_ViewEdgeIterator *self, void *UNUSED(closure))
static int ViewEdgeIterator_init(BPy_ViewEdgeIterator *self, PyObject *args, PyObject *kwds)
static int ViewEdgeIterator_begin_set(BPy_ViewEdgeIterator *self, PyObject *value, void *UNUSED(closure))
static PyMethodDef BPy_ViewEdgeIterator_methods[]
PyTypeObject ViewEdgeIterator_Type
static PyGetSetDef BPy_ViewEdgeIterator_getseters[]
static PyObject * ViewEdgeIterator_object_get(BPy_ViewEdgeIterator *self, void *UNUSED(closure))
static int ViewEdgeIterator_orientation_set(BPy_ViewEdgeIterator *self, PyObject *value, void *UNUSED(closure))
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` or 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_current_edge_get(BPy_ViewEdgeIterator *self, void *UNUSED(closure))
static PyObject * ViewEdgeIterator_change_orientation(BPy_ViewEdgeIterator *self)
#define BPy_ViewEdge_Check(v)
Definition: BPy_ViewEdge.h:21
ATTR_WARN_UNUSED_RESULT const BMVert * v
PyObject * self
Definition: bpy_driver.c:165
inherits from class Rep
Definition: AppCanvas.cpp:18