From c0111775b35cb1db8ec84be45c9910884060adbc Mon Sep 17 00:00:00 2001 From: Florent Lamiraux <florent@laas.fr> Date: Wed, 19 Jan 2011 18:38:07 +0100 Subject: [PATCH] Save temporary changes to get list of signals of an entity. --- src/dynamic-graph-py.cc | 4 ++++ src/dynamic_graph/entity.py | 5 +++-- src/dynamic_graph/signal_base.py | 2 +- src/entity-py.cc | 34 ++++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/dynamic-graph-py.cc b/src/dynamic-graph-py.cc index 414601f..88029a0 100644 --- a/src/dynamic-graph-py.cc +++ b/src/dynamic-graph-py.cc @@ -39,6 +39,7 @@ namespace dynamicgraph { extern PyObject* getName(PyObject* self, PyObject* args); extern PyObject* getSignal(PyObject* self, PyObject* args); extern PyObject* displaySignals(PyObject* self, PyObject* args); + extern PyObject* listSignals(PyObject* self, PyObject* args); extern PyObject* executeCommand(PyObject* self, PyObject* args); extern PyObject* listCommands(PyObject* self, PyObject* args); extern PyObject* getCommandDocstring(PyObject* self, PyObject* args); @@ -162,6 +163,9 @@ static PyMethodDef dynamicGraphMethods[] = { {"entity_display_signals", dynamicgraph::python::entity::displaySignals, METH_VARARGS, "Display the list of signals of an entity in standard output"}, + {"entity_list_signals", dynamicgraph::python::entity::listSignals, + METH_VARARGS, + "Return the list of signals of an entity."}, {"entity_execute_command", dynamicgraph::python::entity::executeCommand, METH_VARARGS, diff --git a/src/dynamic_graph/entity.py b/src/dynamic_graph/entity.py index ffe5d7d..c6b6ecc 100644 --- a/src/dynamic_graph/entity.py +++ b/src/dynamic_graph/entity.py @@ -73,7 +73,7 @@ class Entity (object) : Get a signal of the entity from signal name """ signalPt = wrap.entity_get_signal(self.obj, name) - return signal_base.SignalBase("", signalPt) + return signal_base.SignalBase(name = "", obj = signalPt) def displaySignals(self) : """ @@ -85,7 +85,8 @@ class Entity (object) : """ Alias of displaySignals to reduce verbosity. To be confirmed. """ - self.displaySignals() + sl = wrap.entity_list_signals(self.obj) + return map(lambda pyObj: signalBase.SignalBase(obj=pyObj), sl) def commands(self): """ diff --git a/src/dynamic_graph/signal_base.py b/src/dynamic_graph/signal_base.py index 142c287..e51e788 100644 --- a/src/dynamic_graph/signal_base.py +++ b/src/dynamic_graph/signal_base.py @@ -150,7 +150,7 @@ class SignalBase (object) : obj = None - def __init__(self, name, obj = None) : + def __init__(self, name = "", obj = None) : """ Constructor: if not called by a child class, create and store a pointer to a C++ SignalBase<int> object. diff --git a/src/entity-py.cc b/src/entity-py.cc index c01ca83..dde0c6a 100644 --- a/src/entity-py.cc +++ b/src/entity-py.cc @@ -157,6 +157,40 @@ namespace dynamicgraph { return Py_BuildValue(""); } + PyObject* listSignals(PyObject* self, PyObject* args) + { + void* pointer = NULL; + PyObject* object = NULL; + + if (!PyArg_ParseTuple(args, "O", &object)) + return NULL; + + if (!PyCObject_Check(object)) + return NULL; + + pointer = PyCObject_AsVoidPtr(object); + Entity* entity = (Entity*)pointer; + + try { + Entity::SignalMap signalMap = entity->getSignalMap(); + // Create a tuple of same size as the command map + PyObject* result = PyTuple_New(signalMap.size()); + unsigned int count = 0; + + for (Entity::SignalMap::iterator it = signalMap.begin(); + it != signalMap.end(); it++) { + SignalBase<int>* signal = it->second; + PyObject* pySignal = PyCObject_FromVoidPtr((void*)signal, NULL); + PyTuple_SET_ITEM(result, count, pySignal); + count++; + } + return result; + } catch(ExceptionAbstract& exc) { + PyErr_SetString(error, exc.getStringMessage().c_str()); + } + return NULL; + } + void fillMatrixRow(Matrix& m, unsigned iRow, PyObject* tuple) { if (PyTuple_Size(tuple) != (int)m.nbCols()) { -- GitLab