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