@@ -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
0 commit comments