日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

VTK修炼之道81:VTK开发基础_vtkObject类深入分析

發(fā)布時(shí)間:2025/3/15 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VTK修炼之道81:VTK开发基础_vtkObject类深入分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.前言

相比于vtkObjectBase,我們接觸更多的是vtkObject類(lèi)。 vtkObjectBase類(lèi)主要實(shí)現(xiàn)了引用計(jì)數(shù),因此vtkObject及其相關(guān)子類(lèi)都繼承了該特性。 與此同時(shí),vtkObject中實(shí)現(xiàn)了一個(gè)在VTK中是用非常廣泛的觀察者/命令模式,該機(jī)制可以方便地處理消息響應(yīng),例如處理鼠標(biāo)消息、鍵盤(pán)消息、進(jìn)度條消息等,VTK的Widget中大量地使用了該機(jī)制進(jìn)行消息處理。

2.觀察者/命令模式的工作流程

vtkObject中定義了一個(gè)vtkSubjectHelper對(duì)象來(lái)管理觀察者。vtkSubjectHelper內(nèi)部定義了一個(gè)觀察者vtkObserver對(duì)象鏈表。vtkObserver表示一個(gè)觀察者,其內(nèi)部定義了一個(gè)vtkCommand指針、一個(gè)消息ID以及一個(gè)表示優(yōu)先級(jí)的變量。直觀的理解為:當(dāng)觀察者監(jiān)聽(tīng)到一個(gè)消息時(shí)(如鼠標(biāo)按下消息),就響應(yīng)vtkCommand定義的回調(diào)函數(shù)。

2.1 添加AddObserver()和刪除觀察者RemoveObserver()

vtkObject通過(guò)如下函數(shù)可以添加和刪除觀察者: unsigned long AddObserver(unsigned long event, vtkCommand* , float priority = 0.0f); void RemoveObserver(unsigned long tag);
  • AddObserver用于添加一個(gè)觀察者
當(dāng)執(zhí)行該函數(shù)時(shí),vtkSublectHelper對(duì)象根據(jù)event、vtkCommand對(duì)象和priority參數(shù)封裝為一個(gè)vtkObverser,并根據(jù)優(yōu)先級(jí)priority順序添加至觀察者列表中。 第二個(gè)參數(shù)為vtkCommand類(lèi)型,vtkCommand中封裝了消息處理函數(shù),該類(lèi)為一個(gè)虛基類(lèi),其中定義了一個(gè)純虛函數(shù): virtual void Execute(vtkObject* caller, unsigned long eventId, void* callData) = 0;當(dāng)觀察者檢測(cè)到event消息時(shí),會(huì)響應(yīng)該函數(shù)來(lái)執(zhí)行用戶(hù)設(shè)定的操作。 vtkCommand只是定義了一個(gè)接口,我們必須生成一個(gè)vtkCommand子類(lèi),并覆蓋Execute()函數(shù)實(shí)現(xiàn)具體的功能。
  • 實(shí)現(xiàn)Execute()函數(shù)的兩種方式
第一種方式是生成vtkCommand子類(lèi),并覆蓋Execute()函數(shù),在該函數(shù)中實(shí)現(xiàn)相應(yīng)的功能。virtual void Execute(vtkObject* caller, unsigned long eventId, void* callData) = 0;該函數(shù)有三個(gè)參數(shù),caller為觸發(fā)消息對(duì)象;eventId為消息Id;callData為消息觸發(fā)時(shí)需要傳遞的數(shù)據(jù)。 第二種方式是使用VTKCallbackCommand類(lèi)。該類(lèi)繼承vtkCommand,其內(nèi)部雖然覆蓋了Execute()函數(shù),但其實(shí)現(xiàn)是調(diào)用了一個(gè)內(nèi)部函數(shù),我們必須要自己定義這個(gè)函數(shù)。該函數(shù)為: void (*Callback) (vtkObject* , unsigned long , void* , void* );我們需要實(shí)現(xiàn)一個(gè)相同形式的回調(diào)函數(shù),并通過(guò)SetCallback()函數(shù)來(lái)設(shè)置回調(diào)函數(shù)的指針:void SetCallback( void(*f) (vtkObject* caller, unsigned long eid, void* clientdata, void* calldata) ); 當(dāng)我們定義了Callback()函數(shù)后,通過(guò)SetCallback()函數(shù)為VTKCallbackCommand設(shè)置回調(diào)函數(shù)。
  • 對(duì)比實(shí)現(xiàn)Execute()函數(shù)的兩種實(shí)現(xiàn)方法
通過(guò)對(duì)比Callback()函數(shù)的形式與Execute()函數(shù),我們可以發(fā)現(xiàn)函數(shù)參數(shù)數(shù)目有所不同。不同之處在于Callback()函數(shù)多了一個(gè)clientdata參數(shù)。這是為回調(diào)函數(shù)中使用其他對(duì)象留的一個(gè)接口。

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()來(lái)觸發(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及其子類(lèi)都可以添加一個(gè)或者多個(gè)vtkObserver對(duì)象,從而實(shí)現(xiàn)對(duì)不同的消息做出不同的響應(yīng)。

2.3 觀察者監(jiān)聽(tīng)消息實(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圖形圖像開(kāi)發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.

總結(jié)

以上是生活随笔為你收集整理的VTK修炼之道81:VTK开发基础_vtkObject类深入分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。