Skip to content

Commit e0c48bf

Browse files
authored
Merge pull request #37 from jcarpent/devel
Register Eigen::MatrixBase
2 parents aaa031d + ce9e361 commit e0c48bf

File tree

2 files changed

+40
-8
lines changed

2 files changed

+40
-8
lines changed

include/eigenpy/details.hpp

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -183,13 +183,6 @@ namespace eigenpy
183183
template<typename MatType>
184184
struct EigenFromPy
185185
{
186-
EigenFromPy()
187-
{
188-
bp::converter::registry::push_back
189-
(reinterpret_cast<void *(*)(_object *)>(&convertible),
190-
&construct,bp::type_id<MatType>());
191-
}
192-
193186
// Determine if obj_ptr can be converted in a Eigenvec
194187
static void* convertible(PyArrayObject* obj_ptr)
195188
{
@@ -330,14 +323,43 @@ namespace eigenpy
330323
enableEigenPySpecific<MatType>();
331324
}
332325

326+
template<typename MatType>
327+
struct EigenFromPyConverter
328+
{
329+
static void registration()
330+
{
331+
bp::converter::registry::push_back
332+
(reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible),
333+
&EigenFromPy<MatType>::construct,bp::type_id<MatType>());
334+
335+
// Add also conversion to Eigen::MatrixBase<MatType>
336+
bp::converter::registry::push_back
337+
(reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible),
338+
&EigenFromPy<MatType>::construct,bp::type_id< Eigen::MatrixBase<MatType> >());
339+
}
340+
};
341+
342+
template<typename MatType>
343+
struct EigenFromPyConverter< eigenpy::Ref<MatType> >
344+
{
345+
static void registration()
346+
{
347+
bp::converter::registry::push_back
348+
(reinterpret_cast<void *(*)(_object *)>(&EigenFromPy<MatType>::convertible),
349+
&EigenFromPy<MatType>::construct,bp::type_id<MatType>());
350+
}
351+
};
352+
353+
333354
template<typename MatType>
334355
void enableEigenPySpecific()
335356
{
336357
numpy_import_array();
337358
if(check_registration<MatType>()) return;
338359

339360
bp::to_python_converter<MatType,EigenToPy<MatType> >();
340-
EigenFromPy<MatType>();
361+
EigenFromPyConverter<MatType>::registration();
362+
341363
}
342364

343365
} // namespace eigenpy

unittest/matrix.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,15 @@ Eigen::MatrixXd reflex(const MatType & M, bool verbose)
7272
return Eigen::MatrixXd(M);
7373
}
7474

75+
template<typename MatrixDerived>
76+
MatrixDerived base(const Eigen::MatrixBase<MatrixDerived> & m)
77+
{
78+
return m.derived();
79+
}
80+
7581
BOOST_PYTHON_MODULE(matrix)
7682
{
83+
using namespace Eigen;
7784
namespace bp = boost::python;
7885
eigenpy::enableEigenPy();
7986

@@ -92,4 +99,7 @@ BOOST_PYTHON_MODULE(matrix)
9299

93100
bp::def("emptyVector", emptyVector);
94101
bp::def("emptyMatrix", emptyMatrix);
102+
103+
bp::def("base", base<VectorXd>);
104+
bp::def("base", base<MatrixXd>);
95105
}

0 commit comments

Comments
 (0)