1. 程式人生 > >3DSlicer11:體系結構2

3DSlicer11:體系結構2

1.複習MRML型別

MRML,Medical Reality Markup Langguage,資料型別可以獨立於系統視覺化和演算法部分執行。

MRML Scene資料物件包含了Slicer應用程式的狀態、原始資料、視覺化引數等諸多資料。每一個數據型別由特定的MRML Node來表示。MRML Scene實際上就是MRML Nodes的集合。

對於MRML資料型別,Slicer附帶了相應的方法進行操作。例如對其中的MRML Node進行Add、Delete、Select、Undo、Redo等。這些方法統稱為Slicer的MRML庫,其API函式就是用來對MRML Scene資料進行操作的。其他的元件,如Logic和GUI,一直在見識MRML Scene的變化,一旦MRML Scene發生了任何形式的操作,那麼Logic、GUI就會產生相應的操作。

2.工作目錄

開發前熟悉原始碼以及演算法庫的分佈是很有必要的。在使用CMake配置Slicer工程前,需要指定三個目錄:

  • Slicer原始碼資料夾
  • 目標生成資料夾
  • Qt庫資料夾

2.1 工程目標目錄結構

3Dslicer是在大量開源庫(ITK、VTK、CTK、DCMTK)的基礎之上開發的,所以編譯3Dslicer的時候我們一定會和這些演算法庫打交道。慶幸的是,我們並不需要逐個一一下載!3Dslicer在編譯的過程中,會通過網路自行下載各個庫的原始碼,並臨時進行編譯,所以Slicer工程目標目錄就會包含這些開源演算法庫的原始碼資料夾和編譯後的資料夾。

以經典演算法庫BRAINSTools工程為例,其編譯後對應各個資料夾,如下:

  • BRAINSTools:存放Git/SVN獲取的原始碼
  • BRAINSTools.dir:存放編譯日誌
  • BRAINSTools-build:存放編譯後的目標檔案
  • BRAINSTools-prefix:存放下載原始碼的配置檔案

像BRAINSTools這樣的工具包還有cmcurl、CTK、DCMTK、EMSegment、ITKV4、jqplot、LibArchive、MultiVolumeExplorer/MultiVolumeImporter、NUMPY、OpenIGTLink/OpenIGTLinkIF、python、qRestAPI、SlicerExecutionModel、tcl、teem、VTK、zlib等19個,沒事多翻翻原始碼總是有好處的。

Slicer-build資料夾是真正存放Slicer軟體編譯後的二進位制程式碼目錄,也是最關鍵的。使用Visual Studio開啟Slicer.sln就可以清楚整個工程的子工程(>500)。

2.2 應用程式原始碼目錄結構

Slicer的原始碼存放很有規律,方便瀏覽。在原始碼目錄.../Slicer下有眾多子目錄,每一個子目錄代表一個特點的功能子集。

  • Applications:該目錄下包含一個子目錄SlicerApp,該子目錄中的原始碼用於Slicer軟體平臺的框架,包括Main.cxx和主介面建立的原始碼。
  • Base:實現Slicer的基礎功能,包括CLI、Logic、Python、QTApp、QTCLI、QTCore、QTGUI等子目錄。其中,CLI實現命令列模組功能;Logic實現資料處理的邏輯順序、Python實現ITK、VTK演算法的Python功能;QTApp幫助建立主介面;QTCLI建立命令列模組介面;QTCore實現程式的檔案管理等基礎功能;QTGUI實現絕大多數的工具欄、程式設定介面。
  • CMake & SurperBuild: 存放程式編譯過程中需要使用到的*.cmake檔案。
  • Libs:Slicer不僅僅使用了其他檔案包中的庫檔案,還定義了很多函式庫,都存放在該目錄下。
  • Modules:所有型別模組的原始碼。
  • Resource:存放資原始檔,如HTML、icon、audio等。

2.3 CMakelist.txt分析

CMake可以根據不同平臺、不同編譯器生成相應的Makefile或者vcproj(Windows)專案。通過編寫CMakeLists.txt可以控制生成的Makefile,從而控制編譯過程

CMake自動生成的Makefile不僅可以通過make命令構建專案生成檔案,還支援make install安裝、make test測試安裝程式、make package生成當前平臺的安裝包、make package source生成原始碼包、產生Dashboard顯示資料並上傳等高階功能。所以說只要在CMakeList.txt中簡單配置,就可以完成很多複雜功能

Slicer原始碼中,每一個目錄以及其子目錄中,都會存在一個CMakeList.txt檔案,該檔案就是CMake程式配置Slicer工程的關鍵。CMake通過讀取CMakeList.txt中的程式碼從而得知編譯該目錄中的程式碼需要什麼編譯器進行編譯,需要什麼庫進行連結。