/** * @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) { this->m_PyWizard= aWizard; Py_XINCREF( aWizard ); } PYTHON_FOOTPRINT_WIZARD::~PYTHON_FOOTPRINT_WIZARD() { Py_XDECREF( this->m_PyWizard ); } PyObject* PYTHON_FOOTPRINT_WIZARD::CallMethod(const char* aMethod, PyObject *aArglist) { PyObject *pFunc; /* pFunc is a new reference to the desired method */ pFunc = PyObject_GetAttrString( this->m_PyWizard, aMethod ); if ( pFunc && PyCallable_Check( pFunc ) ) { PyObject *result; PY_BLOCK_THREADS( blocked ); result = PyObject_CallObject( pFunc, aArglist ); if ( PyErr_Occurred() ) { PyObject *t, *v, *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) ) ); } PY_UNBLOCK_THREADS( blocked ); 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; ret.Clear(); PyObject *result = CallMethod( aMethod, aArglist ); if ( result ) { PY_BLOCK_THREADS( blocked ); const char *str_res = PyString_AsString( result ); ret = wxString::FromUTF8( str_res ); Py_DECREF( result ); PY_UNBLOCK_THREADS( blocked ); } return ret; } wxArrayString PYTHON_FOOTPRINT_WIZARD::CallRetArrayStrMethod ( const char *aMethod, PyObject *aArglist ) { PyObject *result, *element; wxArrayString ret; wxString str_item; 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; } PY_BLOCK_THREADS( blocked ); 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 }