diff --git a/src/dynamic-graph-py.cc b/src/dynamic-graph-py.cc index 414601fc8b4079217fa1be3c47e29ff47638ac1b..88029a0e71268c126fcbd9d26d158af7a67e1beb 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 ffe5d7d0e1f9143db6902fb8e40065acdf84b33c..c6b6eccbce47e327542f11240395eba827e0da18 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 142c287945d05f31fa634c685a7add029f2b093d..e51e7888d66362409f1b946eaf1baa68a91ea499 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 c01ca83ca536db022d0ed235d428086cb0b9ba10..dde0c6ad6408ddcb6db431e9078b73c1408dd730 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()) {