diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2009-08-01 02:13:48 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2009-08-01 02:13:48 +0400 |
commit | ba9943e4a7a6c671e427c08fc11845168a30e86a (patch) | |
tree | 99310397139b528b4ba46012389aea490597a78f /source/blender/freestyle/intern/python/Iterator | |
parent | 6134a41270ab7629bb6e09de5462ba386861ede3 (diff) |
* Implemented Python's iterator protocol in Interface0DIterator and
orientedViewEdgeIterator.
* Simplified Python-related error handling in C++ class definitions.
The definitions of the following C++ methods were simplified and most
code segments using the C/Python API were moved to Director.cpp.
ChainingIterator::init()
ChainingIterator::traverse()
UnaryPredicate0D::operator()()
UnaryPredicate1D::operator()()
BinaryPredicate0D::operator()()
BinaryPredicate1D::operator()()
UnaryFunction0D::operator()()
UnaryFunction1D::operator()()
StrokeShader.shade()
* Moved part of the introspection-based automatic type conversion code
from BPy_Interface0DIterator.cpp and Director.cpp to BPy_Convert.cpp
for the sake of better code organization.
* Fixed an uninitialized member in StrokeVertexIterator___init__().
Diffstat (limited to 'source/blender/freestyle/intern/python/Iterator')
6 files changed, 54 insertions, 23 deletions
diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp index ad276a7521b..490c8fdf70f 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_CurvePointIterator.cpp @@ -152,7 +152,7 @@ PyObject * CurvePointIterator_u( BPy_CurvePointIterator *self ) { PyObject * CurvePointIterator_castToInterface0DIterator( BPy_CurvePointIterator *self ) { Interface0DIterator it( self->cp_it->castToInterface0DIterator() ); - return BPy_Interface0DIterator_from_Interface0DIterator( it ); + return BPy_Interface0DIterator_from_Interface0DIterator( it, 0 ); } PyObject * CurvePointIterator_getObject(BPy_CurvePointIterator *self) { diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp index 096baad2936..4a9d601de25 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.cpp @@ -10,6 +10,7 @@ extern "C" { /*--------------- Python API function prototypes for Interface0DIterator instance -----------*/ static int Interface0DIterator___init__(BPy_Interface0DIterator *self, PyObject *args); +static PyObject * Interface0DIterator_iternext( BPy_Interface0DIterator *self ); static PyObject * Interface0DIterator_t( BPy_Interface0DIterator *self ); static PyObject * Interface0DIterator_u( BPy_Interface0DIterator *self ); @@ -78,8 +79,8 @@ PyTypeObject Interface0DIterator_Type = { /*** Added in release 2.2 ***/ /* Iterators */ - NULL, /* getiterfunc tp_iter; */ - NULL, /* iternextfunc tp_iternext; */ + PyObject_SelfIter, /* getiterfunc tp_iter; */ + (iternextfunc)Interface0DIterator_iternext, /* iternextfunc tp_iternext; */ /*** Attribute descriptor and subclassing stuff ***/ BPy_Interface0DIterator_methods, /* struct PyMethodDef *tp_methods; */ @@ -123,10 +124,31 @@ int Interface0DIterator___init__(BPy_Interface0DIterator *self, PyObject *args ) self->if0D_it = new Interface0DIterator(*( ((BPy_Interface0DIterator *) obj)->if0D_it )); self->py_it.it = self->if0D_it; + self->reversed = 0; return 0; } +PyObject * Interface0DIterator_iternext( BPy_Interface0DIterator *self ) { + Interface0D *if0D; + if (self->reversed) { + if (self->if0D_it->isBegin()) { + PyErr_SetNone(PyExc_StopIteration); + return NULL; + } + self->if0D_it->decrement(); + if0D = self->if0D_it->operator->(); + } else { + if (self->if0D_it->isEnd()) { + PyErr_SetNone(PyExc_StopIteration); + return NULL; + } + if0D = self->if0D_it->operator->(); + self->if0D_it->increment(); + } + return BPy_Interface0D_from_Interface0D( *if0D ); +} + PyObject * Interface0DIterator_t( BPy_Interface0DIterator *self ) { return PyFloat_FromDouble( self->if0D_it->t() ); } @@ -136,23 +158,7 @@ PyObject * Interface0DIterator_u( BPy_Interface0DIterator *self ) { } PyObject * Interface0DIterator_getObject(BPy_Interface0DIterator *self) { - Interface0D &if0D = self->if0D_it->operator*(); - if (typeid(if0D) == typeid(CurvePoint)) { - return BPy_CurvePoint_from_CurvePoint_ptr(dynamic_cast<CurvePoint*>(&if0D)); - } else if (typeid(if0D) == typeid(StrokeVertex)) { - return BPy_StrokeVertex_from_StrokeVertex_ptr(dynamic_cast<StrokeVertex*>(&if0D)); - } else if (typeid(if0D) == typeid(SVertex)) { - return BPy_SVertex_from_SVertex_ptr(dynamic_cast<SVertex*>(&if0D)); - } else if (typeid(if0D) == typeid(ViewVertex)) { - return BPy_ViewVertex_from_ViewVertex_ptr(dynamic_cast<ViewVertex*>(&if0D)); - } else if (typeid(if0D) == typeid(NonTVertex)) { - return BPy_NonTVertex_from_NonTVertex_ptr(dynamic_cast<NonTVertex*>(&if0D)); - } else if (typeid(if0D) == typeid(TVertex)) { - return BPy_TVertex_from_TVertex_ptr(dynamic_cast<TVertex*>(&if0D)); - } else { - cerr << "Warning: cast to " << if0D.getExactTypeName() << " not implemented" << endl; - return BPy_Interface0D_from_Interface0D(if0D); - } + return BPy_Interface0D_from_Interface0D( self->if0D_it->operator*() ); } diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h index c829d3d9d31..1972763b2eb 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_Interface0DIterator.h @@ -21,6 +21,7 @@ extern PyTypeObject Interface0DIterator_Type; typedef struct { BPy_Iterator py_it; Interface0DIterator *if0D_it; + int reversed; } BPy_Interface0DIterator; /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp index c6240b527d0..86af40ebc36 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_StrokeVertexIterator.cpp @@ -137,6 +137,7 @@ int StrokeVertexIterator___init__(BPy_StrokeVertexIterator *self, PyObject *args } self->py_it.it = self->sv_it; + self->reversed = 0; return 0; } @@ -171,7 +172,7 @@ PyObject * StrokeVertexIterator_u( BPy_StrokeVertexIterator *self ) { PyObject * StrokeVertexIterator_castToInterface0DIterator( BPy_StrokeVertexIterator *self ) { Interface0DIterator it( self->sv_it->castToInterface0DIterator() ); - return BPy_Interface0DIterator_from_Interface0DIterator( it ); + return BPy_Interface0DIterator_from_Interface0DIterator( it, 0 ); } PyObject * StrokeVertexIterator_getObject( BPy_StrokeVertexIterator *self) { diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp index 45f6cadeb81..ab7e2cb4e0e 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp +++ b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.cpp @@ -10,6 +10,7 @@ extern "C" { /*--------------- Python API function prototypes for orientedViewEdgeIterator instance -----------*/ static int orientedViewEdgeIterator___init__(BPy_orientedViewEdgeIterator *self, PyObject *args); +static PyObject * orientedViewEdgeIterator_iternext(BPy_orientedViewEdgeIterator *self); static PyObject * orientedViewEdgeIterator_getObject(BPy_orientedViewEdgeIterator *self); @@ -74,8 +75,8 @@ PyTypeObject orientedViewEdgeIterator_Type = { /*** Added in release 2.2 ***/ /* Iterators */ - NULL, /* getiterfunc tp_iter; */ - NULL, /* iternextfunc tp_iternext; */ + PyObject_SelfIter, /* getiterfunc tp_iter; */ + (iternextfunc)orientedViewEdgeIterator_iternext, /* iternextfunc tp_iternext; */ /*** Attribute descriptor and subclassing stuff ***/ BPy_orientedViewEdgeIterator_methods, /* struct PyMethodDef *tp_methods; */ @@ -124,10 +125,31 @@ int orientedViewEdgeIterator___init__(BPy_orientedViewEdgeIterator *self, PyObje } self->py_it.it = self->ove_it; + self->reversed = 0; return 0; } +PyObject * orientedViewEdgeIterator_iternext( BPy_orientedViewEdgeIterator *self ) { + ViewVertex::directedViewEdge *dve; + if (self->reversed) { + if (self->ove_it->isBegin()) { + PyErr_SetNone(PyExc_StopIteration); + return NULL; + } + self->ove_it->decrement(); + dve = self->ove_it->operator->(); + } else { + if (self->ove_it->isEnd()) { + PyErr_SetNone(PyExc_StopIteration); + return NULL; + } + dve = self->ove_it->operator->(); + self->ove_it->increment(); + } + return BPy_directedViewEdge_from_directedViewEdge( *dve ); +} + PyObject * orientedViewEdgeIterator_getObject( BPy_orientedViewEdgeIterator *self) { return BPy_directedViewEdge_from_directedViewEdge( self->ove_it->operator*() ); } diff --git a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h index 973d0f2b728..cd9edf1e224 100644 --- a/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h +++ b/source/blender/freestyle/intern/python/Iterator/BPy_orientedViewEdgeIterator.h @@ -22,6 +22,7 @@ extern PyTypeObject orientedViewEdgeIterator_Type; typedef struct { BPy_Iterator py_it; ViewVertexInternal::orientedViewEdgeIterator *ove_it; + int reversed; } BPy_orientedViewEdgeIterator; /////////////////////////////////////////////////////////////////////////////////////////// |