diff --git a/bindings/Modules/tests/SofaConstraintSolver/matrix_access.py b/bindings/Modules/tests/SofaConstraintSolver/matrix_access.py index 1a8dacdcd..d4a7f2894 100644 --- a/bindings/Modules/tests/SofaConstraintSolver/matrix_access.py +++ b/bindings/Modules/tests/SofaConstraintSolver/matrix_access.py @@ -1,6 +1,5 @@ import unittest import Sofa.Core -import Sofa.Components from Sofa import SofaConstraintSolver class Test(unittest.TestCase): diff --git a/bindings/Modules/tests/SofaLinearSolver/matrix_access.py b/bindings/Modules/tests/SofaLinearSolver/matrix_access.py index 0bb0618cb..09698bd29 100644 --- a/bindings/Modules/tests/SofaLinearSolver/matrix_access.py +++ b/bindings/Modules/tests/SofaLinearSolver/matrix_access.py @@ -1,6 +1,5 @@ import unittest import Sofa.Core -import Sofa.Components from Sofa import SofaLinearSolver class Test(unittest.TestCase): diff --git a/bindings/Sofa/Bindings.SofaConfig.cmake.in b/bindings/Sofa/Bindings.SofaConfig.cmake.in index c9f25fd66..864892140 100644 --- a/bindings/Sofa/Bindings.SofaConfig.cmake.in +++ b/bindings/Sofa/Bindings.SofaConfig.cmake.in @@ -8,7 +8,7 @@ find_package(SofaPython3 QUIET REQUIRED COMPONENTS Plugin) # Required by Bindings.Sofa.Helper, Bindings.Sofa.Types find_package(Sofa.Core QUIET REQUIRED) -# Required by Bindings.Sofa.Core, Bindings.Sofa.Components +# Required by Bindings.Sofa.Core find_package(Sofa.Simulation.Core QUIET REQUIRED) # Required by Bindings.Sofa.Core diff --git a/bindings/Sofa/CMakeLists.txt b/bindings/Sofa/CMakeLists.txt index 9bfab5b51..63227a2b9 100644 --- a/bindings/Sofa/CMakeLists.txt +++ b/bindings/Sofa/CMakeLists.txt @@ -1,7 +1,6 @@ project(Bindings.Sofa) set(SOFABINDINGS_MODULE_LIST - Components Core Helper Simulation diff --git a/bindings/Sofa/package/__init__.py b/bindings/Sofa/package/__init__.py index 5d77db2c5..8b4a62b2d 100644 --- a/bindings/Sofa/package/__init__.py +++ b/bindings/Sofa/package/__init__.py @@ -161,7 +161,6 @@ import Sofa.Core import Sofa.Simulation import Sofa.Types -import Sofa.Components import SofaTypes from .prefab import * diff --git a/bindings/Sofa/src/SofaPython3/Sofa/Components/CMakeLists.txt b/bindings/Sofa/src/SofaPython3/Sofa/Components/CMakeLists.txt deleted file mode 100644 index 67c1e21b9..000000000 --- a/bindings/Sofa/src/SofaPython3/Sofa/Components/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -project(Bindings.Sofa.Components) - -set(HEADER_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Submodule_Components.h -) - -set(SOURCE_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Submodule_Components.cpp -) - -sofa_find_package(Sofa.Simulation.Core REQUIRED) - -SP3_add_python_module( - TARGET ${PROJECT_NAME} - PACKAGE Bindings.Sofa - MODULE Components - DESTINATION Sofa - SOURCES ${SOURCE_FILES} - HEADERS ${HEADER_FILES} - DEPENDS Sofa.Simulation.Core SofaPython3::Plugin -) diff --git a/bindings/Sofa/src/SofaPython3/Sofa/Components/Submodule_Components.cpp b/bindings/Sofa/src/SofaPython3/Sofa/Components/Submodule_Components.cpp deleted file mode 100644 index 639ea6d2b..000000000 --- a/bindings/Sofa/src/SofaPython3/Sofa/Components/Submodule_Components.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/****************************************************************************** -* SOFA, Simulation Open-Framework Architecture * -* (c) 2021 INRIA, USTL, UJF, CNRS, MGH * -* * -* This program is free software; you can redistribute it and/or modify it * -* under the terms of the GNU Lesser General Public License as published by * -* the Free Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, but WITHOUT * -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * -* for more details. * -* * -* You should have received a copy of the GNU Lesser General Public License * -* along with this program. If not, see . * -******************************************************************************* -* Contact information: contact@sofa-framework.org * -******************************************************************************/ - - -#include - -#include -using sofa::core::objectmodel::BaseObjectDescription; -using sofa::core::ObjectFactory; - -#include -using sofa::helper::logging::Message; - -#include -using sofa::simulation::Node; - -#include -#include -#include - -#include -#include -#include - -namespace py = pybind11; -using namespace py::literals; - -namespace sofapython3 -{ - -class FCreator -{ -public: - FCreator(const std::string& n) - { - name = n; - } - std::string name; -}; - -PYBIND11_MODULE(Components, m) -{ - // These are needed to force the dynamic loading of module dependencies (found in CMakeLists.txt) - sofa::core::init(); - sofa::helper::init(); - sofa::simulation::core::init(); - - py::class_ mm(m, "Creator"); - mm.def("__call__", [](FCreator& s, const py::args& args, const py::kwargs& kwargs){ - if(args.size() != 1) - { - throw py::type_error("Invalid number of arguments. Only 1 argument of type 'Node' is allowed."); - } - - py::object pynode = args[0]; - if(!py::isinstance(pynode)) - { - throw py::type_error(std::string("Invalid first argument. Expecting 'Node' but got ") + py::cast(py::str(pynode))); - } - - auto node = py::cast>(pynode); - - /// Prepare the description to hold the different python attributes as data field's - /// arguments then create the object. - BaseObjectDescription desc {s.name.c_str(), s.name.c_str()}; - fillBaseObjectdescription(desc, kwargs); - auto object = py_shared_ptr(ObjectFactory::getInstance()->createObject(node.get(), &desc)); - - /// After calling createObject the returned value can be either a nullptr - /// or non-null but with error message or non-null. - /// Let's first handle the case when the returned pointer is null. - if(!object) - { - std::stringstream tmp ; - for(auto& s : desc.getErrors()) - tmp << s << msgendl ; - throw py::value_error(tmp.str()); - } - - //checkParamUsage(object.get(), desc); - - /// Convert the logged messages in the object's internal logging into python exception. - /// this is not a very fast way to do that...but well...python is slow anyway. And serious - /// error management has a very high priority. If performance becomes an issue we will fix it - /// when needed. - if(object->countLoggedMessages({Message::Error})) - { - throw py::value_error(object->getLoggedMessagesAsString({Message::Error})); - } - - return py::cast(object); - }); - - m.def("__getattr__", [](const std::string& name) -> py::object - { - return py::cast(new FCreator(name)); - }); - - // THIS PART IS NOT WORKING... - //todo(dmarchal 04/07/2019): do it or delete it in one year. -// py::list names; -// std::vector entries ; -// ObjectFactory::getInstance()->getAllEntries(entries) ; - -// for(auto& entry : entries) -// { -// names.append(entry->className); -// } - -// simulation.def("__dir__", []() -> py::object -// { -// py::list names; -// std::vector entries ; -// ObjectFactory::getInstance()->getAllEntries(entries) ; - -// for(auto& entry : entries) -// { -// names.append(entry->className); -// } -// return names; //std::move(names); -// }); - -} - -} /// namespace sofapython3 diff --git a/bindings/Sofa/src/SofaPython3/Sofa/Components/Submodule_Components.h b/bindings/Sofa/src/SofaPython3/Sofa/Components/Submodule_Components.h deleted file mode 100644 index 8c22387f9..000000000 --- a/bindings/Sofa/src/SofaPython3/Sofa/Components/Submodule_Components.h +++ /dev/null @@ -1,30 +0,0 @@ -/****************************************************************************** -* SOFA, Simulation Open-Framework Architecture * -* (c) 2021 INRIA, USTL, UJF, CNRS, MGH * -* * -* This program is free software; you can redistribute it and/or modify it * -* under the terms of the GNU Lesser General Public License as published by * -* the Free Software Foundation; either version 2.1 of the License, or (at * -* your option) any later version. * -* * -* This program is distributed in the hope that it will be useful, but WITHOUT * -* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * -* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * -* for more details. * -* * -* You should have received a copy of the GNU Lesser General Public License * -* along with this program. If not, see . * -******************************************************************************* -* Contact information: contact@sofa-framework.org * -******************************************************************************/ - -#pragma once - -#include - -namespace sofapython3 -{ -namespace py { using namespace pybind11; } - -} ///namespace sofapython3 - diff --git a/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_Base.cpp b/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_Base.cpp index 88f3a6df4..6aa8d7631 100644 --- a/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_Base.cpp +++ b/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_Base.cpp @@ -34,6 +34,8 @@ using sofa::helper::WriteOnlyAccessor; #include +#include +#include #include #include #include @@ -449,6 +451,9 @@ py::object BindingBase::setDataValues(Base& self, py::kwargs kwargs) void moduleAddBase(py::module &m) { + moduleForwardAddBaseData(m); + moduleForwardAddBaseLink(m); + py::class_> base(m, "Base", py::dynamic_attr(), doc::base::BaseClass); /// set & get the name as string. The alternative is to access the data field using /// obj.name.value = "aName" diff --git a/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseData.cpp b/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseData.cpp index f70de7c9c..ecc837503 100644 --- a/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseData.cpp +++ b/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseData.cpp @@ -192,10 +192,24 @@ std::string getValueTypeString(BaseData* data) return data->getValueTypeInfo()->name(); } +auto getPythonClassForBaseData(py::module& m) +{ + /// Register the BaseData binding into the pybind11 system. + static py::class_> data(m, "Data", sofapython3::doc::baseData::BaseDataClass); + return data; +} + +void moduleForwardAddBaseData(py::module& m) +{ + getPythonClassForBaseData(m); +} + void moduleAddBaseData(py::module& m) { /// Register the BaseData binding into the pybind11 system. - py::class_> data(m, "Data", sofapython3::doc::baseData::BaseDataClass); + //py::class_> data(m, "Data", sofapython3::doc::baseData::BaseDataClass); + + auto data =getPythonClassForBaseData(m); data.def("getName", [](BaseData& b){ return b.getName(); }, sofapython3::doc::baseData::getName); data.def("setName", [](BaseData& b, const std::string& s){ b.setName(s); }, sofapython3::doc::baseData::setName); data.def("getCounter", [](BaseData& self) { return self.getCounter(); }, sofapython3::doc::baseData::getCounter); diff --git a/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseData.h b/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseData.h index 6a747d1d7..badd65220 100644 --- a/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseData.h +++ b/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseData.h @@ -24,6 +24,7 @@ namespace sofapython3 { + void moduleForwardAddBaseData(pybind11::module& m); void moduleAddBaseData(pybind11::module& m); } /// sofapython3 diff --git a/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseLink.cpp b/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseLink.cpp index 101b88f88..c658eaec7 100644 --- a/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseLink.cpp +++ b/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseLink.cpp @@ -91,9 +91,21 @@ void __setattr__(py::object self, const std::string& s, py::object value) } } +auto getPythonClassForBaseLink(py::module& m) +{ + /// Register the BaseData binding into the pybind11 system. + static py::class_ link(m, "Link", sofapython3::doc::baseLink::baseLinkClass); + return link; +} + +void moduleForwardAddBaseLink(py::module& m) +{ + getPythonClassForBaseLink(m); +} + void moduleAddBaseLink(py::module& m) { - py::class_ link(m, "Link", sofapython3::doc::baseLink::baseLinkClass); + auto link = getPythonClassForBaseLink(m); link.def("getName", &BaseLink::getName, sofapython3::doc::baseLink::getName); link.def("setName", &BaseLink::setName, sofapython3::doc::baseLink::setName); link.def("isMultiLink", &BaseLink::isMultiLink, sofapython3::doc::baseLink::isMultiLink); diff --git a/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseLink.h b/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseLink.h index 6f03d5af6..1cf5df4ae 100644 --- a/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseLink.h +++ b/bindings/Sofa/src/SofaPython3/Sofa/Core/Binding_BaseLink.h @@ -24,6 +24,7 @@ namespace sofapython3 { + void moduleForwardAddBaseLink(pybind11::module& m); void moduleAddBaseLink(pybind11::module& m); } /// sofapython3 diff --git a/bindings/Sofa/tests/CMakeLists.txt b/bindings/Sofa/tests/CMakeLists.txt index 36d74080d..038c1cf0f 100644 --- a/bindings/Sofa/tests/CMakeLists.txt +++ b/bindings/Sofa/tests/CMakeLists.txt @@ -10,7 +10,6 @@ set(SOURCE_FILES ) set(PYTHON_FILES - ${CMAKE_CURRENT_SOURCE_DIR}/Components/Components.py ${CMAKE_CURRENT_SOURCE_DIR}/Core/Base.py ${CMAKE_CURRENT_SOURCE_DIR}/Core/BaseData.py ${CMAKE_CURRENT_SOURCE_DIR}/Core/BaseLink.py @@ -51,7 +50,6 @@ sofa_auto_set_target_rpath( add_test(NAME ${PROJECT_NAME} COMMAND ${PROJECT_NAME}) set(DIR_BINDING_LIST - Components Core Helper Simulation diff --git a/bindings/Sofa/tests/Components/Components.py b/bindings/Sofa/tests/Components/Components.py deleted file mode 100644 index d51891d4c..000000000 --- a/bindings/Sofa/tests/Components/Components.py +++ /dev/null @@ -1,13 +0,0 @@ -# coding: utf8 - -import Sofa.Core -import Sofa.Components -import unittest - -class Test(unittest.TestCase): - def test_component_creation(self): - root = Sofa.Core.Node("rootNode") - root.addObject('RequiredPlugin', name='Sofa.Component.StateContainer') - - c = Sofa.Components.MechanicalObject(root, name="dofs") - self.assertTrue(c.name.value == "dofs") diff --git a/bindings/Sofa/tests/PythonModule_Sofa_test.cpp b/bindings/Sofa/tests/PythonModule_Sofa_test.cpp index 4ddc5bf37..9d80485e5 100644 --- a/bindings/Sofa/tests/PythonModule_Sofa_test.cpp +++ b/bindings/Sofa/tests/PythonModule_Sofa_test.cpp @@ -58,7 +58,6 @@ static struct PythonModule_Sofa_tests : public PythonTestExtractor addTestDirectory(executable_directory+"/Bindings.Sofa.Tests.d/Helper", "Sofa_Helper_"); addTestDirectory(executable_directory+"/Bindings.Sofa.Tests.d/Simulation", "Sofa_Simulation_"); addTestDirectory(executable_directory+"/Bindings.Sofa.Tests.d/Types", "Sofa_Types_"); - addTestDirectory(executable_directory+"/Bindings.Sofa.Tests.d/Components", "Sofa_Components_"); } } python_tests;