前言
除了用前面那种方法之外 下面将介绍另外一种方法
方法
1、用一个类继承vtkCommand
//第一步
class vtkMyCommand : public vtkCommand
{
public:
static vtkMyCommand *New()
{
return new vtkMyCommand;
}
virtual void Execute(vtkObject *caller, unsigned long eventId, void* callData)
{
//Todo
//在这里添加代码
}
};
2、新建一个vtkCommand子类的对象
//第二步
vtkSmartPointer<vtkMyCommand> mouseCallback = vtkSmartPointer<vtkMyCommand>::New();
3、第三步,将vtkMyCommand子类对象添加到观察者列表
vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
//将vtkMyCommand子类对象添加到观察者列表
interactor->AddObserver(vtkCommand::LeftButtonPressEvent, mouseCallback);
代码实现
CMakeLists.txt文件代码如下:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(CallbackFunction)
FIND_PACKAGE(VTK REQUIRED)
INCLUDE(${VTK_USE_FILE})
ADD_EXECUTABLE(CallbackFunction CallbackFunction.cpp)
TARGET_LINK_LIBRARIES(CallbackFunction ${VTK_LIBRARIES})
CallbackFunction.cpp文件代码如下:
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCommand.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <vtkCylinderSource.h>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkProperty.h>
long pressCounts = 0;
//第一步
class vtkMyCommand : public vtkCommand
{
public:
static vtkMyCommand *New()
{
return new vtkMyCommand;
}
virtual void Execute(vtkObject *caller, unsigned long eventId, void* callData)
{
std::cout<<"You have clicked: "<<++pressCounts<<" times."<<std::endl;
}
};
int main()
{
vtkSmartPointer<vtkCylinderSource> cylinder = vtkSmartPointer<vtkCylinderSource>::New();
cylinder->SetHeight( 5.0 );
cylinder->SetRadius( 2.0 );
cylinder->SetResolution( 10 );
vtkSmartPointer<vtkPolyDataMapper> cylinderMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
cylinderMapper->SetInputConnection( cylinder->GetOutputPort() );
vtkSmartPointer<vtkActor> cylinderActor = vtkSmartPointer<vtkActor>::New();
cylinderActor->SetMapper( cylinderMapper );
cylinderActor->GetProperty()->SetColor(1.0, 0.0, 0.0);
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor( cylinderActor );
renderer->SetBackground( 1.0, 1.0, 1.0 );
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer( renderer );
renWin->SetSize( 640, 480 );
renWin->Render();
renWin->SetWindowName("Observer-Callback");
vtkSmartPointer<vtkRenderWindowInteractor> interactor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
interactor->SetRenderWindow(renWin);
//第二步
vtkSmartPointer<vtkMyCommand> mouseCallback = vtkSmartPointer<vtkMyCommand>::New();
//第三步,将vtkCallbackCommand对象添加到观察者列表
interactor->AddObserver(vtkCommand::LeftButtonPressEvent, mouseCallback);
interactor->Initialize();
interactor->Start();
return EXIT_SUCCESS;
}