diff --git a/CMakeLists.txt b/CMakeLists.txt index e9eae80f9ab3301d9eafb44565e88e8d618cee94..7cd8628deee84a34fcbc62f806e47f312226b3ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,7 +21,6 @@ INCLUDE(cmake/base.cmake) INCLUDE(cmake/boost.cmake) INCLUDE(cmake/eigen.cmake) INCLUDE(cmake/python.cmake) -INCLUDE(CMakeDependentOption) SET(PROJECT_NAME pinocchio) SET(PROJECT_DESCRIPTION "Rigid multi body dynamics algorithms") @@ -71,17 +70,12 @@ OPTION (BUILD_UTILS "Build the utils" OFF) OPTION (INITIALIZE_WITH_NAN "Initialize Eigen entries with NaN" OFF) OPTION (BUILD_TESTS_WITH_HPP "Build geom tests and benchmarks with hpp to do comparisons" OFF) OPTION (BUILD_PYTHON_INTERFACE "Build the python binding" ON) -CMAKE_DEPENDENT_OPTION(BUILD_PYTHON_PARSER "Build pinocchio with the Python parser" ON "BUILD_PYTHON_INTERFACE" ON) IF (INITIALIZE_WITH_NAN) MESSAGE (STATUS "Initialize with NaN all the Eigen entries.") ADD_DEFINITIONS(-DEIGEN_INITIALIZE_MATRICES_BY_NAN) ENDIF (INITIALIZE_WITH_NAN) -IF(BUILD_PYTHON_PARSER) - SET(BUILD_PYTHON_INTERFACE ON) -ENDIF(BUILD_PYTHON_PARSER) - # ---------------------------------------------------- # --- DEPENDANCIES ----------------------------------- # ---------------------------------------------------- @@ -96,6 +90,7 @@ IF(EIGEN3_FOUND) IF(${EIGEN3_VERSION} VERSION_GREATER "3.2.9") ADD_DEFINITIONS(-DEIGEN3_FUTURE) SET(EIGEN3_FUTURE TRUE) + PKG_CONFIG_APPEND_CFLAGS("-DEIGEN3_FUTURE") ELSE(${EIGEN3_VERSION} VERSION_GREATER "3.2.9") SET(EIGEN3_FUTURE FALSE) ENDIF(${EIGEN3_VERSION} VERSION_GREATER "3.2.9") @@ -106,6 +101,7 @@ IF(URDFDOM_FOUND) IF(${URDFDOM_VERSION} VERSION_LESS "0.3.0") ADD_DEFINITIONS(-DURDFDOM_COLLISION_WITH_GROUP_NAME) SET(URDFDOM_COLLISION_WITH_GROUP_NAME TRUE) + PKG_CONFIG_APPEND_CFLAGS("-DURDFDOM_COLLISION_WITH_GROUP_NAME") ENDIF(${URDFDOM_VERSION} VERSION_LESS "0.3.0") ENDIF(URDFDOM_FOUND) @@ -113,9 +109,7 @@ SET(BOOST_REQUIERED_COMPONENTS filesystem system) SET(BOOST_BUILD_COMPONENTS unit_test_framework) SET(BOOST_OPTIONAL_COMPONENTS "") - IF(BUILD_PYTHON_INTERFACE) - ADD_SEPARATE_DEPENDENCY("eigenpy >= 1.3.0") SET(BOOST_OPTIONAL_COMPONENTS ${BOOST_OPTIONAL_COMPONENTS} python) FINDPYTHON(2.7 EXACT REQUIRED) INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS}) @@ -225,12 +219,6 @@ SET(${PROJECT_NAME}_PARSERS_HEADERS parsers/srdf.hpp ) -IF(BUILD_PYTHON_PARSER) - LIST(APPEND ${PROJECT_NAME}_PARSERS_HEADERS - parsers/python.hpp - ) -ENDIF(BUILD_PYTHON_PARSER) - IF(URDFDOM_FOUND) LIST(APPEND ${PROJECT_NAME}_PARSERS_HEADERS parsers/urdf.hpp @@ -309,6 +297,7 @@ ENDFOREACH(header) ADD_SUBDIRECTORY(src) # --- BINDINGS ----------------------------------------------------------------- +SET(PYWRAP ${PROJECT_NAME}_pywrap) ADD_SUBDIRECTORY(bindings) # --- EXECUTABLES -------------------------------------------------------------- @@ -323,17 +312,6 @@ ADD_SUBDIRECTORY(benchmark) # --- PACKAGING ---------------------------------------------------------------- PKG_CONFIG_APPEND_LIBS (${PROJECT_NAME}) PKG_CONFIG_APPEND_BOOST_LIBS(${BOOST_REQUIERED_COMPONENTS}) -IF(BUILD_PYTHON_PARSER) - PKG_CONFIG_APPEND_BOOST_LIBS(${BOOST_OPTIONAL_COMPONENTS}) -ENDIF(BUILD_PYTHON_PARSER) - -IF(EIGEN3_FUTURE) - PKG_CONFIG_APPEND_CFLAGS("-DEIGEN3_FUTURE") -ENDIF(EIGEN3_FUTURE) - -IF(URDFDOM_COLLISION_WITH_GROUP_NAME) - PKG_CONFIG_APPEND_CFLAGS("-DURDFDOM_COLLISION_WITH_GROUP_NAME") -ENDIF(URDFDOM_COLLISION_WITH_GROUP_NAME) FOREACH(cflags ${CFLAGS_DEPENDENCIES}) PKG_CONFIG_APPEND_CFLAGS(${cflags}) diff --git a/bindings/CMakeLists.txt b/bindings/CMakeLists.txt index 5d9271606adb612c79bb25c0a3a0db5d3012f85b..30ad08b96f4d4814346e67f10f03b1d891e1c57b 100644 --- a/bindings/CMakeLists.txt +++ b/bindings/CMakeLists.txt @@ -14,4 +14,6 @@ # pinocchio If not, see # <http://www.gnu.org/licenses/>. -ADD_SUBDIRECTORY(python) +IF(BUILD_PYTHON_INTERFACE) + ADD_SUBDIRECTORY(python) +ENDIF(BUILD_PYTHON_INTERFACE) diff --git a/bindings/python/CMakeLists.txt b/bindings/python/CMakeLists.txt index f18102a931a6b78ca83e9a5b23b4fabc4466a72c..b4545736904b28ade71fc055145a781bcd30c215 100644 --- a/bindings/python/CMakeLists.txt +++ b/bindings/python/CMakeLists.txt @@ -15,6 +15,8 @@ # Pinocchio If not, see # <http://www.gnu.org/licenses/>. +# --- MACROS --- # + MACRO(ADD_GROUP GROUP_NAME FILENAMES) FOREACH(filename ${${FILENAMES}}) GET_FILENAME_COMPONENT(filenamePath ${filename} PATH) @@ -35,154 +37,200 @@ MACRO(ADD_SOURCE_GROUP FILENAMES) ADD_GROUP("Source Files" ${FILENAMES}) ENDMACRO(ADD_SOURCE_GROUP FILENAMES) -IF(BUILD_PYTHON_INTERFACE) - - SET(${PROJECT_NAME}_PYTHON_HEADERS - eigen_container.hpp - handler.hpp - python.hpp - se3.hpp - force.hpp - motion.hpp - inertia.hpp - joints-models.hpp - joints-variant.hpp - joint.hpp - joint-derived.hpp - frame.hpp - model.hpp - data.hpp - algorithm/algorithms.hpp - parsers.hpp - explog.hpp - geometry-object.hpp - geometry-model.hpp - geometry-data.hpp - ) - - SET(${PROJECT_NAME}_PYTHON_SOURCES - module.cpp - expose-SE3.cpp - expose-motion.cpp - expose-force.cpp - expose-inertia.cpp - expose-explog.cpp - expose-joints.cpp - expose-frame.cpp - expose-model.cpp - expose-data.cpp - expose-parsers.cpp - algorithm/expose-algorithms.cpp - algorithm/expose-com.cpp - algorithm/expose-kinematics.cpp - algorithm/expose-dynamics.cpp - algorithm/expose-crba.cpp - algorithm/expose-rnea.cpp - algorithm/expose-aba.cpp - algorithm/expose-jacobian.cpp - algorithm/expose-joints.cpp - algorithm/expose-energy.cpp - algorithm/expose-frames.cpp - algorithm/expose-cat.cpp - ) - - LIST(APPEND ${PROJECT_NAME}_PYTHON_HEADERS - geometry-object.hpp - geometry-model.hpp - geometry-data.hpp - ) - - LIST(APPEND ${PROJECT_NAME}_PYTHON_SOURCES - expose-geometry.cpp - algorithm/expose-geometry.cpp - ) - - LIST(APPEND HEADERS ${${PROJECT_NAME}_PYTHON_HEADERS}) - LIST(REMOVE_DUPLICATES HEADERS) - - MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/bindings/python") - MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/bindings/python/algorithm") - FOREACH(header ${${PROJECT_NAME}_PYTHON_HEADERS}) +MACRO(SYMLINK_AND_INSTALL_HEADERS HEADERS SUBPATH) + FOREACH(header ${HEADERS}) GET_FILENAME_COMPONENT(headerName ${header} NAME) GET_FILENAME_COMPONENT(headerPath ${header} PATH) EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E ${LINK} - ${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${header} - ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/bindings/python/${header}) - INSTALL(FILES ${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${header} - DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}/bindings/python + ${CMAKE_CURRENT_SOURCE_DIR}/${header} + ${${PROJECT_NAME}_BINARY_DIR}/include/${PROJECT_NAME}/${SUBPATH}/${header}) + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/${header} + DESTINATION ${CMAKE_INSTALL_PREFIX}/include/${PROJECT_NAME}/SUBPATH PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_WRITE) ENDFOREACH(header) - - MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}") - - # --- COMPILE WRAPPER - SET(PYWRAP ${PROJECT_NAME}_pywrap) - ADD_LIBRARY(${PYWRAP} SHARED ${${PROJECT_NAME}_PYTHON_SOURCES} ${${PROJECT_NAME}_PYTHON_HEADERS}) - ADD_HEADER_GROUP(${PROJECT_NAME}_PYTHON_HEADERS) - ADD_SOURCE_GROUP(${PROJECT_NAME}_PYTHON_SOURCES) - PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} eigenpy) - - IF(URDFDOM_FOUND) - PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} urdfdom) - ENDIF(URDFDOM_FOUND) - IF(HPP_FCL_FOUND) - PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} hpp-fcl) - ENDIF(HPP_FCL_FOUND) - IF(LUA5_1_FOUND) - PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} lua5.1) - ENDIF(LUA5_1_FOUND) - - TARGET_LINK_LIBRARIES(${PYWRAP} ${PROJECT_NAME}) - TARGET_LINK_BOOST_PYTHON(${PYWRAP}) - - IF(APPLE) - # We need to change the extension for python bindings - SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES SUFFIX ".so") - ENDIF(APPLE) - - SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES - LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/python/${PROJECT_NAME}") - +ENDMACRO(SYMLINK_AND_INSTALL_HEADERS HEADERS SUBPATH) + +# --- DEPENDENCIES --- # +SET(PKG_CONFIG_PYWRAP_REQUIRES "eigenpy >= 1.3.1") +FOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES}) + ADD_SEPARATE_DEPENDENCY(${dep}) +ENDFOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES}) + +# --- LIBRARY --- # +SET(${PYWRAP}_INSTALL_DIR "${PYTHON_SITELIB}/${PROJECT_NAME}") + +SET(${PROJECT_NAME}_PYTHON_HEADERS + eigen_container.hpp + handler.hpp + python.hpp + se3.hpp + force.hpp + motion.hpp + inertia.hpp + joints-models.hpp + joints-variant.hpp + joint.hpp + joint-derived.hpp + frame.hpp + model.hpp + data.hpp + algorithm/algorithms.hpp + parsers.hpp + explog.hpp + geometry-object.hpp + geometry-model.hpp + geometry-data.hpp + ) + +SET(${PROJECT_NAME}_PARSER_PYTHON_HEADERS + parsers/python.hpp + ) + +SET(${PROJECT_NAME}_PARSER_PYTHON_SOURCES + parsers/python/model.cpp + ) + +SET(${PROJECT_NAME}_PYTHON_SOURCES + module.cpp + expose-SE3.cpp + expose-motion.cpp + expose-force.cpp + expose-inertia.cpp + expose-explog.cpp + expose-joints.cpp + expose-frame.cpp + expose-model.cpp + expose-data.cpp + expose-parsers.cpp + algorithm/expose-algorithms.cpp + algorithm/expose-com.cpp + algorithm/expose-kinematics.cpp + algorithm/expose-dynamics.cpp + algorithm/expose-crba.cpp + algorithm/expose-rnea.cpp + algorithm/expose-aba.cpp + algorithm/expose-jacobian.cpp + algorithm/expose-joints.cpp + algorithm/expose-energy.cpp + algorithm/expose-frames.cpp + algorithm/expose-cat.cpp + ) + +LIST(APPEND ${PROJECT_NAME}_PYTHON_HEADERS + geometry-object.hpp + geometry-model.hpp + geometry-data.hpp + ) + +LIST(APPEND ${PROJECT_NAME}_PYTHON_SOURCES + expose-geometry.cpp + algorithm/expose-geometry.cpp + ) + +LIST(APPEND HEADERS ${${PROJECT_NAME}_PYTHON_HEADERS}) +LIST(REMOVE_DUPLICATES HEADERS) + +# Headers of the python binding +MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/bindings/python") +MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/bindings/python/algorithm") +SYMLINK_AND_INSTALL_HEADERS("${${PROJECT_NAME}_PYTHON_HEADERS}" "bindings/python") + +# Headers of the python parser +MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/include/pinocchio/parsers/python") +SYMLINK_AND_INSTALL_HEADERS("${${PROJECT_NAME}_PARSER_PYTHON_HEADERS}" "") + +# --- COMPILE WRAPPER +MAKE_DIRECTORY("${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${PROJECT_NAME}") +SET(${PYWRAP}_SOURCES ${${PROJECT_NAME}_PYTHON_SOURCES} ${${PROJECT_NAME}_PARSER_PYTHON_SOURCES}) +SET(${PYWRAP}_HEADERS ${${PROJECT_NAME}_PYTHON_HEADERS} ${${PROJECT_NAME}_PARSER_PYTHON_HEADERS}) + +ADD_LIBRARY(${PYWRAP} SHARED ${${PYWRAP}_SOURCES} ${${PYWRAP}_HEADERS}) +ADD_HEADER_GROUP(${PYWRAP}_PYTHON_HEADERS) +ADD_SOURCE_GROUP(${PYWRAP}_PYTHON_SOURCES) +PKG_CONFIG_USE_DEPENDENCY(${PYWRAP} eigenpy) + +TARGET_LINK_LIBRARIES(${PYWRAP} ${PROJECT_NAME}) +TARGET_LINK_BOOST_PYTHON(${PYWRAP}) + +IF(APPLE) + # We need to change the extension for python bindings + SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES SUFFIX ".so") +ENDIF(APPLE) + +SET_TARGET_PROPERTIES(${PYWRAP} PROPERTIES + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bindings/python/lib") + +INSTALL(FILES + "${CMAKE_BINARY_DIR}/bindings/python/lib/lib${PYWRAP}.so" + DESTINATION ${${PYWRAP}_INSTALL_DIR}) + +# --- INSTALL SCRIPTS +SET(PYTHON_FILES + __init__.py + utils.py + robot_wrapper.py + romeo_wrapper.py + rpy.py + explog.py + ) + +FOREACH(python ${PYTHON_FILES}) + GET_FILENAME_COMPONENT(pythonFile ${python} NAME) + EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E ${LINK} + ${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${python} + ${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}) + + # Tag pyc file as generated. + SET_SOURCE_FILES_PROPERTIES( + "${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}c" + PROPERTIES GENERATED TRUE) + + EXECUTE_PROCESS(COMMAND + ${PYTHON_EXECUTABLE} -m py_compile + ${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}) + + # Clean generated files. + SET_PROPERTY( + DIRECTORY APPEND PROPERTY + ADDITIONAL_MAKE_CLEAN_FILES + "${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}c") + INSTALL(FILES - "${CMAKE_BINARY_DIR}/lib/python/${PROJECT_NAME}/lib${PYWRAP}.so" - DESTINATION ${PYTHON_SITELIB}/${PROJECT_NAME}) - - # --- INSTALL SCRIPTS - SET(PYTHON_FILES - __init__.py - utils.py - robot_wrapper.py - romeo_wrapper.py - rpy.py - explog.py - ) - - FOREACH(python ${PYTHON_FILES}) - GET_FILENAME_COMPONENT(pythonFile ${python} NAME) - EXECUTE_PROCESS(COMMAND ${CMAKE_COMMAND} -E ${LINK} - ${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${python} - ${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}/${pythonFile}) - - # Tag pyc file as generated. - SET_SOURCE_FILES_PROPERTIES( - "${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}/${pythonFile}c" - PROPERTIES GENERATED TRUE) - - EXECUTE_PROCESS(COMMAND - ${PYTHON_EXECUTABLE} -m py_compile - ${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}/${pythonFile}) - - # Clean generated files. - SET_PROPERTY( - DIRECTORY APPEND PROPERTY - ADDITIONAL_MAKE_CLEAN_FILES - "${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}/${pythonFile}c") - - INSTALL(FILES - "${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${python}" - "${${PROJECT_NAME}_BINARY_DIR}/lib/python/${PROJECT_NAME}/${pythonFile}c" - DESTINATION ${PYTHON_SITELIB}/${PROJECT_NAME}) - ENDFOREACH(python) - -ENDIF(BUILD_PYTHON_INTERFACE) + "${${PROJECT_NAME}_SOURCE_DIR}/bindings/python/${python}" + "${${PROJECT_NAME}_BINARY_DIR}/bindings/python/${pythonFile}c" + DESTINATION ${${PYWRAP}_INSTALL_DIR}) +ENDFOREACH(python) + +# --- PACKAGING --- # + +# Format string +SET(_PKG_CONFIG_PYWRAP_LIBDIR ${${PYWRAP}_INSTALL_DIR}) +SET(_PKG_CONFIG_PYWRAP_BINDIR ${${PYWRAP}_INSTALL_DIR}) +SET(_PKG_CONFIG_PYWRAP_CONFLICTS) +SET(_PKG_CONFIG_PYWRAP_REQUIRES "${PROJECT_NAME}") +FOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES}) + SET(_PKG_CONFIG_PYWRAP_REQUIRES "${_PKG_CONFIG_PYWRAP_REQUIRES}, ${dep}") +ENDFOREACH(dep ${PKG_CONFIG_PYWRAP_REQUIRES}) + +SET(_PKG_CONFIG_PYWRAP_LIBS "-L\${libdir} -l${PYWRAP}") +IF(APPLE) + SET(_PKG_CONFIG_PYWRAP_LIBS "${_PKG_CONFIG_PYWRAP_LIBS} -Wl,-undefined,dynamic_lookup,${Boost_${UPPERCOMPONENT}_LIBRARY}") +ELSE(APPLE) + SET(_PKG_CONFIG_PYWRAP_LIBS "${_PKG_CONFIG_PYWRAP_LIBS} ${LIBINCL_KW}boost_python") +ENDIF(APPLE) + +SET(_PKG_CONFIG_PYWRAP_CFLAGS "-I\${includedir} -I/usr/local/include") +SET(_PKG_CONFIG_PYWRAP_CFLAGS "${_PKG_CONFIG_PYWRAP_CFLAGS} -I${PYTHON_INCLUDE_DIRS}") +FOREACH(cflags ${CFLAGS_DEPENDENCIES}) + SET(_PKG_CONFIG_PYWRAP_CFLAGS "${_PKG_CONFIG_PYWRAP_CFLAGS} ${cflags}") +ENDFOREACH(cflags ${CFLAGS_DEPENDENCIES}) + +CONFIGURE_FILE( + "${CMAKE_CURRENT_SOURCE_DIR}/pinocchiopy.pc.cmake" + "${CMAKE_CURRENT_BINARY_DIR}/pinocchiopy.pc") + +INSTALL( + FILES "${CMAKE_CURRENT_BINARY_DIR}/pinocchiopy.pc" + DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig + PERMISSIONS OWNER_READ GROUP_READ WORLD_READ OWNER_WRITE) diff --git a/src/parsers/python.hpp b/bindings/python/parsers/python.hpp similarity index 100% rename from src/parsers/python.hpp rename to bindings/python/parsers/python.hpp diff --git a/src/parsers/python.cpp b/bindings/python/parsers/python/model.cpp similarity index 78% rename from src/parsers/python.cpp rename to bindings/python/parsers/python/model.cpp index 56a81ff59b817d046eeb653240a6214d71e51e78..21f46874e5e246496d6a1f0a12bebd515937e0a5 100644 --- a/src/parsers/python.cpp +++ b/bindings/python/parsers/python/model.cpp @@ -16,6 +16,7 @@ // <http://www.gnu.org/licenses/>. #include "pinocchio/parsers/python.hpp" +#include "pinocchio/bindings/python/model.hpp" #include <iostream> #include <Python.h> @@ -30,18 +31,13 @@ namespace se3 Model buildModel(const std::string & filename, const std::string & model_name, bool verbose) throw (bp::error_already_set) { Py_Initialize(); - // Get a dict for the global namespace to exec further python code with bp::object main_module = bp::import("__main__"); + // Get a dict for the global namespace to exec further python code with bp::dict globals = bp::extract<bp::dict>(main_module.attr("__dict__")); // We need to link to the pinocchio PyWrap. We delegate the dynamic loading to the python interpreter. - bp::exec("import pinocchio", globals); - - // Create a new Model, get a shared_ptr to it, and include this pointer - // into the global namespace. See python/handler.hpp for more details. - boost::shared_ptr<Model> model(new Model()); - bp::object obj(model); - globals[model_name] = obj; + + bp::object cpp_module( (bp::handle<>(PyImport_AddModule("libpinocchio_pywrap"))) ); // That's it, you can exec your python script, starting with a model you // can update as you want. @@ -53,13 +49,25 @@ namespace se3 PyErr_PrintEx(0); } + Model * model_ptr; + try + { + bp::object obj_model = globals[model_name]; + ModelHandler model_handler = bp::extract<ModelHandler>(obj_model); + model_ptr = model_handler.ptr(); + } + catch (bp::error_already_set & e) + { + PyErr_PrintEx(0); + } if (verbose) { - std::cout << "Your model has been built. It has " << model->nv; + std::cout << "Your model has been built. It has " << model_ptr->nv; std::cout << " degrees of freedom." << std::endl; } - return *model; +// Py_Finalize(); + return *model_ptr; } } // namespace python } // namespace se3 diff --git a/bindings/python/pinocchiopy.pc.cmake b/bindings/python/pinocchiopy.pc.cmake new file mode 100644 index 0000000000000000000000000000000000000000..6f99a18421d5f57b8ccd9a0dd9991d0e2919bb80 --- /dev/null +++ b/bindings/python/pinocchiopy.pc.cmake @@ -0,0 +1,19 @@ +prefix=${_PKG_CONFIG_PREFIX} +exec_prefix=${_PKG_CONFIG_EXEC_PREFIX} +libdir=${_PKG_CONFIG_PYWRAP_LIBDIR} +bindir=${_PKG_CONFIG_PYWRAP_BINDIR} +pkglibdir=${_PKG_CONFIG_PKGLIBDIR} +includedir=${_PKG_CONFIG_INCLUDEDIR} +datarootdir=${_PKG_CONFIG_DATAROOTDIR} +pkgdatarootdir=${_PKG_CONFIG_PKGDATAROOTDIR} +docdir=${_PKG_CONFIG_DOCDIR} +doxygendocdir=${_PKG_CONFIG_DOXYGENDOCDIR} + +Name: pinocchiopy +Description: Python bindings of Pinocchio +URL: ${_PKG_CONFIG_URL} +Version: ${_PKG_CONFIG_VERSION} +Requires: ${_PKG_CONFIG_PYWRAP_REQUIRES} +Conflicts: ${_PKG_CONFIG_PYWRAP_CONFLICTS} +Libs: ${_PKG_CONFIG_PYWRAP_LIBS} +Cflags: ${_PKG_CONFIG_PYWRAP_CFLAGS} diff --git a/models/simple_model.py b/models/simple_model.py index 6fbf0661b35411256671d8705226a305ab885e7f..c79d26a5ddfa2e35b551c1da03736520d299eed0 100644 --- a/models/simple_model.py +++ b/models/simple_model.py @@ -36,10 +36,10 @@ def color(body_number=1): class ModelWrapper(object): - def __init__(self, model, name=None, display=False): + def __init__(self, name=None, display=False): self.visuals = [('universe', se3.SE3.Identity(), se3.SE3.Identity().translation)] self.name = self.__class__.__name__ if name is None else name - self.model = model + self.model = se3.Model.BuildEmptyModel() self.display = display self.add_joints() @@ -149,4 +149,5 @@ class SimplestWalker(ModelWrapper): }, ] -SimplestWalker(model) +walker = SimplestWalker() +model = walker.model diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2cf9291bd5209366d5a6e13b65c0234891aefeae..a99fa96d0767873ea26bca6e6374801aacbd157b 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -51,12 +51,6 @@ SET(${PROJECT_NAME}_PARSERS_SOURCES parsers/sample-models.cpp ) -IF(BUILD_PYTHON_PARSER) - LIST(APPEND ${PROJECT_NAME}_PARSERS_SOURCES - parsers/python.cpp - ) -ENDIF(BUILD_PYTHON_PARSER) - IF(URDFDOM_FOUND) LIST(APPEND ${PROJECT_NAME}_PARSERS_SOURCES parsers/urdf/model.cpp @@ -86,10 +80,6 @@ IF(UNIX) PKG_CONFIG_USE_DEPENDENCY(${PROJECT_NAME} eigen3) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY}) - IF(BUILD_PYTHON_PARSER) - TARGET_LINK_BOOST_PYTHON(${PROJECT_NAME}) - ENDIF(BUILD_PYTHON_PARSER) - IF(URDFDOM_FOUND) PKG_CONFIG_USE_DEPENDENCY(${PROJECT_NAME} urdfdom) ENDIF(URDFDOM_FOUND) diff --git a/unittest/CMakeLists.txt b/unittest/CMakeLists.txt index 34b468b45cb145ec37862006bec47047c423d5c2..da6a9bb418d0f0ddbc1ed47024e68e05df741895 100644 --- a/unittest/CMakeLists.txt +++ b/unittest/CMakeLists.txt @@ -36,11 +36,6 @@ MACRO(ADD_UNIT_TEST NAME PKGS) TARGET_LINK_LIBRARIES(${NAME} ${PROJECT_NAME}) TARGET_LINK_LIBRARIES(${NAME} ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) - IF(BUILD_PYTHON_INTERFACE) - TARGET_LINK_BOOST_PYTHON(${NAME}) - TARGET_LINK_LIBRARIES(${NAME} ${PYTHON_LIBRARIES}) - ENDIF(BUILD_PYTHON_INTERFACE) - ADD_TEST(NAME ${NAME} COMMAND ${NAME}) ADD_DEPENDENCIES(check ${NAME}) ENDMACRO(ADD_UNIT_TEST) @@ -98,8 +93,15 @@ IF(LUA5_1_FOUND) ENDIF(LUA5_1_FOUND) IF(BUILD_PYTHON_INTERFACE) - ADD_UNIT_TEST(python_parser eigen3) + IF (BUILD_UNIT_TESTS) + ADD_EXECUTABLE(python_parser python_parser.cpp) + ELSE (BUILD_UNIT_TESTS) + ADD_EXECUTABLE(python_parser EXCLUDE_FROM_ALL python_parser.cpp) + ENDIF (BUILD_UNIT_TESTS) ADD_TEST_CFLAGS(python_parser '-DPINOCCHIO_SOURCE_DIR=\\\"${${PROJECT_NAME}_SOURCE_DIR}\\\"') + TARGET_LINK_LIBRARIES(python_parser ${PYWRAP}) + TARGET_LINK_LIBRARIES(python_parser ${PYTHON_LIBRARIES}) + TARGET_LINK_LIBRARIES(python_parser ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}) ENDIF(BUILD_PYTHON_INTERFACE) # Work in progress