From 94a3a8748afe01217eabb8dc00c035ad92139bbf Mon Sep 17 00:00:00 2001
From: Florent Lamiraux <florent@laas.fr>
Date: Thu, 20 Jan 2011 20:12:32 +0100
Subject: [PATCH] Bind SignalBase.display() and implement
 Entity.displaySignals() in python.

---
 src/dynamic-graph-py.cc          | 11 +++++------
 src/dynamic_graph/entity.py      |  6 +++++-
 src/dynamic_graph/signal_base.py |  6 ++++++
 src/entity-py.cc                 | 25 -------------------------
 src/signal-base-py.cc            | 22 ++++++++++++++++++++++
 5 files changed, 38 insertions(+), 32 deletions(-)

diff --git a/src/dynamic-graph-py.cc b/src/dynamic-graph-py.cc
index 88029a0..083f35f 100644
--- a/src/dynamic-graph-py.cc
+++ b/src/dynamic-graph-py.cc
@@ -30,6 +30,7 @@ namespace dynamicgraph {
       extern PyObject* create(PyObject* self, PyObject* args);
       extern PyObject* getTime(PyObject* self, PyObject* args);
       extern PyObject* getName(PyObject* self, PyObject* args);
+      extern PyObject* display(PyObject* self, PyObject* args);
       extern PyObject* getValue(PyObject* self, PyObject* args);
       extern PyObject* setValue(PyObject* self, PyObject* args);
       extern PyObject* recompute(PyObject* self, PyObject* args);
@@ -38,7 +39,6 @@ namespace dynamicgraph {
       extern PyObject* create(PyObject* self, PyObject* args);
       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);
@@ -147,9 +147,11 @@ static PyMethodDef dynamicGraphMethods[] = {
    METH_VARARGS, "Get time of  a SignalBase"},
   {"signal_base_get_name", dynamicgraph::python::signalBase::getName,
    METH_VARARGS, "Get the name of a signal"},
+  {"signal_base_display", dynamicgraph::python::signalBase::display,
+   METH_VARARGS, "Print the signal in a string"},
   {"signal_base_get_value", dynamicgraph::python::signalBase::getValue,
-   METH_VARARGS, "Read the value of a signal"},
-  {"signal_base_set_value", dynamicgraph::python::signalBase::setValue,
+   METH_VARARGS, "Read the value of a signal"}, 
+ {"signal_base_set_value", dynamicgraph::python::signalBase::setValue,
    METH_VARARGS, "Set the value of a signal"},
   {"signal_base_recompute", dynamicgraph::python::signalBase::recompute,
    METH_VARARGS, "Recompute the signal at given time"},
@@ -160,9 +162,6 @@ static PyMethodDef dynamicGraphMethods[] = {
    "get the name of an Entity"},
   {"entity_get_signal", dynamicgraph::python::entity::getSignal, METH_VARARGS,
    "get signal by name from an Entity"},
-  {"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."},
diff --git a/src/dynamic_graph/entity.py b/src/dynamic_graph/entity.py
index fa1634f..d43852b 100644
--- a/src/dynamic_graph/entity.py
+++ b/src/dynamic_graph/entity.py
@@ -79,7 +79,11 @@ class Entity (object) :
         """
         Print the list of signals into standard output: temporary.
         """
-        wrap.entity_display_signals(self.obj)
+        signals = self.signals()
+        print "--- <" +  self.name + "> signal list: "
+        for s in signals[:-1]:
+            print "    |-- <" + str(s)
+        print "    `-- <" + str(signals[-1])
 
     def signals(self) :
         """
diff --git a/src/dynamic_graph/signal_base.py b/src/dynamic_graph/signal_base.py
index e51e788..c483610 100644
--- a/src/dynamic_graph/signal_base.py
+++ b/src/dynamic_graph/signal_base.py
@@ -211,3 +211,9 @@ class SignalBase (object) :
         Force signal to recompute the value at given time.
         """
         return wrap.signal_base_recompute(self.obj, time)
+
+    def __str__(self):
+        """
+        Print signal in a string
+        """
+        return wrap.signal_base_display(self.obj)
diff --git a/src/entity-py.cc b/src/entity-py.cc
index 325824f..f907867 100644
--- a/src/entity-py.cc
+++ b/src/entity-py.cc
@@ -132,31 +132,6 @@ namespace dynamicgraph {
 	return PyCObject_FromVoidPtr((void*)signal, NULL);
       }
 
-      PyObject* displaySignals(PyObject* /*self*/, PyObject* args)
-      {
-	void* pointer = NULL;
-	PyObject* object = NULL;
-
-	if (!PyArg_ParseTuple(args, "O", &object))
-	  return NULL;
-
-	if (!PyCObject_Check(object)) {
-	  PyErr_SetString(PyExc_TypeError,
-			  "function takes a PyCObject as argument");
-	  return NULL;
-	}
-
-	pointer = PyCObject_AsVoidPtr(object);
-	Entity* entity = (Entity*)pointer;
-	try {
-	  entity->displaySignalList(std::cout);
-	} catch(ExceptionAbstract& exc) {
-	  PyErr_SetString(error, exc.getStringMessage().c_str());
-	  return NULL;
-	}
-	return Py_BuildValue("");
-      }
-
       PyObject* listSignals(PyObject* /*self*/, PyObject* args)
       {
 	void* pointer = NULL;
diff --git a/src/signal-base-py.cc b/src/signal-base-py.cc
index 52475bf..e0d6d8a 100644
--- a/src/signal-base-py.cc
+++ b/src/signal-base-py.cc
@@ -73,6 +73,28 @@ namespace dynamicgraph {
 	return Py_BuildValue("i", time);
       }
 
+      PyObject* display(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);
+	SignalBase<int>* obj = (SignalBase<int>*)pointer;
+
+	std::ostringstream oss;
+	try {
+	  obj->display(oss);
+	} catch (std::exception& exc) {
+	  PyErr_SetString(error, exc.what());
+	  return NULL;
+	}
+	return Py_BuildValue("s", oss.str().c_str());
+      }
+
       PyObject* getValue(PyObject* /*self*/, PyObject* args)
       {
 	void* pointer = NULL;
-- 
GitLab