/** * @file pcbnew_footprint_wizards.cpp * @brief Class PCBNEW_PYTHON_FOOTPRINT_WIZARDS */ #include "pcbnew_footprint_wizards.h" #include #include PYTHON_FOOTPRINT_WIZARD::PYTHON_FOOTPRINT_WIZARD( PyObject* aWizard ) { PyLOCK lock; this->m_PyWizard= aWizard; Py_XINCREF( aWizard ); } PYTHON_FOOTPRINT_WIZARD::~PYTHON_FOOTPRINT_WIZARD() { PyLOCK lock; Py_XDECREF( this->m_PyWizard ); } PyObject* PYTHON_FOOTPRINT_WIZARD::CallMethod( const char* aMethod, PyObject* aArglist ) { PyLOCK lock; // pFunc is a new reference to the desired method PyObject* pFunc = PyObject_GetAttrString( this->m_PyWizard, aMethod ); if( pFunc && PyCallable_Check( pFunc ) ) { PyObject* result = PyObject_CallObject( pFunc, aArglist ); if( PyErr_Occurred() ) { PyObject* t; PyObject* v; PyObject* b; PyErr_Fetch( &t, &v, &b ); printf ( "calling %s()\n", aMethod ); printf ( "Exception: %s\n", PyString_AsString( PyObject_Str( v ) ) ); printf ( " : %s\n", PyString_AsString( PyObject_Str( b ) ) ); } if( result ) { Py_XDECREF( pFunc ); return result; } } else { printf( "method not found, or not callable: %s\n", aMethod ); } if( pFunc ) Py_XDECREF( pFunc ); return NULL; } wxString PYTHON_FOOTPRINT_WIZARD::CallRetStrMethod( const char* aMethod, PyObject* aArglist ) { wxString ret; PyLOCK lock; PyObject* result = CallMethod( aMethod, aArglist ); if( result ) { const char* str_res = PyString_AsString( result ); ret = wxString::FromUTF8( str_res ); Py_DECREF( result ); } return ret; } wxArrayString PYTHON_FOOTPRINT_WIZARD::CallRetArrayStrMethod ( const char* aMethod, PyObject* aArglist ) { wxArrayString ret; wxString str_item; PyLOCK lock; PyObject* result = CallMethod( aMethod, aArglist ); if( result ) { if( !PyList_Check( result ) ) { Py_DECREF( result ); ret.Add( wxT( "PYTHON_FOOTPRINT_WIZARD::CallRetArrayStrMethod, result is not a list" ), 1 ); return ret; } int list_size = PyList_Size( result ); for ( int n=0; nGetName().mb_str() // ); // this get the wizard registered in the common // FOOTPRINT_WIZARDS class fw->register_wizard(); #if 0 // just to test if it works correctly int pages = fw->GetNumParameterPages(); printf( " %d pages\n",pages ); for ( int n=0; n'%s'\n",n, ( const char* )fw->GetParameterPageName( n ).mb_str() ); } #endif }