diff --git a/src/signal-base-py.cc b/src/signal-base-py.cc index 40d85b9d74f972bac0f933da89f7095fefee50ac..97cf2c6d5c32e8bec5aaa1a75b206480535fb97f 100644 --- a/src/signal-base-py.cc +++ b/src/signal-base-py.cc @@ -8,8 +8,14 @@ #include <sstream> #include <dynamic-graph/signal-base.h> +#include <boost/numeric/ublas/vector.hpp> +#include <boost/numeric/ublas/io.hpp> +#include <dynamic-graph/signal-caster.h> + +typedef boost::numeric::ublas::vector<double> Vector; using dynamicgraph::SignalBase; +dynamicgraph::DefaultCastRegisterer<Vector> vectorCast; namespace dynamicgraph { namespace python { @@ -75,8 +81,19 @@ namespace dynamicgraph { SignalBase<int>* signal = (SignalBase<int>*)pointer; std::ostringstream value; - signal->get(value); - return Py_BuildValue("s", value.str()); + try { + signal->get(value); + } catch (const dynamicgraph::ExceptionAbstract& exc) { + PyErr_SetString(error, exc.getStringMessage().c_str()); + return NULL; + } catch (const std::exception& exc) { + PyErr_SetString(error, exc.what()); + } catch (...) { + PyErr_SetString(error, "Unknown exception"); + return NULL; + } + std::string valueString = value.str(); + return Py_BuildValue("s", valueString.c_str()); } PyObject* setValue(PyObject* self, PyObject* args) @@ -92,9 +109,23 @@ namespace dynamicgraph { pointer = PyCObject_AsVoidPtr(object); SignalBase<int>* signal = (SignalBase<int>*)pointer; - std::istringstream value(valueString); + std::ostringstream os; + os << valueString; + std::istringstream value(os.str()); + + try { + signal->set(value); + } catch (const dynamicgraph::ExceptionAbstract& exc) { + PyErr_SetString(error, exc.getStringMessage().c_str()); + return NULL; + } catch (const std::exception& exc) { + PyErr_SetString(error, exc.what()); + return NULL; + } catch (...) { + PyErr_SetString(error, "Unknown exception"); + return NULL; + } - signal->set(value); return Py_BuildValue(""); } }