summaryrefslogtreecommitdiff
path: root/pcbnew/scripting/pcbnew_footprint_wizards.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'pcbnew/scripting/pcbnew_footprint_wizards.cpp')
-rw-r--r--pcbnew/scripting/pcbnew_footprint_wizards.cpp361
1 files changed, 361 insertions, 0 deletions
diff --git a/pcbnew/scripting/pcbnew_footprint_wizards.cpp b/pcbnew/scripting/pcbnew_footprint_wizards.cpp
new file mode 100644
index 0000000..e0f3854
--- /dev/null
+++ b/pcbnew/scripting/pcbnew_footprint_wizards.cpp
@@ -0,0 +1,361 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2013 NBEE Embedded Systems SL, Miguel Angel Ajo <miguelangel@ajo.es>
+ * Copyright (C) 2013 KiCad Developers, see CHANGELOG.TXT for contributors.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+/**
+ * @file pcbnew_footprint_wizards.cpp
+ * @brief Class PCBNEW_PYTHON_FOOTPRINT_WIZARDS
+ */
+
+#include "pcbnew_footprint_wizards.h"
+#include <python_scripting.h>
+#include <stdio.h>
+#include <macros.h>
+
+
+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;
+
+ PyErr_Clear();
+ // 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() )
+ {
+#if 1 // defined(DEBUG)
+ wxMessageBox( PyErrStringWithTraceback(),
+ wxT( "Exception on python footprint wizard code" ),
+ wxICON_ERROR | wxOK );
+#endif
+ }
+
+ 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 = FROM_UTF8( 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;
+ }
+
+ ret = PyArrayStringToWx( result );
+
+ Py_DECREF( result );
+ }
+
+ return ret;
+}
+
+
+wxString PYTHON_FOOTPRINT_WIZARD::GetName()
+{
+ PyLOCK lock;
+
+ return CallRetStrMethod( "GetName" );
+}
+
+
+wxString PYTHON_FOOTPRINT_WIZARD::GetImage()
+{
+ PyLOCK lock;
+
+ return CallRetStrMethod( "GetImage" );
+}
+
+
+wxString PYTHON_FOOTPRINT_WIZARD::GetDescription()
+{
+ PyLOCK lock;
+
+ return CallRetStrMethod( "GetDescription" );
+}
+
+
+int PYTHON_FOOTPRINT_WIZARD::GetNumParameterPages()
+{
+ int ret = 0;
+ PyLOCK lock;
+
+ // Time to call the callback
+ PyObject* result = CallMethod( "GetNumParameterPages", NULL );
+
+ if( result )
+ {
+ if( !PyInt_Check( result ) )
+ return -1;
+
+ ret = PyInt_AsLong( result );
+ Py_DECREF( result );
+ }
+
+ return ret;
+}
+
+
+wxString PYTHON_FOOTPRINT_WIZARD::GetParameterPageName( int aPage )
+{
+ wxString ret;
+ PyLOCK lock;
+
+ // Time to call the callback
+ PyObject* arglist = Py_BuildValue( "(i)", aPage );
+ PyObject* result = CallMethod( "GetParameterPageName", arglist );
+
+ Py_DECREF( arglist );
+
+ if( result )
+ {
+ const char* str_res = PyString_AsString( result );
+ ret = FROM_UTF8( str_res );
+ Py_DECREF( result );
+ }
+
+ return ret;
+}
+
+
+wxArrayString PYTHON_FOOTPRINT_WIZARD::GetParameterNames( int aPage )
+{
+ wxArrayString ret;
+ PyLOCK lock;
+
+ PyObject* arglist = Py_BuildValue( "(i)", aPage );
+
+ ret = CallRetArrayStrMethod( "GetParameterNames", arglist );
+ Py_DECREF( arglist );
+
+ for( unsigned i = 0; i < ret.GetCount(); i++ )
+ {
+ wxString rest;
+ wxString item = ret[i];
+
+ if( item.StartsWith( wxT( "*" ), &rest ) )
+ {
+ ret[i] = rest;
+ }
+ }
+
+ return ret;
+}
+
+
+wxArrayString PYTHON_FOOTPRINT_WIZARD::GetParameterTypes( int aPage )
+{
+ wxArrayString ret;
+ PyLOCK lock;
+
+ PyObject* arglist = Py_BuildValue( "(i)", aPage );
+
+ ret = CallRetArrayStrMethod( "GetParameterNames", arglist );
+ Py_DECREF( arglist );
+
+ for( unsigned i = 0; i<ret.GetCount(); i++ )
+ {
+ wxString rest;
+ wxString item = ret[i];
+
+ if( item.StartsWith( wxT( "*" ), &rest ) )
+ {
+ ret[i] = wxT( "UNITS" ); // units
+ }
+ else
+ {
+ ret[i] = wxT( "IU" ); // internal units
+ }
+ }
+
+ return ret;
+}
+
+
+wxArrayString PYTHON_FOOTPRINT_WIZARD::GetParameterValues( int aPage )
+{
+ PyLOCK lock;
+
+ PyObject* arglist = Py_BuildValue( "(i)", aPage );
+ wxArrayString ret = CallRetArrayStrMethod( "GetParameterValues", arglist );
+
+ Py_DECREF( arglist );
+
+ return ret;
+}
+
+
+wxArrayString PYTHON_FOOTPRINT_WIZARD::GetParameterErrors( int aPage )
+{
+ PyLOCK lock;
+
+ PyObject* arglist = Py_BuildValue( "(i)", aPage );
+ wxArrayString ret = CallRetArrayStrMethod( "GetParameterErrors", arglist );
+
+ Py_DECREF( arglist );
+
+ return ret;
+}
+
+
+wxString PYTHON_FOOTPRINT_WIZARD::SetParameterValues( int aPage, wxArrayString& aValues )
+{
+ int len = aValues.size();
+
+ PyLOCK lock;
+
+ PyObject* py_list = PyList_New( len );
+
+ for( int i = 0; i < len; i++ )
+ {
+ wxString& str = aValues[i];
+ PyObject* py_str = PyString_FromString( (const char*) str.mb_str() );
+ PyList_SetItem( py_list, i, py_str );
+ }
+
+ PyObject* arglist;
+
+ arglist = Py_BuildValue( "(i,O)", aPage, py_list );
+ wxString res = CallRetStrMethod( "SetParameterValues", arglist );
+ Py_DECREF( arglist );
+
+ return res;
+}
+
+
+// this is a SWIG function declaration -from module.i
+MODULE* PyModule_to_MODULE( PyObject* obj0 );
+
+
+MODULE* PYTHON_FOOTPRINT_WIZARD::GetFootprint( wxString * aMessages )
+{
+ PyLOCK lock;
+
+ PyObject* result = CallMethod( "GetFootprint", NULL );
+
+ if( aMessages )
+ *aMessages = CallRetStrMethod( "GetBuildMessages", NULL );
+
+ if( !result )
+ return NULL;
+
+ PyObject* obj = PyObject_GetAttrString( result, "this" );
+
+ if( PyErr_Occurred() )
+ {
+ PyErr_Print();
+ PyErr_Clear();
+ }
+
+ MODULE* mod = PyModule_to_MODULE( obj );
+
+ return mod;
+}
+
+
+void* PYTHON_FOOTPRINT_WIZARD::GetObject()
+{
+ return (void*) m_PyWizard;
+}
+
+
+void PYTHON_FOOTPRINT_WIZARDS::register_wizard( PyObject* aPyWizard )
+{
+ PYTHON_FOOTPRINT_WIZARD* fw = new PYTHON_FOOTPRINT_WIZARD( aPyWizard );
+
+ fw->register_wizard();
+}
+
+
+void PYTHON_FOOTPRINT_WIZARDS::deregister_wizard( PyObject* aPyWizard )
+{
+ // deregister also destroyes the previously created "PYTHON_FOOTPRINT_WIZARD object"
+ FOOTPRINT_WIZARDS::deregister_object( (void*) aPyWizard );
+}