VTK的派生子类观察者-事件回调方案

在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:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值