Skip to content

Commit 0348766

Browse files
committed
UPDATE Binding_Mapping: add external_applyJT(out, in)
1 parent e0a1363 commit 0348766

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_Mapping.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ namespace py { using namespace pybind11; }
4242
/// To bring in the `_a` literal
4343
using namespace pybind11::literals;
4444

45+
using Vector = Eigen::Matrix<SReal, Eigen::Dynamic, 1>;
46+
using EigenVectorMap = Eigen::Map<Vector>;
47+
4548
namespace sofapython3
4649
{
4750
using sofa::core::Mapping;
@@ -173,10 +176,59 @@ namespace sofapython3
173176
}));
174177
}
175178

179+
template<class In, class Out>
180+
void declareRigidMapping(py::module& m) {
181+
const std::string pyclass_name = std::string("RigidMapping_") + In::Name() + "_" + Out::Name();
182+
183+
py::class_<sofa::component::mapping::nonlinear::RigidMapping<In, Out>, BaseObject, py_shared_ptr<sofa::component::mapping::nonlinear::RigidMapping<In, Out>>> rmg(m, pyclass_name.c_str(), "Test RIgidMapping");
184+
185+
rmg.def("external_applyJT", [](sofa::component::mapping::nonlinear::RigidMapping<In, Out>& self, py::object inVec) -> Vector
186+
{
187+
auto inVector = py::cast<py::array_t<double, py::array::c_style | py::array::forcecast>>(inVec).unchecked<1>();
188+
if (inVector.size() % self.NOut != 0)
189+
{
190+
msg_error("RigidMapping-binding") << "We cannot call applyJt with this inVec parameter. Sizes mismatch";
191+
return {};
192+
}
193+
194+
using MappingType = typename sofa::component::mapping::nonlinear::RigidMapping<In, Out>;
195+
using InDataVecDeriv = typename MappingType::InDataVecDeriv;
196+
using OutDataVecDeriv = typename MappingType::OutDataVecDeriv;
197+
198+
InDataVecDeriv out;
199+
OutDataVecDeriv in;
200+
201+
typename MappingType::InVecDeriv ivd;
202+
typename MappingType::OutVecDeriv ovd;
203+
for (size_t i = 0; i < (inVector.size() / self.NOut); i++)
204+
{
205+
ovd.push_back(MappingType::OutDeriv(inVector(3 * i), inVector(3 * i + 1), inVector(3 * i + 2)));
206+
ivd.push_back(MappingType::InDeriv());
207+
}
208+
in.setValue(ovd);
209+
out.setValue(ivd);
210+
211+
sofa::core::ExecParams* execparams = sofa::core::execparams::defaultInstance();
212+
sofa::core::MechanicalParams mparams(*execparams);
213+
{
214+
self.applyJT(&mparams, out, in);
215+
}
216+
typename MappingType::InVecDeriv ivdout = out.getValue();
217+
218+
return EigenVectorMap(ivdout.data()->ptr(), self.NIn* out.getValue().size());
219+
220+
});
221+
222+
}
223+
176224
void moduleAddMapping(py::module &m) {
177225
declareMapping<Rigid3dTypes, Vec3dTypes>(m);
178226
declareMapping<Vec3dTypes, Vec3dTypes>(m);
179227
declareMapping<Vec3dTypes, Vec1dTypes>(m);
228+
229+
declareRigidMapping<Rigid3dTypes, Vec3dTypes>(m);
230+
declareMapping<Vec3dTypes, Vec3dTypes>(m);
231+
declareMapping<Vec3dTypes, Vec1dTypes>(m);
180232
}
181233

182234
} // namespace sofapython3

bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_Mapping.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
#include <sofa/core/BaseMapping.h>
2424
#include <sofa/core/Mapping.h>
25+
#include <sofa/component/mapping/nonlinear/RigidMapping.h>
2526
#include <sofa/defaulttype/VecTypes.h>
2627
#include <sofa/core/MechanicalParams.h>
2728
#include <pybind11/pybind11.h>

0 commit comments

Comments
 (0)