1、增加扩展模块入口
无论是写python扩展还是写c++扩展都是从这里进入。 选中之后进入这里: 然后选择第一个 “Create Extension”,弹出如下窗口: 比如我起了下面的名字,设置了如下保存路径: 接着弹出这个界面(这个界面一般点选 OK 就可以了): 同时左侧多了红色框中的内容: 由上图可见,操作这些步骤后在文件夹下生成了两个文件: 文件CMakeLists.txt内容为:
cmake_minimum_required(VERSION 3.13.4)
project(PredictPoints)
set(EXTENSION_HOMEPAGE "https://www.slicer.org/wiki/Documentation/Nightly/Extensions/PredictPoints")
set(EXTENSION_CATEGORY "Examples")
set(EXTENSION_CONTRIBUTORS "John Doe (AnyWare Corp.)")
set(EXTENSION_DESCRIPTION "This is an example of a simple extension")
set(EXTENSION_ICONURL "http://www.example.com/Slicer/Extensions/PredictPoints.png")
set(EXTENSION_SCREENSHOTURLS "http://www.example.com/Slicer/Extensions/PredictPoints/Screenshots/1.png")
set(EXTENSION_DEPENDS "NA")
find_package(Slicer REQUIRED)
include(${Slicer_USE_FILE})
include(${Slicer_EXTENSION_GENERATE_CONFIG})
include(${Slicer_EXTENSION_CPACK})
下面是比较重要的步骤了:
1.1 、增加python 扩展模块
点选 默认Type 为scripted 即扩展模块为python扩展模块。
1.2 、增加 c++ 扩展模块
如果想要增加 c++ 扩展模块,只需要将上面的Type 改为 loadable 就可以了。
为扩展模块命名,如 DLPredict。 此时左侧界面又增加了一个文件夹“DLPredict”。 此时“DLPredict”文件夹下的文件目录结构:
D:.
│ CMakeLists.txt
│ qSlicerDLPredictModule.cxx
│ qSlicerDLPredictModule.h
│ qSlicerDLPredictModuleWidget.cxx
│ qSlicerDLPredictModuleWidget.h
│
├─Logic
│ CMakeLists.txt
│ vtkSlicerDLPredictLogic.cxx
│ vtkSlicerDLPredictLogic.h
│
├─Resources
│ │ qSlicerDLPredictModule.qrc
│ │
│ ├─Icons
│ │ DLPredict.png
│ │
│ └─UI
│ qSlicerDLPredictFooBarWidget.ui
│ qSlicerDLPredictModuleWidget.ui
│
├─Testing
│ │ CMakeLists.txt
│ │
│ └─Cxx
│ CMakeLists.txt
│
└─Widgets
CMakeLists.txt
qSlicerDLPredictFooBarWidget.cxx
qSlicerDLPredictFooBarWidget.h
在其根目录下的CMakeLists.txt 文件内容如下:
set(MODULE_NAME DLPredict)
set(MODULE_TITLE ${MODULE_NAME})
string(TOUPPER ${MODULE_NAME} MODULE_NAME_UPPER)
add_subdirectory(Logic)
add_subdirectory(Widgets)
set(MODULE_EXPORT_DIRECTIVE "Q_SLICER_QTMODULES_${MODULE_NAME_UPPER}_EXPORT")
set(MODULE_INCLUDE_DIRECTORIES
${CMAKE_CURRENT_SOURCE_DIR}/Logic
${CMAKE_CURRENT_BINARY_DIR}/Logic
${CMAKE_CURRENT_SOURCE_DIR}/Widgets
${CMAKE_CURRENT_BINARY_DIR}/Widgets
)
set(MODULE_SRCS
qSlicer${MODULE_NAME}Module.cxx
qSlicer${MODULE_NAME}Module.h
qSlicer${MODULE_NAME}ModuleWidget.cxx
qSlicer${MODULE_NAME}ModuleWidget.h
)
set(MODULE_MOC_SRCS
qSlicer${MODULE_NAME}Module.h
qSlicer${MODULE_NAME}ModuleWidget.h
)
set(MODULE_UI_SRCS
Resources/UI/qSlicer${MODULE_NAME}ModuleWidget.ui
)
set(MODULE_TARGET_LIBRARIES
vtkSlicer${MODULE_NAME}ModuleLogic
qSlicer${MODULE_NAME}ModuleWidgets
)
set(MODULE_RESOURCES
Resources/qSlicer${MODULE_NAME}Module.qrc
)
slicerMacroBuildLoadableModule(
NAME ${MODULE_NAME}
TITLE ${MODULE_TITLE}
EXPORT_DIRECTIVE ${MODULE_EXPORT_DIRECTIVE}
INCLUDE_DIRECTORIES ${MODULE_INCLUDE_DIRECTORIES}
SRCS ${MODULE_SRCS}
MOC_SRCS ${MODULE_MOC_SRCS}
UI_SRCS ${MODULE_UI_SRCS}
TARGET_LIBRARIES ${MODULE_TARGET_LIBRARIES}
RESOURCES ${MODULE_RESOURCES}
WITH_GENERIC_TESTS
)
if(BUILD_TESTING)
add_subdirectory(Testing)
endif()
其 subdirectory下的CMakeLists.txt 文件内容如下。 Logic文件夹下的CMakeLists.txt 文件内容如下:
project(vtkSlicer${MODULE_NAME}ModuleLogic)
set(KIT ${PROJECT_NAME})
set(${KIT}_EXPORT_DIRECTIVE "VTK_SLICER_${MODULE_NAME_UPPER}_MODULE_LOGIC_EXPORT")
set(${KIT}_INCLUDE_DIRECTORIES
)
set(${KIT}_SRCS
vtkSlicer${MODULE_NAME}Logic.cxx
vtkSlicer${MODULE_NAME}Logic.h
)
set(${KIT}_TARGET_LIBRARIES
${ITK_LIBRARIES}
)
SlicerMacroBuildModuleLogic(
NAME ${KIT}
EXPORT_DIRECTIVE ${${KIT}_EXPORT_DIRECTIVE}
INCLUDE_DIRECTORIES ${${KIT}_INCLUDE_DIRECTORIES}
SRCS ${${KIT}_SRCS}
TARGET_LIBRARIES ${${KIT}_TARGET_LIBRARIES}
)
Widgets文件夹下的CMakeLists.txt 文件内容如下:
project(qSlicer${MODULE_NAME}ModuleWidgets)
set(KIT ${PROJECT_NAME})
set(${KIT}_EXPORT_DIRECTIVE "Q_SLICER_MODULE_${MODULE_NAME_UPPER}_WIDGETS_EXPORT")
set(${KIT}_INCLUDE_DIRECTORIES
)
set(${KIT}_SRCS
qSlicer${MODULE_NAME}FooBarWidget.cxx
qSlicer${MODULE_NAME}FooBarWidget.h
)
set(${KIT}_MOC_SRCS
qSlicer${MODULE_NAME}FooBarWidget.h
)
set(${KIT}_UI_SRCS
../Resources/UI/qSlicer${MODULE_NAME}FooBarWidget.ui
)
set(${KIT}_RESOURCES
../Resources/qSlicer${MODULE_NAME}Module.qrc
)
set(${KIT}_TARGET_LIBRARIES
vtkSlicer${MODULE_NAME}ModuleLogic
)
SlicerMacroBuildModuleWidgets(
NAME ${KIT}
EXPORT_DIRECTIVE ${${KIT}_EXPORT_DIRECTIVE}
INCLUDE_DIRECTORIES ${${KIT}_INCLUDE_DIRECTORIES}
SRCS ${${KIT}_SRCS}
MOC_SRCS ${${KIT}_MOC_SRCS}
UI_SRCS ${${KIT}_UI_SRCS}
TARGET_LIBRARIES ${${KIT}_TARGET_LIBRARIES}
RESOURCES ${${KIT}_RESOURCES}
WRAP_PYTHONQT
)
至于怎么编写这些扩展模块的具体内容。一个办法是先将扩展模块编译进slicer项目,然后在vs项目中编写模块的代码。
|