From 5459cbe149c2ecf43fe56112a955cc2b40805c3c Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Thu, 24 Aug 2017 01:23:07 -0400 Subject: [PATCH 01/11] COMP: Update minimum required CMake version from 2.8.9 to 3.5 Version required by PortPlacement now matches the version required by Slicer --- AutoPortPlacement/CMakeLists.txt | 2 +- AutoPortPlacement/Logic/CMakeLists.txt | 2 +- CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AutoPortPlacement/CMakeLists.txt b/AutoPortPlacement/CMakeLists.txt index 32f293a..4cd4739 100644 --- a/AutoPortPlacement/CMakeLists.txt +++ b/AutoPortPlacement/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.9) +cmake_minimum_required(VERSION 3.5) if(NOT DEFINED CMAKE_MACOSX_RPATH) set(CMAKE_MACOSX_RPATH OFF) diff --git a/AutoPortPlacement/Logic/CMakeLists.txt b/AutoPortPlacement/Logic/CMakeLists.txt index dd3c108..181154a 100644 --- a/AutoPortPlacement/Logic/CMakeLists.txt +++ b/AutoPortPlacement/Logic/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.9) +cmake_minimum_required(VERSION 3.5) if(NOT DEFINED CMAKE_MACOSX_RPATH) set(CMAKE_MACOSX_RPATH OFF) diff --git a/CMakeLists.txt b/CMakeLists.txt index f62e81d..f9b4209 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 2.8.9) +cmake_minimum_required(VERSION 3.5) project(PortPlacement) From f0be54d16abc0d20a8cad472d634e50444106b76 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Wed, 23 Aug 2017 23:25:30 -0400 Subject: [PATCH 02/11] COMP: Ensure Eigen3 can be found during configuration Since Eigen3 now provides a config file and is available through the extension index, this commit removes the local FindEigen3 module and explicitly makes use of the CONFIG mode (this avoid attempt to use FindEigen3.cmake provided by VTK). --- .../Logic/CMake/FindEigen3.cmake | 81 ------------------- AutoPortPlacement/Logic/CMakeLists.txt | 5 +- .../Logic/collisions/CMakeLists.txt | 2 + CMakeLists.txt | 4 + 4 files changed, 9 insertions(+), 83 deletions(-) delete mode 100644 AutoPortPlacement/Logic/CMake/FindEigen3.cmake diff --git a/AutoPortPlacement/Logic/CMake/FindEigen3.cmake b/AutoPortPlacement/Logic/CMake/FindEigen3.cmake deleted file mode 100644 index 9c546a0..0000000 --- a/AutoPortPlacement/Logic/CMake/FindEigen3.cmake +++ /dev/null @@ -1,81 +0,0 @@ -# - Try to find Eigen3 lib -# -# This module supports requiring a minimum version, e.g. you can do -# find_package(Eigen3 3.1.2) -# to require version 3.1.2 or newer of Eigen3. -# -# Once done this will define -# -# EIGEN3_FOUND - system has eigen lib with correct version -# EIGEN3_INCLUDE_DIR - the eigen include directory -# EIGEN3_VERSION - eigen version - -# Copyright (c) 2006, 2007 Montel Laurent, -# Copyright (c) 2008, 2009 Gael Guennebaud, -# Copyright (c) 2009 Benoit Jacob -# Redistribution and use is allowed according to the terms of the 2-clause BSD license. - -if(NOT Eigen3_FIND_VERSION) - if(NOT Eigen3_FIND_VERSION_MAJOR) - set(Eigen3_FIND_VERSION_MAJOR 2) - endif(NOT Eigen3_FIND_VERSION_MAJOR) - if(NOT Eigen3_FIND_VERSION_MINOR) - set(Eigen3_FIND_VERSION_MINOR 91) - endif(NOT Eigen3_FIND_VERSION_MINOR) - if(NOT Eigen3_FIND_VERSION_PATCH) - set(Eigen3_FIND_VERSION_PATCH 0) - endif(NOT Eigen3_FIND_VERSION_PATCH) - - set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}") -endif(NOT Eigen3_FIND_VERSION) - -macro(_eigen3_check_version) - file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header) - - string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}") - set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}") - string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}") - set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}") - string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}") - set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}") - - set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION}) - if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) - set(EIGEN3_VERSION_OK FALSE) - else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) - set(EIGEN3_VERSION_OK TRUE) - endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION}) - - if(NOT EIGEN3_VERSION_OK) - - message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, " - "but at least version ${Eigen3_FIND_VERSION} is required") - endif(NOT EIGEN3_VERSION_OK) -endmacro(_eigen3_check_version) - -if (EIGEN3_INCLUDE_DIR) - - # in cache already - _eigen3_check_version() - set(EIGEN3_FOUND ${EIGEN3_VERSION_OK}) - -else (EIGEN3_INCLUDE_DIR) - - find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library - PATHS - ${CMAKE_INSTALL_PREFIX}/include - ${KDE4_INCLUDE_DIR} - PATH_SUFFIXES eigen3 eigen - ) - - if(EIGEN3_INCLUDE_DIR) - _eigen3_check_version() - endif(EIGEN3_INCLUDE_DIR) - - include(FindPackageHandleStandardArgs) - find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK) - - mark_as_advanced(EIGEN3_INCLUDE_DIR) - -endif(EIGEN3_INCLUDE_DIR) - diff --git a/AutoPortPlacement/Logic/CMakeLists.txt b/AutoPortPlacement/Logic/CMakeLists.txt index 181154a..1521cc1 100644 --- a/AutoPortPlacement/Logic/CMakeLists.txt +++ b/AutoPortPlacement/Logic/CMakeLists.txt @@ -11,7 +11,8 @@ set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/CMake ${CMAKE_MODULE_PATH}) -find_package(Eigen3 REQUIRED) +find_package(Eigen3 REQUIRED CONFIG) + find_package(NLopt REQUIRED) set(KIT ${PROJECT_NAME}) @@ -19,7 +20,6 @@ set(KIT ${PROJECT_NAME}) set(${KIT}_EXPORT_DIRECTIVE "VTK_SLICER_${MODULE_NAME_UPPER}_MODULE_LOGIC_EXPORT") set(${KIT}_INCLUDE_DIRECTORIES - ${EIGEN3_INCLUDE_DIR} ${NLopt_INCLUDE_DIRS} ) include_directories(${${KIT}_INCLUDE_DIRECTORIES}) @@ -33,6 +33,7 @@ set(${KIT}_TARGET_LIBRARIES collisions davinci ${ITK_LIBRARIES} + Eigen3::Eigen ${NLopt_LIBRARIES} optim vtkSlicerAnnotationsModuleMRML diff --git a/AutoPortPlacement/Logic/collisions/CMakeLists.txt b/AutoPortPlacement/Logic/collisions/CMakeLists.txt index 24c5e7c..0168e17 100644 --- a/AutoPortPlacement/Logic/collisions/CMakeLists.txt +++ b/AutoPortPlacement/Logic/collisions/CMakeLists.txt @@ -2,4 +2,6 @@ add_library(collisions STATIC collisions.cxx collisions.h ) +target_link_libraries(collisions PUBLIC Eigen3::Eigen) + set_property(TARGET collisions PROPERTY POSITION_INDEPENDENT_CODE ON) diff --git a/CMakeLists.txt b/CMakeLists.txt index f9b4209..76c72d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,9 +16,13 @@ set(EXTENSION_SCREENSHOTURLS "http://wiki.slicer.org/slicerWiki/images/e/e2/Slic set( CMAKE_POSITION_INDEPENDENT_CODE ON ) #----------------------------------------------------------------------------- +# Extension dependencies find_package(Slicer REQUIRED) include(${Slicer_USE_FILE}) +find_package(Eigen3 REQUIRED CONFIG) +mark_as_superbuild(Eigen3_DIR) + #----------------------------------------------------------------------------- add_subdirectory(PortPlacement) add_subdirectory(AutoPortPlacement) From 8621b28fe7a71ea90673d4e560219d87a137a13b Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Thu, 24 Aug 2017 01:25:32 -0400 Subject: [PATCH 03/11] COMP: Build System: Switch to superbuild structure and build NLopt This commit partially reverts 869bfd5 (ENH: Remove nlopt source tree from PortPlacement code base) and download NLopt to fix allow the extension to build on Linux, macOS and Windows. --- AutoPortPlacement/Logic/CMake/FindNLopt.cmake | 33 ---------- AutoPortPlacement/Logic/CMakeLists.txt | 9 --- AutoPortPlacement/Logic/optim/CMakeLists.txt | 9 ++- CMakeLists.txt | 16 +++++ SuperBuild.cmake | 65 +++++++++++++++++++ SuperBuild/External_NLopt.cmake | 61 +++++++++++++++++ 6 files changed, 150 insertions(+), 43 deletions(-) delete mode 100644 AutoPortPlacement/Logic/CMake/FindNLopt.cmake create mode 100644 SuperBuild.cmake create mode 100644 SuperBuild/External_NLopt.cmake diff --git a/AutoPortPlacement/Logic/CMake/FindNLopt.cmake b/AutoPortPlacement/Logic/CMake/FindNLopt.cmake deleted file mode 100644 index 6c6b352..0000000 --- a/AutoPortPlacement/Logic/CMake/FindNLopt.cmake +++ /dev/null @@ -1,33 +0,0 @@ -find_package(PkgConfig QUIET) -PKG_CHECK_MODULES(PC_NLopt QUIET nlopt) - -find_path(NLopt_INCLUDE_DIR - NAMES nlopt.h - HINTS - ${NLopt_DIR} - ${PC_NLopt_INCLUDEDIR} - ${PC_NLopt_INCLUDE_DIRS} - PATH_SUFFIXES include - ) - -find_library(NLopt_LIBRARY - NAMES - nlopt - nlopt-0 - libnlopt - libnlopt-0 - HINTS - ${NLopt_DIR} - ${PC_NLopt_LIBDIR} - ${PC_NLopt_LIBRARY_DIRS} - PATH_SUFFIXES - lib - lib64 - ) - -set(NLopt_INCLUDE_DIRS ${NLopt_INCLUDE_DIR}) -set(NLopt_LIBRARIES ${NLopt_LIBRARY}) - -include(FindPackageHandleStandardArgs) -find_package_handle_standard_args(NLopt DEFAULT_MSG NLopt_INCLUDE_DIRS NLopt_LIBRARIES) -mark_as_advanced(NLopt_INCLUDE_DIR NLopt_LIBRARY) diff --git a/AutoPortPlacement/Logic/CMakeLists.txt b/AutoPortPlacement/Logic/CMakeLists.txt index 1521cc1..0d9156d 100644 --- a/AutoPortPlacement/Logic/CMakeLists.txt +++ b/AutoPortPlacement/Logic/CMakeLists.txt @@ -7,22 +7,14 @@ endif() #----------------------------------------------------------------------------- project(vtkSlicer${MODULE_NAME}ModuleLogic) -set(CMAKE_MODULE_PATH - ${CMAKE_CURRENT_SOURCE_DIR}/CMake - ${CMAKE_MODULE_PATH}) - find_package(Eigen3 REQUIRED CONFIG) -find_package(NLopt REQUIRED) - set(KIT ${PROJECT_NAME}) set(${KIT}_EXPORT_DIRECTIVE "VTK_SLICER_${MODULE_NAME_UPPER}_MODULE_LOGIC_EXPORT") set(${KIT}_INCLUDE_DIRECTORIES - ${NLopt_INCLUDE_DIRS} ) -include_directories(${${KIT}_INCLUDE_DIRECTORIES}) set(${KIT}_SRCS vtkSlicer${MODULE_NAME}Logic.cxx @@ -34,7 +26,6 @@ set(${KIT}_TARGET_LIBRARIES davinci ${ITK_LIBRARIES} Eigen3::Eigen - ${NLopt_LIBRARIES} optim vtkSlicerAnnotationsModuleMRML vtkSlicerMarkupsModuleMRML diff --git a/AutoPortPlacement/Logic/optim/CMakeLists.txt b/AutoPortPlacement/Logic/optim/CMakeLists.txt index 638f3e1..00ad387 100644 --- a/AutoPortPlacement/Logic/optim/CMakeLists.txt +++ b/AutoPortPlacement/Logic/optim/CMakeLists.txt @@ -1,3 +1,6 @@ + +find_package(NLopt REQUIRED CONFIG) + add_library(optim STATIC optim.cxx optim.h @@ -5,6 +8,10 @@ add_library(optim STATIC set_property(TARGET optim PROPERTY POSITION_INDEPENDENT_CODE ON) target_link_libraries(optim davinci - ${NLopt_LIBRARIES} + ${NLOPT_LIBRARIES} ${VTK_LIBRARIES} ) + +target_include_directories(optim PUBLIC + ${NLOPT_INCLUDE_DIRS} + ) diff --git a/CMakeLists.txt b/CMakeLists.txt index 76c72d9..b0231dc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,9 @@ set(EXTENSION_CONTRIBUTORS "Luis G. Torres (UNC)") set(EXTENSION_DESCRIPTION "Assists in the planning of surgical port placement in a laparoscopic procedure.") set(EXTENSION_ICONURL "http://viewvc.slicer.org/viewvc.cgi/Slicer4/trunk/Extensions/Testing/PortPlacement/PortPlacement.png?revision=21747&view=co") set(EXTENSION_SCREENSHOTURLS "http://wiki.slicer.org/slicerWiki/images/e/e2/Slicer-r19441-PortPlacement-screenshot.png") +set(EXTENSION_BUILD_SUBDIRECTORY inner-build) + +set(SUPERBUILD_TOPLEVEL_PROJECT inner) # # Implementation agnostic fPIC @@ -19,10 +22,23 @@ set( CMAKE_POSITION_INDEPENDENT_CODE ON ) # Extension dependencies find_package(Slicer REQUIRED) include(${Slicer_USE_FILE}) +mark_as_superbuild(Slicer_DIR) + +find_package(Git REQUIRED) +mark_as_superbuild(GIT_EXECUTABLE) find_package(Eigen3 REQUIRED CONFIG) mark_as_superbuild(Eigen3_DIR) +#----------------------------------------------------------------------------- +# SuperBuild setup +option(${EXTENSION_NAME}_SUPERBUILD "Build ${EXTENSION_NAME} and the projects it depends on." ON) +mark_as_advanced(${EXTENSION_NAME}_SUPERBUILD) +if(${EXTENSION_NAME}_SUPERBUILD) + include("${CMAKE_CURRENT_SOURCE_DIR}/SuperBuild.cmake") + return() +endif() + #----------------------------------------------------------------------------- add_subdirectory(PortPlacement) add_subdirectory(AutoPortPlacement) diff --git a/SuperBuild.cmake b/SuperBuild.cmake new file mode 100644 index 0000000..b95fc33 --- /dev/null +++ b/SuperBuild.cmake @@ -0,0 +1,65 @@ + +#----------------------------------------------------------------------------- +# Git protocol option +#----------------------------------------------------------------------------- +option(Slicer_USE_GIT_PROTOCOL "If behind a firewall turn this off to use http instead." ON) + +set(git_protocol "git") +if(NOT Slicer_USE_GIT_PROTOCOL) + set(git_protocol "http") +endif() + +#----------------------------------------------------------------------------- +# Enable and setup External project global properties +#----------------------------------------------------------------------------- + +set(ep_common_c_flags "${CMAKE_C_FLAGS_INIT} ${ADDITIONAL_C_FLAGS}") +set(ep_common_cxx_flags "${CMAKE_CXX_FLAGS_INIT} ${ADDITIONAL_CXX_FLAGS}") + +#----------------------------------------------------------------------------- +# Project dependencies +#----------------------------------------------------------------------------- + +include(ExternalProject) + +foreach(dep ${EXTENSION_DEPENDS}) + mark_as_superbuild(${dep}_DIR) +endforeach() + +set(proj ${SUPERBUILD_TOPLEVEL_PROJECT}) +set(${proj}_DEPENDS NLopt) + +ExternalProject_Include_Dependencies(${proj} + PROJECT_VAR proj + SUPERBUILD_VAR ${EXTENSION_NAME}_SUPERBUILD + ) + +ExternalProject_Add(${proj} + ${${proj}_EP_ARGS} + DOWNLOAD_COMMAND "" + INSTALL_COMMAND "" + SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} + BINARY_DIR ${EXTENSION_BUILD_SUBDIRECTORY} + BUILD_ALWAYS 1 + CMAKE_CACHE_ARGS + -DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER} + -DCMAKE_CXX_FLAGS:STRING=${ep_common_cxx_flags} + -DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS:STRING=${ep_common_c_flags} + -DCMAKE_CXX_STANDARD:STRING=${CMAKE_CXX_STANDARD} + -DCMAKE_CXX_STANDARD_REQUIRED:BOOL=${CMAKE_CXX_STANDARD_REQUIRED} + -DCMAKE_CXX_EXTENSIONS:BOOL=${CMAKE_CXX_EXTENSIONS} + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_RUNTIME_OUTPUT_DIRECTORY} + -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY} + -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + -DSubversion_SVN_EXECUTABLE:FILEPATH=${Subversion_SVN_EXECUTABLE} + -DGIT_EXECUTABLE:FILEPATH=${GIT_EXECUTABLE} + -DMIDAS_PACKAGE_EMAIL:STRING=${MIDAS_PACKAGE_EMAIL} + -DMIDAS_PACKAGE_API_KEY:STRING=${MIDAS_PACKAGE_API_KEY} + -D${EXTENSION_NAME}_SUPERBUILD:BOOL=OFF + -DEXTENSION_SUPERBUILD_BINARY_DIR:PATH=${${EXTENSION_NAME}_BINARY_DIR} + DEPENDS + ${${proj}_DEPENDS} + ) + diff --git a/SuperBuild/External_NLopt.cmake b/SuperBuild/External_NLopt.cmake new file mode 100644 index 0000000..d405762 --- /dev/null +++ b/SuperBuild/External_NLopt.cmake @@ -0,0 +1,61 @@ + +set(proj NLopt) + +# Set dependency list +set(${proj}_DEPENDS "") + +# Include dependent projects if any +ExternalProject_Include_Dependencies(${proj} PROJECT_VAR proj) + +if(${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj}) + message(FATAL_ERROR "Enabling ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj} is not supported !") +endif() + +# Sanity checks +if(DEFINED NLopt_DIR AND NOT EXISTS ${NLopt_DIR}) + message(FATAL_ERROR "NLopt_DIR variable is defined but corresponds to nonexistent directory") +endif() + +if(NOT DEFINED ${proj}_DIR AND NOT ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj}) + + if(NOT DEFINED git_protocol) + set(git_protocol "git") + endif() + + ExternalProject_Add(${proj} + ${${proj}_EP_ARGS} + GIT_REPOSITORY "${git_protocol}://github.com/stevengj/nlopt.git" + GIT_TAG "014208e6bd03531aab8c45cf1902bec8b720df99" # master 2017-08-05 + SOURCE_DIR ${CMAKE_BINARY_DIR}/${proj} + BINARY_DIR ${proj}-build + INSTALL_DIR ${proj}-install + CMAKE_CACHE_ARGS + -DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER} + -DCMAKE_CXX_FLAGS:STRING=${ep_common_cxx_flags} + -DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER} + -DCMAKE_C_FLAGS:STRING=${ep_common_c_flags} + -DCMAKE_CXX_STANDARD:STRING=${CMAKE_CXX_STANDARD} + -DCMAKE_CXX_STANDARD_REQUIRED:BOOL=${CMAKE_CXX_STANDARD_REQUIRED} + -DCMAKE_CXX_EXTENSIONS:BOOL=${CMAKE_CXX_EXTENSIONS} + -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} + -DBUILD_TESTING:BOOL=OFF + -DCMAKE_MACOSX_RPATH:BOOL=0 + -DCMAKE_RUNTIME_OUTPUT_DIRECTORY:PATH=${CMAKE_BINARY_DIR}/${Slicer_THIRDPARTY_BIN_DIR} + -DCMAKE_LIBRARY_OUTPUT_DIRECTORY:PATH=${CMAKE_BINARY_DIR}/${Slicer_THIRDPARTY_LIB_DIR} + -DCMAKE_ARCHIVE_OUTPUT_DIRECTORY:PATH=${CMAKE_ARCHIVE_OUTPUT_DIRECTORY} + # The following two variables should be udpated to match the + # requirements of a real CMake based external project. + -DNLopt_INSTALL_RUNTIME_DIR:STRING=${Slicer_INSTALL_THIRDPARTY_LIB_DIR} + -DNLopt_INSTALL_LIBRARY_DIR:STRING=${Slicer_INSTALL_THIRDPARTY_LIB_DIR} + -DCMAKE_INSTALL_PREFIX:PATH= + DEPENDS + ${${proj}_DEPENDS} + ) + set(${proj}_DIR ${CMAKE_BINARY_DIR}/${proj}-install/lib/cmake/nlopt/) + +else() + ExternalProject_Add_Empty(${proj} DEPENDS ${${proj}_DEPENDS}) +endif() + +mark_as_superbuild(${proj}_DIR:PATH) + From 9aed246f070c8e177d9eab3b9029e1cc556aaed6 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Thu, 24 Aug 2017 01:27:26 -0400 Subject: [PATCH 04/11] COMP: Generate PortPlacementConfig to allow reuse of logic and widgets This commit allows other extensions to reuse PortPlacement objects. --- AutoPortPlacement/Logic/collisions/CMakeLists.txt | 2 ++ AutoPortPlacement/Logic/davinci-kinematics/CMakeLists.txt | 2 ++ AutoPortPlacement/Logic/optim/CMakeLists.txt | 2 ++ CMakeLists.txt | 1 + 4 files changed, 7 insertions(+) diff --git a/AutoPortPlacement/Logic/collisions/CMakeLists.txt b/AutoPortPlacement/Logic/collisions/CMakeLists.txt index 0168e17..6ba8a79 100644 --- a/AutoPortPlacement/Logic/collisions/CMakeLists.txt +++ b/AutoPortPlacement/Logic/collisions/CMakeLists.txt @@ -5,3 +5,5 @@ add_library(collisions STATIC target_link_libraries(collisions PUBLIC Eigen3::Eigen) set_property(TARGET collisions PROPERTY POSITION_INDEPENDENT_CODE ON) + +set_property(GLOBAL APPEND PROPERTY Slicer_TARGETS collisions) diff --git a/AutoPortPlacement/Logic/davinci-kinematics/CMakeLists.txt b/AutoPortPlacement/Logic/davinci-kinematics/CMakeLists.txt index af86bdf..38caaf3 100644 --- a/AutoPortPlacement/Logic/davinci-kinematics/CMakeLists.txt +++ b/AutoPortPlacement/Logic/davinci-kinematics/CMakeLists.txt @@ -11,3 +11,5 @@ target_link_libraries(davinci ${ITK_LIBRARIES} ${VTK_LIBRARIES} ) + +set_property(GLOBAL APPEND PROPERTY Slicer_TARGETS davinci) diff --git a/AutoPortPlacement/Logic/optim/CMakeLists.txt b/AutoPortPlacement/Logic/optim/CMakeLists.txt index 00ad387..919a41d 100644 --- a/AutoPortPlacement/Logic/optim/CMakeLists.txt +++ b/AutoPortPlacement/Logic/optim/CMakeLists.txt @@ -15,3 +15,5 @@ target_link_libraries(optim target_include_directories(optim PUBLIC ${NLOPT_INCLUDE_DIRS} ) + +set_property(GLOBAL APPEND PROPERTY Slicer_TARGETS optim) diff --git a/CMakeLists.txt b/CMakeLists.txt index b0231dc..1c2c99d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -44,4 +44,5 @@ add_subdirectory(PortPlacement) add_subdirectory(AutoPortPlacement) #----------------------------------------------------------------------------- +include(${Slicer_EXTENSION_GENERATE_CONFIG}) include(${Slicer_EXTENSION_CPACK}) From 804fa7f7fc83149b0cc368896e16b36ac232dd02 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Thu, 24 Aug 2017 01:41:12 -0400 Subject: [PATCH 05/11] COMP: Build NLopt statically to facilitate distribution --- SuperBuild/External_NLopt.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/SuperBuild/External_NLopt.cmake b/SuperBuild/External_NLopt.cmake index d405762..221a83f 100644 --- a/SuperBuild/External_NLopt.cmake +++ b/SuperBuild/External_NLopt.cmake @@ -48,6 +48,7 @@ if(NOT DEFINED ${proj}_DIR AND NOT ${CMAKE_PROJECT_NAME}_USE_SYSTEM_${proj}) -DNLopt_INSTALL_RUNTIME_DIR:STRING=${Slicer_INSTALL_THIRDPARTY_LIB_DIR} -DNLopt_INSTALL_LIBRARY_DIR:STRING=${Slicer_INSTALL_THIRDPARTY_LIB_DIR} -DCMAKE_INSTALL_PREFIX:PATH= + -DBUILD_SHARED_LIBS:BOOL=OFF DEPENDS ${${proj}_DEPENDS} ) From 9954eff223c0aa85d31849bf87ae3c7e81607417 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Thu, 24 Aug 2017 01:42:26 -0400 Subject: [PATCH 06/11] COMP: Support building against Qt5 This commit fixes the following error: ``` from /tmp/PortPlacement/AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx:19: /tmp/PortPlacement/AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx:29:1: error: static assertion failed: Old plugin system used Q_EXPORT_PLUGIN2(qSlicerAutoPortPlacementModule, qSlicerAutoPortPlacementModule); ^ ``` --- AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx | 3 +++ AutoPortPlacement/qSlicerAutoPortPlacementModule.h | 3 +++ 2 files changed, 6 insertions(+) diff --git a/AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx b/AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx index 730ac71..1adb2a3 100644 --- a/AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx +++ b/AutoPortPlacement/qSlicerAutoPortPlacementModule.cxx @@ -26,7 +26,10 @@ #include "qSlicerAutoPortPlacementModuleWidget.h" //----------------------------------------------------------------------------- +#if (QT_VERSION < QT_VERSION_CHECK(5, 0, 0)) +#include Q_EXPORT_PLUGIN2(qSlicerAutoPortPlacementModule, qSlicerAutoPortPlacementModule); +#endif //----------------------------------------------------------------------------- /// \ingroup Slicer_QtModules_ExtensionTemplate diff --git a/AutoPortPlacement/qSlicerAutoPortPlacementModule.h b/AutoPortPlacement/qSlicerAutoPortPlacementModule.h index 1b92a4d..399daa1 100644 --- a/AutoPortPlacement/qSlicerAutoPortPlacementModule.h +++ b/AutoPortPlacement/qSlicerAutoPortPlacementModule.h @@ -31,6 +31,9 @@ qSlicerAutoPortPlacementModule : public qSlicerLoadableModule { Q_OBJECT +#ifdef Slicer_HAVE_QT5 + Q_PLUGIN_METADATA(IID "org.slicer.modules.loadable.qSlicerLoadableModule/1.0"); +#endif Q_INTERFACES(qSlicerLoadableModule); public: From 21aac5f800382849f6937bc2abb480a2a4a0f058 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Thu, 24 Aug 2017 01:43:20 -0400 Subject: [PATCH 07/11] BUG: Fix py_PortPlacement This commit fixes the following runtime error: ``` 2: File "/tmp/PortPlacement/PortPlacement/PortPlacement.py", line 238, in onRemovePortButton 2: index = self.portsTable.selectionModel().currentIndex() 2: TypeError: 'QModelIndex' object is not callable ``` ``` 2: Traceback (most recent call last): 2: File "/tmp/PortPlacement/PortPlacement/PortPlacement.py", line 735, in test_PortPlacement1 2: logic.toolList[i].modelNode.TransformPointFromWorld(targetWorld, targetLocal) 2: TypeError: TransformPointFromWorld argument 1: expected a sequence of 3 values, got 4 values ``` --- PortPlacement/PortPlacement.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PortPlacement/PortPlacement.py b/PortPlacement/PortPlacement.py index 23a77ed..c6a5b82 100644 --- a/PortPlacement/PortPlacement.py +++ b/PortPlacement/PortPlacement.py @@ -235,7 +235,7 @@ def onRemovePortButton(self): # Problem: currentIndex() can be valid even when there is no # visible selection. This will have to do for now while I figure # out how to making Python bindings to QList (ugh) - index = self.portsTable.selectionModel().currentIndex() + index = self.portsTable.selectionModel().currentIndex self.logic.markupsNode.RemoveMarkup(index.row()) self.updateTable() @@ -718,7 +718,7 @@ def test_PortPlacement1(self): target_p = [0,0,0] targetNode.GetNthFiducialPosition(0, target_p) - targetWorld = target_p + [1] + targetWorld = target_p # check retargeting by verifying that tools' positions are # unchanged and that their y-axes are oriented toward point @@ -731,7 +731,7 @@ def test_PortPlacement1(self): diff = numpy.array(p) - numpy.array(tool_pos) self.assertTrue(numpy.dot(diff,diff) < 1e-10) - targetLocal = [0,0,0,1] + targetLocal = [0,0,0] logic.toolList[i].modelNode.TransformPointFromWorld(targetWorld, targetLocal) targetLocal = numpy.array(targetLocal)[0:3] From 659e4d20b8d0da3e7f3774b2424487a4c2d9a8da Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Thu, 24 Aug 2017 01:49:56 -0400 Subject: [PATCH 08/11] COMP: Logics/tests: Fix unused parameter warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit fixes warnings like the following: ``` /tmp/PortPlacement/AutoPortPlacement/Logic/tests/min-distance-test.cxx:5:14: warning: unused parameter ‘argc’ [-Wunused-parameter] int main(int argc, char* argv[]) ^ /tmp/PortPlacement/AutoPortPlacement/Logic/tests/min-distance-test.cxx:5:31: warning: unused parameter ‘argv’ [-Wunused-parameter] int main(int argc, char* argv[]) ^ ``` --- AutoPortPlacement/Logic/tests/da-vinci-params-load-test.cxx | 2 +- AutoPortPlacement/Logic/tests/da-vinci-passive-ik-test.cxx | 2 +- AutoPortPlacement/Logic/tests/jacobian-test.cxx | 2 +- AutoPortPlacement/Logic/tests/min-distance-test.cxx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AutoPortPlacement/Logic/tests/da-vinci-params-load-test.cxx b/AutoPortPlacement/Logic/tests/da-vinci-params-load-test.cxx index b4b608f..748b33f 100644 --- a/AutoPortPlacement/Logic/tests/da-vinci-params-load-test.cxx +++ b/AutoPortPlacement/Logic/tests/da-vinci-params-load-test.cxx @@ -1,7 +1,7 @@ #include #include -int main(int argc, char** argv) +int main(int, char* []) { DavinciKinematics kinematics; diff --git a/AutoPortPlacement/Logic/tests/da-vinci-passive-ik-test.cxx b/AutoPortPlacement/Logic/tests/da-vinci-passive-ik-test.cxx index 23fffe4..b6b24bb 100644 --- a/AutoPortPlacement/Logic/tests/da-vinci-passive-ik-test.cxx +++ b/AutoPortPlacement/Logic/tests/da-vinci-passive-ik-test.cxx @@ -3,7 +3,7 @@ #include -int main(int argc, char* argv[]) +int main(int, char* []) { DavinciKinematics kinematics; diff --git a/AutoPortPlacement/Logic/tests/jacobian-test.cxx b/AutoPortPlacement/Logic/tests/jacobian-test.cxx index 4762251..3d8104f 100644 --- a/AutoPortPlacement/Logic/tests/jacobian-test.cxx +++ b/AutoPortPlacement/Logic/tests/jacobian-test.cxx @@ -1,7 +1,7 @@ #include #include -int main(int argc, char** argv) +int main(int, char* []) { std::vector q(6, 0.0); q[0] = 0.5; diff --git a/AutoPortPlacement/Logic/tests/min-distance-test.cxx b/AutoPortPlacement/Logic/tests/min-distance-test.cxx index fdc94da..fc016e5 100644 --- a/AutoPortPlacement/Logic/tests/min-distance-test.cxx +++ b/AutoPortPlacement/Logic/tests/min-distance-test.cxx @@ -2,7 +2,7 @@ #include -int main(int argc, char* argv[]) +int main(int, char* []) { std::vector c1, c2; std::vector s1, s2; From 570a5d1391137d15ed1e39246b2436c17c80bded Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Thu, 24 Aug 2017 01:50:24 -0400 Subject: [PATCH 09/11] COMP: davinci-kinematics: Fix unused function warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit fixes the following warning: ``` tmp/PortPlacement/AutoPortPlacement/Logic/davinci-kinematics/davinci.cxx:726:10: warning: ‘double {anonymous}::fromPoseToExtraClearance(const DavinciKinematics&, const Matrix4d&, const Matrix4d&, const Matrix4d&)’ defined but not used [-Wunused-function] double fromPoseToExtraClearance(const DavinciKinematics& kin, ^ ``` --- .../Logic/davinci-kinematics/davinci.cxx | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/AutoPortPlacement/Logic/davinci-kinematics/davinci.cxx b/AutoPortPlacement/Logic/davinci-kinematics/davinci.cxx index 5b94f6c..c3cdb69 100644 --- a/AutoPortPlacement/Logic/davinci-kinematics/davinci.cxx +++ b/AutoPortPlacement/Logic/davinci-kinematics/davinci.cxx @@ -721,26 +721,6 @@ void DavinciKinematics::unscentedIK(const Eigen::Matrix4d& portFrame, covariance_qOut->swap(covariance_q); } -namespace -{ - double fromPoseToExtraClearance(const DavinciKinematics& kin, - const Eigen::Matrix4d& portFrameL, - const Eigen::Matrix4d& portFrameR, - const Eigen::Matrix4d& targetPose) - { - std::vector qL(6); - std::vector qR(6); - std::vector cylL, cylR; - std::vector sL, sR; - - kin.intraIK(portFrameL, targetPose, &qL); - kin.intraIK(portFrameR, targetPose, &qR); - kin.getExtraCylispheres(portFrameL, qL, &cylL); - kin.getExtraCylispheres(portFrameR, qR, &cylR); - return Collisions::distance(cylL, sL, cylR, sR); - } -} - double DavinciKinematics::fullClearances(const Eigen::Matrix4d& baseFrameL, const Eigen::Matrix4d& baseFrameR, const std::vector& qL, From 2607ff6f53f484cc39dcd46b38467fc573ad5b47 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Thu, 24 Aug 2017 01:57:45 -0400 Subject: [PATCH 10/11] COMP: Fix segfault in qSlicerAutoPortPlacementModuleGenericTest --- AutoPortPlacement/Logic/vtkSlicerAutoPortPlacementLogic.cxx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/AutoPortPlacement/Logic/vtkSlicerAutoPortPlacementLogic.cxx b/AutoPortPlacement/Logic/vtkSlicerAutoPortPlacementLogic.cxx index 2e1c5c0..799c9e8 100644 --- a/AutoPortPlacement/Logic/vtkSlicerAutoPortPlacementLogic.cxx +++ b/AutoPortPlacement/Logic/vtkSlicerAutoPortPlacementLogic.cxx @@ -158,6 +158,11 @@ void vtkSlicerAutoPortPlacementLogic::RenderRobot() // Initializes the models and transforms for visualizing the Davinci robot. void vtkSlicerAutoPortPlacementLogic::InitRobot() { + if (!this->GetMRMLScene()) + { + return; + } + std::vector cylispheres; std::vector spheres(2); From 818dbc81aa48650b13dc0dfb78ad06693dc0bf75 Mon Sep 17 00:00:00 2001 From: Jean-Christophe Fillion-Robin Date: Fri, 25 Aug 2017 12:28:06 -0400 Subject: [PATCH 11/11] COMP: Add "Eigen3" extension as a dependency --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1c2c99d..38347ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ set(EXTENSION_CONTRIBUTORS "Luis G. Torres (UNC)") set(EXTENSION_DESCRIPTION "Assists in the planning of surgical port placement in a laparoscopic procedure.") set(EXTENSION_ICONURL "http://viewvc.slicer.org/viewvc.cgi/Slicer4/trunk/Extensions/Testing/PortPlacement/PortPlacement.png?revision=21747&view=co") set(EXTENSION_SCREENSHOTURLS "http://wiki.slicer.org/slicerWiki/images/e/e2/Slicer-r19441-PortPlacement-screenshot.png") +set(EXTENSION_DEPENDS "Eigen3") set(EXTENSION_BUILD_SUBDIRECTORY inner-build) set(SUPERBUILD_TOPLEVEL_PROJECT inner)