在vtkCommand类派生的子类vtkMyCallback,覆盖父类函数Execute()。在主函数内用这个子类定义一个指针,将指针加入观察者。
基于“观察者-vtkCommand子类”的实现方案遵循三个步骤。
1. 从vtkCommand类中派生出子类,并实现vtkCommand::Execute()虚函数。
该函数原型为:
virtual void Execute(vtkObject* caller, unsigned long eventId, void* callData )= 0;
Execute()是纯虚函数,所以,从vtkCommand派生类中都必须要实现这个方法。
2.实例化vtkCommand子类的对象,并调用相关的方法。
3.调用观察者函数:
调用AddObserver()函数监听感兴趣的事件,如果所监听的事件发生,就会调用vtkCommand子类中定义的Execute()函数。
因此,针对所监听的事件,程序需要把实现的功能放在Execute()函数中。
第一步:
class vtkMyCallback : public vtkCommand
{
public:
static vtkMyCallback *New()
{ return new vtkMyCallback; }
void SetObject(vtkConeSource* cone)
{
m_Cone = cone;
}
virtual void Execute(vtkObject *caller, unsigned long eventId, void* callData)
{
std::cout<<"Left button pressed.\n"
<<"The Height: "<<m_Cone->GetHeight()<<"\n"
<<"The Radius: "<<m_Cone->GetRadius()<<std::endl;
}
private:
vtkConeSource *m_Cone;
};
主函数中,创造交互器<vtkRenderWindowInteractor> iren,为它添加参数:
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
vtkSmartPointer<vtkInteractorStyleTrackballCamera> style =
vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
iren->SetInteractorStyle(style);
第二步,创建一个VTKCallbackCommand对象callback,并调用SetObject(cone)函数设置来添加它要作用的对象:
vtkSmartPointer<vtkMyCallback> callback = vtkSmartPointer<vtkMyCallback>::New();
callback->SetObject(cone);
第三步,vtkCommand类的子类vtkMyCallback的对象callback,添加到交互器对象<vtkRenderWindowInteractor> iren的观察者列表中:
iren->AddObserver(vtkCommand::LeftButtonPressEvent, callback);
iren->Initialize();
这样一来,当观察者见听到鼠标左键按下的事件时,就会反映给交互器对象iren,然后传递给callbak函数,callback函数再触发:对应的vtkCommand类的子类vtkMyCallback内的函数virtual void Execute(vtkObject *caller, unsigned long eventId, void* callData)
其内容为,对输入的cone: