Skip to content

Commit

Permalink
flatmesh: [skip ci] implement converters from Eigen3 matrices to Python
Browse files Browse the repository at this point in the history
  • Loading branch information
wwmayer committed Jul 29, 2020
1 parent a2926df commit 17f1665
Showing 1 changed file with 36 additions and 7 deletions.
43 changes: 36 additions & 7 deletions src/Mod/MeshPart/App/MeshFlatteningBoostPython.cpp
Expand Up @@ -171,7 +171,30 @@ boost::python::list getFlatBoundaryNodesPy(FaceUnwrapper& instance)
return ary;
}


namespace fm {
// https://www.boost.org/doc/libs/1_52_0/libs/python/doc/v2/faq.html
template<typename eigen_type>
struct eigen_matrix
{
static PyObject* convert(const eigen_type& mat)
{
// <class 'numpy.array'>
py::list ary;
for (int i = 0; i < mat.rows(); i++) {
py::list row;
for (int j = 0; j < mat.cols(); j++) {
row.append(mat.coeff(i ,j));
}
ary.append(row);
}
return boost::python::incref(ary.ptr());
}
static void to_python_converter()
{
py::to_python_converter<eigen_type, eigen_matrix<eigen_type>>();
}
};
} // namespace fm

BOOST_PYTHON_MODULE(flatmesh)
{
Expand Down Expand Up @@ -228,10 +251,16 @@ BOOST_PYTHON_MODULE(flatmesh)
.def("findFlatNodes", &FaceUnwrapper::findFlatNodes)
.def("interpolateFlatFace", &interpolateFlatFacePy)
.def("getFlatBoundaryNodes", &getFlatBoundaryNodesPy)
.def_readonly("tris", &FaceUnwrapper::tris)
.def_readonly("nodes", &FaceUnwrapper::xyz_nodes)
.def_readonly("uv_nodes", &FaceUnwrapper::uv_nodes)
.def_readonly("ze_nodes", &FaceUnwrapper::ze_nodes)
.def_readonly("ze_poles", &FaceUnwrapper::ze_poles)
.def_readonly("A", &FaceUnwrapper::A);
.add_property("tris", py::make_getter(&FaceUnwrapper::tris, py::return_value_policy<py::return_by_value>()))
.add_property("nodes", py::make_getter(&FaceUnwrapper::xyz_nodes, py::return_value_policy<py::return_by_value>()))
.add_property("uv_nodes", py::make_getter(&FaceUnwrapper::uv_nodes, py::return_value_policy<py::return_by_value>()))
.add_property("ze_nodes", py::make_getter(&FaceUnwrapper::ze_nodes, py::return_value_policy<py::return_by_value>()))
.add_property("ze_poles", py::make_getter(&FaceUnwrapper::ze_poles, py::return_value_policy<py::return_by_value>()))
.add_property("A", py::make_getter(&FaceUnwrapper::A, py::return_value_policy<py::return_by_value>()));

fm::eigen_matrix<spMat>::to_python_converter();
fm::eigen_matrix<ColMat<double, 2>>::to_python_converter();
fm::eigen_matrix<ColMat<double, 3>>::to_python_converter();
fm::eigen_matrix<ColMat<long, 1>>::to_python_converter();
fm::eigen_matrix<ColMat<long, 3>>::to_python_converter();
}

0 comments on commit 17f1665

Please sign in to comment.