From 17f16650cc1e469d743b35e3047aefbd8a0fa31a Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 29 Jul 2020 16:42:53 +0200 Subject: [PATCH] flatmesh: [skip ci] implement converters from Eigen3 matrices to Python --- .../App/MeshFlatteningBoostPython.cpp | 43 ++++++++++++++++--- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/src/Mod/MeshPart/App/MeshFlatteningBoostPython.cpp b/src/Mod/MeshPart/App/MeshFlatteningBoostPython.cpp index 0306ba070ede..b918787fffce 100644 --- a/src/Mod/MeshPart/App/MeshFlatteningBoostPython.cpp +++ b/src/Mod/MeshPart/App/MeshFlatteningBoostPython.cpp @@ -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 +struct eigen_matrix +{ + static PyObject* convert(const eigen_type& mat) + { + // + 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>(); + } +}; +} // namespace fm BOOST_PYTHON_MODULE(flatmesh) { @@ -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())) + .add_property("nodes", py::make_getter(&FaceUnwrapper::xyz_nodes, py::return_value_policy())) + .add_property("uv_nodes", py::make_getter(&FaceUnwrapper::uv_nodes, py::return_value_policy())) + .add_property("ze_nodes", py::make_getter(&FaceUnwrapper::ze_nodes, py::return_value_policy())) + .add_property("ze_poles", py::make_getter(&FaceUnwrapper::ze_poles, py::return_value_policy())) + .add_property("A", py::make_getter(&FaceUnwrapper::A, py::return_value_policy())); + + fm::eigen_matrix::to_python_converter(); + fm::eigen_matrix>::to_python_converter(); + fm::eigen_matrix>::to_python_converter(); + fm::eigen_matrix>::to_python_converter(); + fm::eigen_matrix>::to_python_converter(); }