wxString, wxPoint and wxChar wrappers

This commit is contained in:
Miguel Angel Ajo 2012-03-10 22:40:41 +01:00
parent 3dacab9691
commit 562d2461aa
7 changed files with 245 additions and 36 deletions

View File

@ -18,6 +18,7 @@ include_directories(
${Boost_INCLUDE_DIR}
../polygon
../common/dialogs
./scripting
${INC_AFTER}
)
@ -224,6 +225,7 @@ set(PCBNEW_COMMON_SRCS
set(PCBNEW_SCRIPTING_SRCS
kicad_wrap.cxx
pcbnew_wrap.cxx
scripting/helpers.cpp
)
##

View File

@ -0,0 +1,119 @@
#include <Python.h>
#include <wx/intl.h>
#include <wx/string.h>
#define WX_DEFAULTENCODING_SIZE 64
static char wxPythonEncoding[WX_DEFAULTENCODING_SIZE] = "ascii";
wxString* newWxStringFromPy(PyObject* src) {
bool must_unref_str=false;
wxString* result = NULL;
PyObject *obj=src;
#if wxUSE_UNICODE
bool must_unref_obj=false;
// Unicode string to python unicode string
PyObject* uni_str = src;
// if not an str or unicode, try to str(src)
if (!PyString_Check(src) && !PyUnicode_Check(src))
{
obj = PyObject_Str(src);
must_unref_obj = true;
if (PyErr_Occurred()) return NULL;
}
if (PyString_Check(obj))
{
uni_str = PyUnicode_FromEncodedObject(obj, wxPythonEncoding, "strict");
must_unref_str = true;
if (PyErr_Occurred()) return NULL;
}
result = new wxString();
size_t len = PyUnicode_GET_SIZE(uni_str);
if (len)
{
PyUnicode_AsWideChar((PyUnicodeObject*)uni_str,
wxStringBuffer(*result, len),len);
}
if (must_unref_str) Py_DECREF(uni_str);
if (must_unref_obj) Py_DECREF(obj);
#else
// normal string (or object) to normal python string
PyObject* str = src;
if (PyUnicode_Check(src)) // if it's unicode convert to normal string
{
str = PyUnicode_AsEncodedString(src, wxPythonEncoding, "strict");
if (PyErr_Occurred()) return NULL;
}
else if (!PyString_Check(src)) // if it's not a string, str(obj)
{
str = PyObject_Str(src);
must_unref_str = true;
if (PyErr_Occurred()) return NULL;
}
// get the string pointer and size
char* str_ptr;
Py_ssize_t str_size;
PyString_AsStringAndSize(str, &str_ptr, &str_size);
// build the wxString from our pointer / size
result = new wxString(str_ptr, str_size);
if (must_unref_str) Py_DECREF(str);
#endif
return result;
}
wxString Py2wxString(PyObject* src)
{
wxString result;
wxString* resPtr = newWxStringFromPy(src);
// In case of exception clear it and return an empty string
if (resPtr==NULL)
{
PyErr_Clear();
return wxEmptyString;
}
result = *resPtr;
delete resPtr;
return result;
}
PyObject* wx2PyString(const wxString& src)
{
PyObject* str;
#if wxUSE_UNICODE
str = PyUnicode_FromWideChar(src.c_str(), src.Len());
#else
str = PyString_FromStringAndSize(src.c_str(), src.Len());
#endif
return str;
}
void wxSetDefaultPyEncoding(const char* encoding)
{
strncpy(wxPythonEncoding, encoding, WX_DEFAULTENCODING_SIZE);
}
const char* wxGetDefaultPyEncoding()
{
return wxPythonEncoding;
}

View File

@ -17,6 +17,7 @@
#include <dlist.h>
#include <base_struct.h>
#include <common.h>
#include <wx_helpers.h>
%}

View File

@ -8,6 +8,7 @@
#include <class_track.h>
#include <class_pad.h>
#include <dlist.h>
#include <wx_helpers.h>
BOARD *GetBoard();

View File

@ -0,0 +1,14 @@
pcb = pcbnew.GetBoard()
m = pcb.m_Modules.item()
while m:
print m.GetReference(),"(",m.GetValue(),") at ", m.GetPosition()
m.SetValue("pepe")
p = m.m_Pads.item()
while p:
print " pad",p.GetPadName(), "at",p.GetPosition()
p = p.Next()
m = m.Next()

