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