diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp index dfaef06f1b45a4fe0b407f34039fd3ea62203ebf..2d77adef9df360baaa78fa4ea1f582fd78df4e0e 100644 --- a/include/eigenpy/details.hpp +++ b/include/eigenpy/details.hpp @@ -183,13 +183,6 @@ namespace eigenpy template<typename MatType> struct EigenFromPy { - EigenFromPy() - { - bp::converter::registry::push_back - (reinterpret_cast<void *(*)(_object *)>(&convertible), - &construct,bp::type_id<MatType>()); - } - // Determine if obj_ptr can be converted in a Eigenvec static void* convertible(PyArrayObject* obj_ptr) { @@ -330,6 +323,34 @@ namespace eigenpy enableEigenPySpecific<MatType>(); } + template<typename MatType> + struct EigenFromPyConverter + { + static void registration() + { + bp::converter::registry::push_back + (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible), + &EigenFromPy<MatType>::construct,bp::type_id<MatType>()); + + // Add also conversion to Eigen::MatrixBase<MatType> + bp::converter::registry::push_back + (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible), + &EigenFromPy<MatType>::construct,bp::type_id< Eigen::MatrixBase<MatType> >()); + } + }; + + template<typename MatType> + struct EigenFromPyConverter< eigenpy::Ref<MatType> > + { + static void registration() + { + bp::converter::registry::push_back + (reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible), + &EigenFromPy<MatType>::construct,bp::type_id<MatType>()); + } + }; + + template<typename MatType> void enableEigenPySpecific() { @@ -337,7 +358,8 @@ namespace eigenpy if(check_registration<MatType>()) return; bp::to_python_converter<MatType,EigenToPy<MatType> >(); - EigenFromPy<MatType>(); + EigenFromPyConverter<MatType>::registration(); + } } // namespace eigenpy diff --git a/unittest/matrix.cpp b/unittest/matrix.cpp index b65d2f8709999ce641b8f36ec139996f42eff908..bc445148025df211ba65b114d50364bd6d0f97bf 100644 --- a/unittest/matrix.cpp +++ b/unittest/matrix.cpp @@ -72,8 +72,15 @@ Eigen::MatrixXd reflex(const MatType & M, bool verbose) return Eigen::MatrixXd(M); } +template<typename MatrixDerived> +MatrixDerived base(const Eigen::MatrixBase<MatrixDerived> & m) +{ + return m.derived(); +} + BOOST_PYTHON_MODULE(matrix) { + using namespace Eigen; namespace bp = boost::python; eigenpy::enableEigenPy(); @@ -92,4 +99,7 @@ BOOST_PYTHON_MODULE(matrix) bp::def("emptyVector", emptyVector); bp::def("emptyMatrix", emptyMatrix); + + bp::def("base", base<VectorXd>); + bp::def("base", base<MatrixXd>); }