VTK修炼之道81:VTK开发基础_vtkObject类深入分析
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道81:VTK开发基础_vtkObject类深入分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.前言
相比于vtkObjectBase,我們接觸更多的是vtkObject類。 vtkObjectBase類主要實現了引用計數,因此vtkObject及其相關子類都繼承了該特性。 與此同時,vtkObject中實現了一個在VTK中是用非常廣泛的觀察者/命令模式,該機制可以方便地處理消息響應,例如處理鼠標消息、鍵盤消息、進度條消息等,VTK的Widget中大量地使用了該機制進行消息處理。2.觀察者/命令模式的工作流程
vtkObject中定義了一個vtkSubjectHelper對象來管理觀察者。vtkSubjectHelper內部定義了一個觀察者vtkObserver對象鏈表。vtkObserver表示一個觀察者,其內部定義了一個vtkCommand指針、一個消息ID以及一個表示優先級的變量。直觀的理解為:當觀察者監聽到一個消息時(如鼠標按下消息),就響應vtkCommand定義的回調函數。2.1 添加AddObserver()和刪除觀察者RemoveObserver()
vtkObject通過如下函數可以添加和刪除觀察者: unsigned long AddObserver(unsigned long event, vtkCommand* , float priority = 0.0f); void RemoveObserver(unsigned long tag);- AddObserver用于添加一個觀察者
- 實現Execute()函數的兩種方式
- 對比實現Execute()函數的兩種實現方法
2.2 VTK中消息觸發
vtkObject中定義了觸發消息的函數: int InvokeEvent(unsigned long event, void* callData); event為觸發的消息ID,callData為觸發消息后傳遞的數據。當使用一個對象的InvokeEvent()來觸發一個消息后,對象則遍歷其內部添加的vtkObserver對象,一旦發現與某個vtkObserver對象的消息ID一致,就會執行該vtkObserver對象中的vtkCommand回調函數執行相應得操作,將callData傳遞到vtkCommand對象的Excute()函數中,vtkObject及其子類都可以添加一個或者多個vtkObserver對象,從而實現對不同的消息做出不同的響應。2.3 觀察者監聽消息實例
#include <vtkVersion.h> #include <vtkSmartPointer.h> #include "vtkTestFilter.h" #include <vtkCallbackCommand.h> #include <vtkCommand.h>void CallbackFunction(vtkObject* caller,long unsigned int eventId,void* clientData, void* callData ) {int* callDataCasted = reinterpret_cast<int*>(callData);std::cout << *callDataCasted << std::endl; }int main() {vtkSmartPointer<vtkTestFilter> filter =vtkSmartPointer<vtkTestFilter>::New();vtkSmartPointer<vtkCallbackCommand> callback =vtkSmartPointer<vtkCallbackCommand>::New();callback->SetCallback(CallbackFunction );filter->AddObserver(MyEvent, callback);filter->Update();system("pause");return EXIT_SUCCESS; }3. 參看資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發進階[M]. 機械工業出版社, 2015.
總結
以上是生活随笔為你收集整理的VTK修炼之道81:VTK开发基础_vtkObject类深入分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有两个程序员得了肺癌 都是30多岁的男人
- 下一篇: 历史重现,德国海关突袭IFA大展