@@ -39,15 +39,67 @@ using sofa::core::collision::ContactListener;
3939namespace sofapython3
4040{
4141
42+ pybind11::dict getContactData (const ContactListener& listener){
43+ pybind11::dict contactData;
44+ const sofa::Size numberOfContacts = listener.getNumberOfContacts ();
45+ contactData[" numberOfContacts" ] = numberOfContacts;
46+
47+ const std::vector<std::tuple<unsigned int , unsigned int , unsigned int , unsigned int >> contactElements = listener.getContactElements ();
48+ const std::vector<std::tuple<unsigned int , sofa::type::Vector3, unsigned int , sofa::type::Vector3>> contactPoints = listener.getContactPoints ();
49+
50+ std::vector<unsigned int > collisionElementsModel1;
51+ std::vector<unsigned int > collisionElementsModel2;
52+ collisionElementsModel1.reserve (numberOfContacts);
53+ collisionElementsModel2.reserve (numberOfContacts);
54+
55+ std::vector<sofa::type::Vector3> collisionPointsModel1;
56+ std::vector<sofa::type::Vector3> collisionPointsModel2;
57+ collisionPointsModel1.reserve (numberOfContacts);
58+ collisionPointsModel2.reserve (numberOfContacts);
59+
60+ for (unsigned int i = 0 ; i < numberOfContacts; i++){
61+
62+ if (std::get<0 >(contactElements[i]) == 0 ){
63+ collisionElementsModel1.emplace_back (std::get<1 >(contactElements[i]));
64+ collisionElementsModel2.emplace_back (std::get<3 >(contactElements[i]));
65+ }
66+ else {
67+ collisionElementsModel1.emplace_back (std::get<3 >(contactElements[i]));
68+ collisionElementsModel2.emplace_back (std::get<1 >(contactElements[i]));
69+ }
70+
71+ if (std::get<0 >(contactPoints[i]) == 0 ){
72+ collisionPointsModel1.emplace_back (std::get<1 >(contactPoints[i]));
73+ collisionPointsModel2.emplace_back (std::get<3 >(contactPoints[i]));
74+ }
75+ else {
76+ collisionPointsModel1.emplace_back (std::get<3 >(contactPoints[i]));
77+ collisionPointsModel2.emplace_back (std::get<1 >(contactPoints[i]));
78+ }
79+ }
80+
81+ contactData[" collisionPointsModel1" ] = collisionPointsModel1;
82+ contactData[" collisionPointsModel2" ] = collisionPointsModel2;
83+
84+ contactData[" collisionElementsModel1" ] = collisionElementsModel1;
85+ contactData[" collisionElementsModel2" ]= collisionElementsModel2;
86+
87+ return contactData;
88+ }
89+
90+
4291void moduleAddContactListener (pybind11::module &m)
4392{
4493 // / register the ContactListener binding in the pybind11 typing sytem
4594 pybind11::class_<ContactListener,
4695 sofa::core::objectmodel::BaseObject,
4796 py_shared_ptr<ContactListener>> c (m, " ContactListener" , sofapython3::doc::contactListener::contactListenerClass);
4897
49- // / Commented out until feature is in SOFA master
50- /* c.def("getNumberOfContacts", &ContactListener::getNumberOfContacts); */
98+ c.def (" getNumberOfContacts" , &ContactListener::getNumberOfContacts);
99+ c.def (" getContactData" , &getContactData);
100+ c.def (" getDistances" , &sofa::core::collision::ContactListener::getDistances);
101+ c.def (" getContactPoints" , &sofa::core::collision::ContactListener::getContactPoints);
102+ c.def (" getContactElements" , &sofa::core::collision::ContactListener::getContactElements);
51103
52104 // / register the ContactListener binding in the downcasting subsystem
53105 PythonFactory::registerType<ContactListener>([](sofa::core::objectmodel::Base* object)
0 commit comments