3DSlicer16:数据类型MRML
生活随笔
收集整理的這篇文章主要介紹了
3DSlicer16:数据类型MRML
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.Slicer MRML數據類型綜述
- MRML提供API(應用程序接口)管理醫學圖像數據類型(Volume、Model、Transform、Fiducial、Camera等)和它們的可視化;
- 每種數據類型都用一個特定的MRML節點表示;
- MRML場景就是MRML節點的集合;
- Slicer的MRML數據模型(data Model)獨立于Slicer系統的可視化組件Visualization和算法組件Algorithm;
- 其他的Slicer組件,Logic和Qt Widget觀測MRML場景和每個節點的變化。
2.MRML 場景
- MRML場景管理MRML節點:添加、刪除、尋找等;
- MRML Scene provides persistence of MRML nodes (reading/writing to/from XML file)
3.MRML 節點
- MRML節點用于存貯Slicer應用的狀態,包括原始數據和可視化、參數。一組存儲核心Slicer Module狀態的的核心MRML節點如下所示:
- MRML節點以C++類等級的形式被組織,所有的子類均繼承vtkMRMLNode;
- 所有的MRML節點必須應用某種標準的API:ReadAttributes、WriteAttributes、Copy等;
- 相同的數據可以用不同的方式進行可視化,并儲存成不同的類型。因此,信息分別以三種不同節點類型進行存儲:
- 數據節點:存儲原始數據,例如vtkMRMLScalarVolumeNode存儲體素、spacing、位置、方向
- 顯示節點:描述了數據怎么樣被可視化,對于相同的原始數據可能會有很多的顯示節點,例如一個節點進行體繪制、另外一個節點用于顯示一張圖像
- 存儲節點:描述數據應該如何永久性存儲到磁盤中,文件格式、文件名
- 當一個數據節點被創建的時候,我們必須創建相應的顯示節點與數據存儲節點,方便進行合理的可視化和保存文件。MRMLLogic會提供函數——創建一個節點并與顯示節點&數據節點關聯。注意:在一些情況下,Slicer會檢測是否顯示節點與存儲節點遺失,并嘗試創建默認節點,但是作為開發人員我們不應該依賴這種錯誤校正機制。
4.MRML節點屬性
MRML節點可以成對存儲自定義屬性:屬性名+屬性值。 To avoid name clashes custom modules that adds attributes to nodes should prefix the attribute name with the module's name and the '.' character. Example: the DoseVolumeHistogram module can use attribute names such as DoseVolumeHistogram.StructureSetName, DoseVolumeHistogram.Unit, DoseVolumeHistogram.LineStyle.5.MRML節點引用
這里有兩種機制來指定節點間是相關的:層次結構節點&節點引用。相比之下,節點引用更簡單。 MRML節點可以利用節點引用API引用或者觀測其他的MRML節點。這個框架會自動處理:- 節點引用的讀、寫、復制
- 場景導入更新引用
- 增加或刪除節點
5.1 MRML Reference:API描述
上面的節點應用API功能是在vtkMRMLNote基類中實現的。 The only thing that needs to happen in thederived MRML node class(usually in the constructor of the class) is a call tovtkMRMLNode::AddNodeReferenceRole(const char *referenceRole, const char *mrmlAttributeName) that takes a unique string defining the reference role between this node and the referenced node, and a MRML attribute name for storing the reference in the .mrml file.The only other call that is needed is either:
vtkMRMLNode* SetAndObserveNodeReferenceID(const char* referenceRole , const char* referencedNodeID, vtkIntArray *events=0);
or
vtkMRMLNode* AddAndObserveNodeReferenceID(const char* referenceRole , const char* referencedNodeID, vtkIntArray *events=0);
vtkMRMLNode也提供了虛回調函數,可以在繼承類中拓展: OnNodeReferenceAdded(vtkMRMLNodeReference *reference) OnNodeReferenceRemoved(vtkMRMLNodeReference *reference) OnNodeReferenceModified(vtkMRMLNodeReference *reference)默認情況下,這些方法生成一下事件: vtkMRMLNode::ReferenceAddedEvent vtkMRMLNode::ReferenceRemovedEvent vtkMRMLNode::ReferenceModifiedEvent在繼承類中,這些方法可以采用VTKMRMLNode拓展,以允許查詢節點的引用。 vtkMRMLNode成員的完整列表參考如下網址,包括所有繼承的成員:
http://apidocs.slicer.org/master/classvtkMRMLNode-members.html
目前,下述的幾個MRML節點是采用MRML節點引用API實現的:
- vtkMRMLStorableNode
- vtkMRMLTransformableNode
- vtkMRMLDisplayableNode
5.2 MRML Reference:示例
vtkMRMLTransformableNode implementation:http://viewvc.slicer.org/viewvc.cgi/Slicer4/trunk/Libs/MRML/Core/vtkMRMLTransformableNode.h?view=log
vtkMRMLDisplayableNodeimplementation:
http://viewvc.slicer.org/viewvc.cgi/Slicer4/trunk/Libs/MRML/Core/vtkMRMLDisplayableNode.h?view=log
vtkMRMLStorableNodeimplementation:
http://viewvc.slicer.org/viewvc.cgi/Slicer4/trunk/Libs/MRML/Core/vtkMRMLStorableNode.h?view=log
6.MRML事件與觀測者Event-Observe
- MRML場景和各個節點的改變會傳遞給其他觀測者節點,GUI和Logic對象通過vtk事件、命令-觀測者機制。
- 使用vtkAddObserver()和InvokeEvent()方法。vtkSetMicro生成ModifiedEvent。
- 對于MRML,命令-觀測者機制采用助手vtkObserverManager、類、MRML觀測者宏、ProcessMRMLEvent方法實現。
- 觀測者應該存儲一個注冊的指針,該指針指向MRML節點,防止一個已經刪除對象的回調函數。
- MRML 觀察者宏定義位于 Libs/MRML/vtkMRMLNode.h
- vtkSetMRMLObjectMacro - 注冊 MRML節點
- vtkSetAndObserveMRMLObjectMacro - 注冊 MRML 節點,并為vtkCommand::ModifyEvent增加一個觀察者
- vtkSetAndObserveMRMLObjectEventsMacro - 注冊MRML節點并為一個指定的事件集合設置觀測者
- SetAndObserveMRMLScene[Events]() 方法在GUI/Logic中使用,用于觀察變化、新場景、增加節點等事件
- ProcessMRMLEvents method在MRML節點、Logic、GUI類中實現,在觀察節點中處理事件
7.創建自定義的MRML節點類
- 自定義MRML節點為模塊參數提供了永久性存儲
- 自定義MRML節點應該使用RegistraterNodeClass()在MRML場景中注冊,因此他們可以從一個場景文件中恢復或者保存
- 這個類應該實現以下方法:
- CreatNodeInstance()-與VTK的New()相似,只不過不是靜態的
- GetNodeTagName()-為這個節點返回一個獨一無二的XML標簽
- ReadXMLAttributes()-從XML文件中讀取節點屬性,如name-value
- WriteXML()-將節點屬性寫入到輸出流
- Copy()-拷貝節點屬性
- 如果該節點已經引用其他的節點,那么下面的方法也應該實現:
- UpdateReferenceID()-更新對另一個節點已經存儲的應用
- UpdataScene()-依賴這個節點更新場景中的其他節點
- 向MRML場景中添加新的節點
8.MRML層次結構節點
http://apidocs.slicer.org/master/classvtkMRMLHierarchyNode.html9.MRML:Developer FAQ
9.1 如何在場景中增加一個MRML節點?
- 通用的模式
- 在場景中添加一個多邊形數據?
- 從文件中加載一個多邊形數據?
9.2 加載一個MRML場景時,如果碰到以下信息該怎么辦?
ERROR: In /path/to/VTK/Imaging/vtkImageMapToColors.cxx, line 153 vtkImageMapToColors (0x268f190): RequestInformation: No LookupTable was set but number of components in input doesn't match OutputFormat, therefore input can't be passed through!ERROR: In /path/to/VTK/Imaging/vtkImageExtractComponents.cxx, line 239 vtkImageExtractComponents (0x26947e0): Execute: Component 1 is not in input.ERROR: In /path/to/VTK/Imaging/vtkImageExtractComponents.cxx, line 239 vtkImageExtractComponents (0x26947e0): Execute: Component 1 is not in input.[...] 確保每一個VolumeDisplay節點都設置了ColorNodeRef屬性。9.3 如何在2D視窗中改變立體?
appLogic = slicer.app.applicationLogic() selectionNode = appLogic.GetSelectionNode() selectionNode.SetReferenceActiveVolumeID(bg) selectionNode.SetReferenceSecondaryVolumeID(fg) appLogic.PropagateVolumeSelection()總結
以上是生活随笔為你收集整理的3DSlicer16:数据类型MRML的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: § Transitive Intran
- 下一篇: 3DSlicer17:Logics