From cc7662befb96af07794ae473ce2a5f4e011cabc0 Mon Sep 17 00:00:00 2001
From: Joseph Mirabel <jmirabel@laas.fr>
Date: Fri, 18 Sep 2020 13:28:39 +0200
Subject: [PATCH] Expose function to define new signals.

---
 CMakeLists.txt                         |  1 +
 include/dynamic-graph/python/signal.hh | 73 ++++++++++++++++++++++++++
 src/dynamic_graph/signal-base-py.cc    | 50 ++----------------
 3 files changed, 77 insertions(+), 47 deletions(-)
 create mode 100644 include/dynamic-graph/python/signal.hh

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4056455..307d5be 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -44,6 +44,7 @@ SET(${PROJECT_NAME}_HEADERS
   include/${CUSTOM_HEADER_DIR}/interpreter.hh
   include/${CUSTOM_HEADER_DIR}/module.hh
   include/${CUSTOM_HEADER_DIR}/python-compat.hh
+  include/${CUSTOM_HEADER_DIR}/signal.hh
   include/${CUSTOM_HEADER_DIR}/signal-wrapper.hh
   )
 
diff --git a/include/dynamic-graph/python/signal.hh b/include/dynamic-graph/python/signal.hh
new file mode 100644
index 0000000..ea115e6
--- /dev/null
+++ b/include/dynamic-graph/python/signal.hh
@@ -0,0 +1,73 @@
+// Copyright 2020, Joseph Mirabel, LAAS-CNRS.
+
+#include <sstream>
+
+#include <boost/python.hpp>
+
+#include <dynamic-graph/signal-base.h>
+#include <dynamic-graph/signal-ptr.h>
+#include <dynamic-graph/signal-time-dependent.h>
+#include <dynamic-graph/signal.h>
+
+#include "dynamic-graph/python/signal-wrapper.hh"
+
+namespace dynamicgraph {
+namespace python {
+
+template <typename T, typename Time>
+auto exposeSignal(const std::string& name) {
+  namespace bp = boost::python;
+
+  typedef Signal<T, Time> S_t;
+  bp::class_<S_t, bp::bases<SignalBase<Time> >, boost::noncopyable> obj(
+      name.c_str(), bp::init<std::string>());
+  obj.add_property(
+      "value",
+      bp::make_function(&S_t::accessCopy,
+                        bp::return_value_policy<bp::copy_const_reference>()),
+      &S_t::setConstant,  // TODO check the setter
+      "the signal value.\n"
+      "warning: for Eigen objects, sig.value[0] = 1. may not work).");
+  return obj;
+}
+
+template <typename T, typename Time>
+auto exposeSignalWrapper(const std::string& name) {
+  namespace bp = boost::python;
+
+  typedef SignalWrapper<T, Time> S_t;
+  bp::class_<S_t, bp::bases<Signal<T, Time> >, boost::noncopyable> obj(
+      name.c_str(), bp::no_init);
+  return obj;
+}
+
+template <typename T, typename Time>
+auto exposeSignalPtr(const std::string& name) {
+  namespace bp = boost::python;
+
+  typedef SignalPtr<T, Time> S_t;
+  bp::class_<S_t, bp::bases<Signal<T, Time> >, boost::noncopyable> obj(
+      name.c_str(), bp::no_init);
+  return obj;
+}
+
+template <typename T, typename Time>
+auto exposeSignalTimeDependent(const std::string& name) {
+  namespace bp = boost::python;
+
+  typedef SignalTimeDependent<T, Time> S_t;
+  bp::class_<S_t, bp::bases<Signal<T, Time> >, boost::noncopyable> obj(
+      name.c_str(), bp::no_init);
+  return obj;
+}
+
+template <typename T, typename Time>
+void exposeSignalsOfType(const std::string& name) {
+  exposeSignal<T, Time>("Signal" + name);
+  exposeSignalPtr<T, Time>("SignalPtr" + name);
+  exposeSignalWrapper<T, Time>("SignalWrapper" + name);
+  exposeSignalTimeDependent<T, Time>("SignalTimeDependent" + name);
+}
+
+}  // namespace python
+}  // namespace dynamicgraph
diff --git a/src/dynamic_graph/signal-base-py.cc b/src/dynamic_graph/signal-base-py.cc
index 50a80ad..c839742 100644
--- a/src/dynamic_graph/signal-base-py.cc
+++ b/src/dynamic_graph/signal-base-py.cc
@@ -5,19 +5,17 @@
 
 #include <boost/python.hpp>
 
