soc-2008-mxcurioni: the native Python system now supports cross-language polymorphism for the following classes: BinaryPredicate0D (__call__), BinaryPredicate1D (__call__), UnaryPredicate0D (__call__), UnaryPredicate1D (__call__), StrokeShader (shade), ChainingIterator (init, traverse).

Other methods could easily be supported in the future. The method now works as planned for the contour style. For style modules with Python shaders, there still is a problem that I will fix right away.
This commit is contained in:
Maxime Curioni
2008-07-31 08:50:12 +00:00
parent a482f64424
commit 3010f2b753
21 changed files with 325 additions and 131 deletions

View File

@@ -164,21 +164,19 @@ PyObject * Operators_select(BPy_Operators* self, PyObject *args)
Py_RETURN_NONE;
}
UnaryPredicate1D *up1D = ((BPy_UnaryPredicate1D *) obj)->up1D;
if( PyObject_HasAttrString( obj, "__call__") )
up1D->setPythonObject( obj );
Operators::select(*up1D);
Operators::select(*( ((BPy_UnaryPredicate1D *) obj)->up1D ));
Py_RETURN_NONE;
}
// CHANGE: first parameter is a chaining iterator, not just a view
PyObject * Operators_chain(BPy_Operators* self, PyObject *args)
{
PyObject *obj1 = 0, *obj2 = 0, *obj3 = 0;
if(!( PyArg_ParseTuple(args, "OO|O", &obj1, &obj2, &obj3) &&
BPy_ViewEdgeIterator_Check(obj1) && ((BPy_ViewEdgeIterator *) obj1)->ve_it &&
BPy_ChainingIterator_Check(obj1) && ((BPy_ChainingIterator *) obj1)->c_it &&
BPy_UnaryPredicate1D_Check(obj2) && ((BPy_UnaryPredicate1D *) obj2)->up1D )) {
cout << "ERROR: Operators_chain" << endl;
Py_RETURN_NONE;
@@ -186,12 +184,13 @@ PyObject * Operators_chain(BPy_Operators* self, PyObject *args)
if( !obj3 ) {
Operators::chain( *( ((BPy_ViewEdgeIterator *) obj1)->ve_it ),
Operators::chain( *( ((BPy_ChainingIterator *) obj1)->c_it ),
*( ((BPy_UnaryPredicate1D *) obj2)->up1D ) );
} else if( BPy_UnaryFunction1DVoid_Check(obj3) && ((BPy_UnaryFunction1DVoid *) obj3)->uf1D_void ) {
Operators::chain( *( ((BPy_ViewEdgeIterator *) obj1)->ve_it ),
Operators::chain( *( ((BPy_ChainingIterator *) obj1)->c_it ),
*( ((BPy_UnaryPredicate1D *) obj2)->up1D ),
*( ((BPy_UnaryFunction1DVoid *) obj3)->uf1D_void ) );
@@ -209,7 +208,7 @@ PyObject * Operators_bidirectionalChain(BPy_Operators* self, PyObject *args)
cout << "ERROR: Operators_bidirectionalChain" << endl;
Py_RETURN_NONE;
}
if( !obj2 ) {
Operators::bidirectionalChain( *( ((BPy_ChainingIterator *) obj1)->c_it ) );
@@ -234,7 +233,7 @@ PyObject * Operators_sequentialSplit(BPy_Operators* self, PyObject *args)
cout << "ERROR: Operators_sequentialSplit" << endl;
Py_RETURN_NONE;
}
if( obj2 && BPy_UnaryPredicate0D_Check(obj2) ) {
Operators::sequentialSplit( *( ((BPy_UnaryPredicate0D *) obj1)->up0D ),
@@ -266,7 +265,7 @@ PyObject * Operators_recursiveSplit(BPy_Operators* self, PyObject *args)
if( BPy_UnaryPredicate1D_Check(obj2) && ((BPy_UnaryPredicate1D *) obj2)->up1D ) {
float f = ( obj3 && PyFloat_Check(obj3) ) ? PyFloat_AsDouble(obj3) : 0.0;
Operators::recursiveSplit( *( ((BPy_UnaryFunction0DDouble *) obj1)->uf0D_double ),
*( ((BPy_UnaryPredicate1D *) obj2)->up1D ),
f );
@@ -313,8 +312,9 @@ PyObject * Operators_create(BPy_Operators* self, PyObject *args)
vector<StrokeShader *> shaders;
for( int i = 0; i < PyList_Size(obj2); i++) {
PyObject *py_ss = PyList_GetItem(obj2,i);
if( BPy_StrokeShader_Check(py_ss) )
shaders.push_back( ((BPy_StrokeShader *) py_ss)->ss );
if( BPy_StrokeShader_Check(py_ss) )
shaders.push_back( ((BPy_StrokeShader *) py_ss)->ss );
}
Operators::create( *( ((BPy_UnaryPredicate1D *) obj1)->up1D ), shaders);