View File

@ -1,58 +1,115 @@
%{
#include <wx_helpers.h>
%}
// encoding setup, ascii by default ///////////////////////////////////////////
void wxSetDefaultPyEncoding(const char* encoding);
const char* wxGetDefaultPyEncoding();
// wxPoint class wrapper to (xx,yy) tuple /////////////////////////////////////
class wxPoint
{
public:
int x, y;
wxPoint(int xx, int yy);
~wxPoint();
%extend {
wxPoint __add__(const wxPoint& pt) { return *self + pt; }
wxPoint __sub__(const wxPoint& pt) { return *self - pt; }
wxPoint __add__(const wxPoint& pt) {
return *self + pt;
}
wxPoint __sub__(const wxPoint& pt) {
return *self - pt;
}
void Set(long x, long y) {
self->x = x;
self->y = y;
}
PyObject* Get() {
//wxPyBlock_t blocked = wxPyBeginBlockThreads();
void Set(long x, long y) { self->x = x; self->y = y; }
PyObject* Get()
{
PyObject* tup = PyTuple_New(2);
PyTuple_SET_ITEM(tup, 0, PyInt_FromLong(self->x));
PyTuple_SET_ITEM(tup, 1, PyInt_FromLong(self->y));
//wxPyEndBlockThreads(blocked);
return tup;
}
}
%pythoncode {
def __eq__(self,other): return (self.x==other.x and self.y==other.y)
def __ne__(self,other): return not (self==other)
def __str__(self): return str(self.Get())
def __repr__(self): return 'wx.Point'+str(self.Get())
def __len__(self): return len(self.Get())
def __getitem__(self, index): return self.Get()[index]
def __eq__(self,other): return (self.x==other.x and self.y==other.y)
def __ne__(self,other): return not (self==other)
def __str__(self): return str(self.Get())
def __repr__(self): return 'wxPoint'+str(self.Get())
def __len__(self): return len(self.Get())
def __getitem__(self, index): return self.Get()[index]
def __setitem__(self, index, val):
if index == 0: self.x = val
elif index == 1: self.y = val
else: raise IndexError
if index == 0:
self.x = val
elif index == 1:
self.y = val
else:
raise IndexError
def __nonzero__(self): return self.Get() != (0,0)
__safe_for_unpickling__ = True
}
};
// wxChar wrappers ///////////////////////////////////////////////////////////
%typemap(in) wxChar { wxString str = Py2wxString($input); $1 = str[0]; }
%typemap(out) wxChar { wxString str($1); $result = wx2PyString(str); }
// wxString wrappers /////////////////////////////////////////////////////////
%typemap(out) wxString&
{
%#if wxUSE_UNICODE
$result = PyUnicode_FromWideChar($1->c_str(), $1->Len());
%#else
$result = PyString_FromStringAndSize($1->c_str(), $1->Len());
%#endif
}
%apply wxString& { wxString* }
%typemap(out) wxString {
%#if wxUSE_UNICODE
$result = PyUnicode_FromWideChar($1.c_str(), $1.Len());
%#else
$result = PyString_FromStringAndSize($1.c_str(), $1.Len());
%#endif
}
%typemap(varout) wxString {
%#if wxUSE_UNICODE
$result = PyUnicode_FromWideChar($1.c_str(), $1.Len());
%#else
$result = PyString_FromStringAndSize($1.c_str(), $1.Len());
%#endif
}
%typemap(in) wxString& (bool temp=false)
{
$1 = newWxStringFromPy($input);
if ($1 == NULL) SWIG_fail;
temp = true;
}
%typemap(freearg) wxString&
{
if (temp$argnum)
delete $1;
}
%typemap(in) wxString {
wxString* sptr = newWxStringFromPy($input);
if (sptr == NULL) SWIG_fail;
$1 = *sptr;
delete sptr;
}
%typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) wxString& {
$1 = PyString_Check($input) || PyUnicode_Check($input);
}

View File

@ -0,0 +1,15 @@
#ifndef __wx_helpers_h
#define __wx_helpers_h
#include <Python.h>
#include <wx/intl.h>
#include <wx/string.h>
wxString* newWxStringFromPy(PyObject* source);
wxString Py2wxString(PyObject* source);
PyObject* wx2PyString(const wxString& src);
void wxSetDefaultPyEncoding(const char* encoding);
const char* wxGetDefaultPyEncoding();
#endif