+#include "dynamic-graph/python/signal.hh"
+
 #include <dynamic-graph/signal-base.h>
 #include <dynamic-graph/signal.h>
 #include <dynamic-graph/signal-ptr.h>
 #include <dynamic-graph/signal-time-dependent.h>
-#include <dynamic-graph/signal-caster.h>
 #include <dynamic-graph/linear-algebra.h>
-#include <dynamic-graph/pool.h>
-#include <dynamic-graph/factory.h>
+#include <dynamic-graph/value.h>
 
 #include "dynamic-graph/python/dynamic-graph-py.hh"
-#include "dynamic-graph/python/convert-dg-to-py.hh"
 #include "dynamic-graph/python/signal-wrapper.hh"
-#include "dynamic-graph/python/module.hh"
 
 using dynamicgraph::SignalBase;
 
@@ -26,8 +24,6 @@ namespace bp = boost::python;
 namespace dynamicgraph {
 namespace python {
 
-using namespace convert;
-
 typedef int time_type;
 
 typedef Eigen::AngleAxis<double> VectorUTheta;
@@ -82,17 +78,6 @@ void exposeSignalBase(const char* name) {
            "Print the signal dependencies in a string");
 }
 
-template <typename T, typename Time>
-auto exposeSignal(const std::string& name) {
-  typedef Signal<T, Time> S_t;
-  bp::class_<S_t, bp::bases<SignalBase<Time> >, boost::noncopyable> obj(name.c_str(), bp::init<std::string>());
-  obj.add_property("value", bp::make_function(&S_t::accessCopy, bp::return_value_policy<bp::copy_const_reference>()),
-                   &S_t::setConstant,  // TODO check the setter
-                   "the signal value.\n"
-                   "warning: for Eigen objects, sig.value[0] = 1. may not work).");
-  return obj;
-}
-
 template <>
 auto exposeSignal<MatrixHomogeneous, time_type>(const std::string& name) {
   typedef Signal<MatrixHomogeneous, time_type> S_t;
@@ -107,35 +92,6 @@ auto exposeSignal<MatrixHomogeneous, time_type>(const std::string& name) {
   return obj;
 }
 
-template <typename T, typename Time>
-auto exposeSignalWrapper(const std::string& name) {
-  typedef SignalWrapper<T, Time> S_t;
-  bp::class_<S_t, bp::bases<Signal<T, Time> >, boost::noncopyable> obj(name.c_str(), bp::no_init);
-  return obj;
-}
-
-template <typename T, typename Time>
-auto exposeSignalPtr(const std::string& name) {
-  typedef SignalPtr<T, Time> S_t;
-  bp::class_<S_t, bp::bases<Signal<T, Time> >, boost::noncopyable> obj(name.c_str(), bp::no_init);
-  return obj;
-}
-
-template <typename T, typename Time>
-auto exposeSignalTimeDependent(const std::string& name) {
-  typedef SignalTimeDependent<T, Time> S_t;
-  bp::class_<S_t, bp::bases<Signal<T, Time> >, boost::noncopyable> obj(name.c_str(), bp::no_init);
-  return obj;
-}
-
-template <typename T, typename Time>
-void exposeSignalsOfType(const std::string& name) {
-  exposeSignal<T, Time>("Signal" + name);
-  exposeSignalPtr<T, Time>("SignalPtr" + name);
-  exposeSignalWrapper<T, Time>("SignalWrapper" + name);
-  exposeSignalTimeDependent<T, Time>("SignalTimeDependent" + name);
-}
-
 void exposeSignals() {
   exposeSignalBase<time_type>("SignalBase");
 
-- 
GitLab