vtk事件响应机制

来源:互联网 发布:网络协议分析课后答案 编辑:程序博客网 时间:2024/05/16 15:48

vtk中大致有三种时间响应机制:

  1. 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();    //……}

  1. 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;}};

参考文档:

  1. http://www.vtk.org/Wiki/VTK/Tutorials/Callbacks 
  2. http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/DoubleClick 
  3. http://www.cs.rpi.edu/~cutler/classes/visualization/F10/lectures/03_interaction.pdf
  4. http://www.vtk.org/Wiki/VTK/Examples/Cxx/Interaction/KeypressObserver



0 0
原创粉丝点击