@@ -42,6 +42,9 @@ namespace py { using namespace pybind11; }
4242// / To bring in the `_a` literal
4343using namespace pybind11 ::literals;
4444
45+ using Vector = Eigen::Matrix<SReal, Eigen::Dynamic, 1 >;
46+ using EigenVectorMap = Eigen::Map<Vector>;
47+
4548namespace 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
0 commit comments