vtk事件响应机制
来源:互联网 发布:网络协议分析课后答案 编辑:程序博客网 时间:2024/05/16 15:48
vtk中大致有三种时间响应机制:
- command/observer模式之callback function
vtk中的command/observer模式是最常用的,也是各种处理方式的基础。这里首先介绍如何使用callback function的方法:
void KeyPressCallbackFunction ( vtkObject* caller, long unsigned int eventId, void* clientData, void* callData ){ vtkRenderWindowInteractor *iren = static_cast<vtkRenderWindowInteractor*>(caller);// 指向调用这个callback函数的对象 vtkBoxWidget *tempWidget = static_cast<vtkBoxWidget*>(clientData); tempWidget->GetTransform(inverse); vtkSmartPointer<vtkMyCallback> callback = vtkSmartPointer<vtkMyCallback>::New(); tempWidget->AddObserver(vtkCommand::InteractionEvent, callback); std::cout << "Pressed: " << iren->GetKeySym() << std::endl;}int main(){ //… vtkSmartPointer<vtkCallbackCommand> keyPressCallback = vtkSmartPointer<vtkCallbackCommand>::New(); keyPressCallback->SetCallback(KeyPressCallbackFunction); keyPressCallback->SetClientData(boxWidget); iren->AddObserver(vtkCommand::KeyPressEvent, keyPressCallback); // 设置callback function和event的联系 //……}上述代码片段中,callback function是主要的调用方式。其中caller是调用该callback function的对象,通常是RenderWindowInteractor,或者其他VTKWidget类;eventId是处理的event代号;clientData是传递到该函数中的数据;callData是随着触发的event一起传递的数据。
2.command/observer模式之vtkCommand
这种方法与第一种方法的原理相同,只不过这里使用不是一个callback function,而是继承了vtkCommand类来实现自己需要的操作。具体的代码如下:
class vtkMyCallback : public vtkCommand{public: static vtkMyCallback *New() { return new vtkMyCallback; } virtual void Execute(vtkObject *caller, unsigned long, void*) {<span style="white-space:pre"></span>vtkSmartPointer<vtkTransform> t = vtkSmartPointer<vtkTransform>::New(); <span style="white-space:pre"></span>vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget*>(caller); <span style="white-space:pre"></span>widget->GetTransform(t);t->PreMultiply();t->Concatenate(vtkLinearTransform::SafeDownCast(inverse->GetInverse())); <span style="white-space:pre"></span>widget->GetProp3D()->SetUserTransform(t); }};int main(){ // …... vtkSmartPointer<vtkBoxWidget> boxWidget = vtkSmartPointer<vtkBoxWidget>::New(); boxWidget->SetInteractor(iren); boxWidget->SetPlaceFactor(1.0); boxWidget->SetProp3D(coneActor); boxWidget->PlaceWidget(); vtkSmartPointer<vtkMyCallback> callback = vtkSmartPointer<vtkMyCallback>::New(); boxWidget->AddObserver(vtkCommand::InteractionEvent, callback);// 处理event和callback的联系 boxWidget->On(); //……}
- interactor style
第三种方法是继承已有的interactor style来对自己希望设置的事件作出对应的响应,该方法可以看作是对若干个event的集合,缺点是只能对RenderWindowInteractor进行设置。该方法的代码片段如下:
class MyStyle : public vtkInteractorStyleImage{ public: static MyStyle* New(); vtkTypeMacro(MyStyle, vtkInteractorStyleImage); virtual void OnLeftButtonDown() { std::cout << "Pressed left mouse button." << std::endl; // Forward events vtkInteractorStyleImage::OnLeftButtonDown(); }virtual void OnRightButtonDown(){std::cout << "Pressed right mouse button." << std::endl;}virtual void OnRightButtonUp(){std::cout << "Release right mouse button." << std::endl;}virtual void OnMouseMove(){int *pos = this->GetInteractor()->GetEventPosition();std::cout << pos[0] << "" << pos[1] << "" << pos[2] << std::endl;}virtual void OnLeftButtonUp(){std::cout << "Release right mouse button." << std::endl;}};
参考文档:
- http://www.vtk.org/Wiki/VTK/Tutorials/Callbacks
- http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/DoubleClick
- http://www.cs.rpi.edu/~cutler/classes/visualization/F10/lectures/03_interaction.pdf
- http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/KeypressObserver
0 0
- vtk事件响应机制
- Swing事件响应机制
- JAVA事件响应机制
- iOS事件响应机制
- 事件响应机制
- cocos事件响应机制
- JAVA事件响应机制(转)
- cocos2dx 事件响应机制 CCNotificationCenter
- Android MotionEvent事件响应机制
- iOS事件传递响应机制
- iOS事件响应机制总结
- Cocos2dx 事件响应机制(2):事件处理机制
- Android事件分发机制,事件拦截和事件响应
- C#事件机制及响应方法
- UIScrollView 响应触摸事件的机制
- 事件响应机制与观察者模式
- chromium android 的事件响应机制
- chromium android 的事件响应机制
- Maven中聚合与继承的关系
- 实习第15天
- HDU 1754 I Hate It(线段树)
- NGUI中使用UIGrid时出现cell重叠解决办法
- JQuery --- DOM遍历方法
- vtk事件响应机制
- hdu 4578 Transformation (线段树)
- XML解析
- 【云快讯】之五十二《华为的公有云即将发布,名字还是个谜》
- 对Java事务的认识
- 黑马程序员--多线程
- iPhone 6s或将于9月发布,这些新功能打动你了么?
- hdu 1709 The Balance
- 暑假集训第二周——递推 骆驼猜名字