VTK修炼之道81:VTK开发基础_vtkObject类深入分析
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道81:VTK开发基础_vtkObject类深入分析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.前言
相比于vtkObjectBase,我們接觸更多的是vtkObject類。 vtkObjectBase類主要實(shí)現(xiàn)了引用計(jì)數(shù),因此vtkObject及其相關(guān)子類都繼承了該特性。 與此同時(shí),vtkObject中實(shí)現(xiàn)了一個(gè)在VTK中是用非常廣泛的觀察者/命令模式,該機(jī)制可以方便地處理消息響應(yīng),例如處理鼠標(biāo)消息、鍵盤消息、進(jìn)度條消息等,VTK的Widget中大量地使用了該機(jī)制進(jìn)行消息處理。2.觀察者/命令模式的工作流程
vtkObject中定義了一個(gè)vtkSubjectHelper對(duì)象來管理觀察者。vtkSubjectHelper內(nèi)部定義了一個(gè)觀察者vtkObserver對(duì)象鏈表。vtkObserver表示一個(gè)觀察者,其內(nèi)部定義了一個(gè)vtkCommand指針、一個(gè)消息ID以及一個(gè)表示優(yōu)先級(jí)的變量。直觀的理解為:當(dāng)觀察者監(jiān)聽到一個(gè)消息時(shí)(如鼠標(biāo)按下消息),就響應(yīng)vtkCommand定義的回調(diào)函數(shù)。2.1 添加AddObserver()和刪除觀察者RemoveObserver()
vtkObject通過如下函數(shù)可以添加和刪除觀察者: unsigned long AddObserver(unsigned long event, vtkCommand* , float priority = 0.0f); void RemoveObserver(unsigned long tag);- AddObserver用于添加一個(gè)觀察者
- 實(shí)現(xiàn)Execute()函數(shù)的兩種方式
- 對(duì)比實(shí)現(xiàn)Execute()函數(shù)的兩種實(shí)現(xiàn)方法
2.2 VTK中消息觸發(fā)
vtkObject中定義了觸發(fā)消息的函數(shù): int InvokeEvent(unsigned long event, void* callData); event為觸發(fā)的消息ID,callData為觸發(fā)消息后傳遞的數(shù)據(jù)。當(dāng)使用一個(gè)對(duì)象的InvokeEvent()來觸發(fā)一個(gè)消息后,對(duì)象則遍歷其內(nèi)部添加的vtkObserver對(duì)象,一旦發(fā)現(xiàn)與某個(gè)vtkObserver對(duì)象的消息ID一致,就會(huì)執(zhí)行該vtkObserver對(duì)象中的vtkCommand回調(diào)函數(shù)執(zhí)行相應(yīng)得操作,將callData傳遞到vtkCommand對(duì)象的Excute()函數(shù)中,vtkObject及其子類都可以添加一個(gè)或者多個(gè)vtkObserver對(duì)象,從而實(shí)現(xiàn)對(duì)不同的消息做出不同的響應(yīng)。2.3 觀察者監(jiān)聽消息實(shí)例
#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圖形圖像開發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.
總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道81:VTK开发基础_vtkObject类深入分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有两个程序员得了肺癌 都是30多岁的男人
- 下一篇: 历史重现,德国海关突袭IFA大展