PyObject *Any_BPy_Interface0D_from_Interface0D(Interface0D& if0D) { if (typeid(if0D) == typeid(CurvePoint)) { return BPy_CurvePoint_from_CurvePoint(dynamic_cast<CurvePoint&>(if0D)); } else if (typeid(if0D) == typeid(StrokeVertex)) { return BPy_StrokeVertex_from_StrokeVertex(dynamic_cast<StrokeVertex&>(if0D)); } else if (typeid(if0D) == typeid(SVertex)) { return BPy_SVertex_from_SVertex(dynamic_cast<SVertex&>(if0D)); } else if (typeid(if0D) == typeid(ViewVertex)) { return BPy_ViewVertex_from_ViewVertex(dynamic_cast<ViewVertex&>(if0D)); } else if (typeid(if0D) == typeid(NonTVertex)) { return BPy_NonTVertex_from_NonTVertex(dynamic_cast<NonTVertex&>(if0D)); } else if (typeid(if0D) == typeid(TVertex)) { return BPy_TVertex_from_TVertex(dynamic_cast<TVertex&>(if0D)); } else if (typeid(if0D) == typeid(Interface0D)) { return BPy_Interface0D_from_Interface0D(if0D); } string msg("unexpected type: " + if0D.getExactTypeName()); PyErr_SetString(PyExc_TypeError, msg.c_str()); return NULL; }
static PyObject *StrokeVertexIterator_object_get(BPy_StrokeVertexIterator *self, void *UNUSED(closure)) { if (!self->reversed && self->sv_it->isEnd()) Py_RETURN_NONE; StrokeVertex *sv = self->sv_it->operator->(); if (sv) return BPy_StrokeVertex_from_StrokeVertex(*sv); Py_RETURN_NONE; }
static PyObject *Stroke_sq_item(BPy_Stroke *self, int keynum) { if (keynum < 0) keynum += Stroke_sq_length(self); if (keynum < 0 || keynum >= Stroke_sq_length(self)) { PyErr_Format(PyExc_IndexError, "Stroke[index]: index %d out of range", keynum); return NULL; } return BPy_StrokeVertex_from_StrokeVertex(self->s->strokeVerticeAt(keynum)); }
static PyObject *StrokeVertexIterator_object_get(BPy_StrokeVertexIterator *self, void *UNUSED(closure)) { if (self->sv_it->isEnd()) { PyErr_SetString(PyExc_RuntimeError, "iteration has stopped"); return NULL; } StrokeVertex *sv = self->sv_it->operator->(); if (sv) return BPy_StrokeVertex_from_StrokeVertex(*sv); Py_RETURN_NONE; }
static PyObject *StrokeVertexIterator_iternext(BPy_StrokeVertexIterator *self) { StrokeVertex *sv; if (self->reversed) { if (self->sv_it->isBegin()) { PyErr_SetNone(PyExc_StopIteration); return NULL; } self->sv_it->decrement(); sv = self->sv_it->operator->(); } else { if (self->sv_it->isEnd()) { PyErr_SetNone(PyExc_StopIteration); return NULL; } sv = self->sv_it->operator->(); self->sv_it->increment(); } return BPy_StrokeVertex_from_StrokeVertex(*sv); }
static PyObject *StrokeVertexIterator_iternext(BPy_StrokeVertexIterator *self) { /* Because Freestyle iterators for which it.isEnd() holds true have no valid object * (referencing it.object in this case leads to a crash), we must check if it.object * is valid after incrementing, to prevent crashes in Python. * Additionally, the at_start attribute is used to keep Freestyle iterator objects * and Python for loops in sync. */ if (self->reversed) { if (self->sv_it->isBegin()) { PyErr_SetNone(PyExc_StopIteration); return NULL; } self->sv_it->decrement(); } else { if (self->sv_it->isEnd()) { PyErr_SetNone(PyExc_StopIteration); return NULL; } /* if at the start of the iterator, only return the object * and don't increment, to keep for-loops in sync */ if (self->at_start) self->at_start = false; /* after incrementing, check if the iterator is at its end * exit the loop if it is. not doing so will result in a crash */ else { self->sv_it->increment(); if (self->sv_it->isEnd()) { PyErr_SetNone(PyExc_StopIteration); return NULL; } } } StrokeVertex *sv = self->sv_it->operator->(); return BPy_StrokeVertex_from_StrokeVertex(*sv); }