vtk鼠标交互三例

例一:
显示Dicom序列,通过鼠标滚轮切换,并能显示操作提示。
![](http://codeplanet-wordpress.stor.sinaapp.com/uploads/2014/01/wpid-dba777faf79c359dba7237c21485c07f_ad8eb3a0ec7af9eb9189cc2b97ad6c68.jpg)
`
// // This example demonstrates how to read a series of dicom images // and how to scroll with the mousewheel or the up/down keys // through all slices // // some standard vtk headers #**include** <vtkSmartPointer.h> #**include** <vtkObjectFactory.h> #**include** <vtkRenderWindow.h> #**include** <vtkRenderWindowInteractor.h> #**include** <vtkRenderer.h> #**include** <vtkActor.h> // headers needed for this example #**include** <vtkImageViewer2.h> #**include** <vtkDICOMImageReader.h> #**include** <vtkInteractorStyleImage.h> #**include** <vtkActor2D.h> #**include** <vtkTextProperty.h> #**include** <vtkTextMapper.h> // needed to easily convert int to std::string #**include** <sstream>     // helper class to format slice status message **class** StatusMessage { **public**:    **static** std::string Format(**int** slice, **int** maxSlice) {       std::stringstream tmp;       tmp << "Slice Number  " << slice + 1 << "/" << maxSlice + 1;       **return** tmp.str();    } };        // Define own interaction style **class** myVtkInteractorStyleImage : **public** vtkInteractorStyleImage { **public**:    **static** myVtkInteractorStyleImage* New();    vtkTypeMacro(myVtkInteractorStyleImage, vtkInteractorStyleImage);   **protected**:    vtkImageViewer2* _ImageViewer;    vtkTextMapper* _StatusMapper;    **int** _Slice;    **int** _MinSlice;    **int** _MaxSlice;   **public**:    **void** SetImageViewer(vtkImageViewer2* imageViewer) {       _ImageViewer = imageViewer;       _MinSlice = imageViewer->GetSliceMin();       _MaxSlice = imageViewer->GetSliceMax();       _Slice = _MinSlice;       cout << "Slicer: Min = " << _MinSlice << ", Max = " << _MaxSlice << std::endl;    }      **void** SetStatusMapper(vtkTextMapper* statusMapper) {       _StatusMapper = statusMapper;    }     **protected**:    **void** MoveSliceForward() {       **if**(_Slice < _MaxSlice) {          _Slice += 1;          cout << "MoveSliceForward::Slice = " << _Slice << std::endl;          _ImageViewer->SetSlice(_Slice);          std::string msg = StatusMessage::Format(_Slice, _MaxSlice);          _StatusMapper->SetInput(msg.c_str());          _ImageViewer->Render();       }    }      **void** MoveSliceBackward() {       **if**(_Slice > _MinSlice) {          _Slice -= 1;          cout << "MoveSliceBackward::Slice = " << _Slice << std::endl;          _ImageViewer->SetSlice(_Slice);          std::string msg = StatusMessage::Format(_Slice, _MaxSlice);          _StatusMapper->SetInput(msg.c_str());          _ImageViewer->Render();       }    }        **virtual** **void** OnKeyDown() {       std::string key = **this**->GetInteractor()->GetKeySym();       **if**(key.compare("Up"== 0) {          //cout << "Up arrow key was pressed." << endl;          MoveSliceForward();       }       **else** **if**(key.compare("Down"== 0) {          //cout << "Down arrow key was pressed." << endl;          MoveSliceBackward();       }       // forward event       vtkInteractorStyleImage::OnKeyDown();    }        **virtual** **void** OnMouseWheelForward() {       //std::cout << "Scrolled mouse wheel forward." << std::endl;       MoveSliceForward();       // don't forward events, otherwise the image will be zoomed        // in case another interactorstyle is used (e.g. trackballstyle, ...)       // vtkInteractorStyleImage::OnMouseWheelForward();    }        **virtual** **void** OnMouseWheelBackward() {       //std::cout << "Scrolled mouse wheel backward." << std::endl;       **if**(_Slice > _MinSlice) {          MoveSliceBackward();       }       // don't forward events, otherwise the image will be zoomed        // in case another interactorstyle is used (e.g. trackballstyle, ...)       // vtkInteractorStyleImage::OnMouseWheelBackward();    } };   vtkStandardNewMacro(myVtkInteractorStyleImage);     **int** main(**int** argc, **char*** argv[]) {      //std::string folder = argv[1];    std::string folder = "D:\\yangfeichuan\\2";      // Read all the DICOM files in the specified directory.    vtkSmartPointer<vtkDICOMImageReader> reader =       vtkSmartPointer<vtkDICOMImageReader>::New();    reader->SetDirectoryName(folder.c_str());    reader->Update();      // Visualize    vtkSmartPointer<vtkImageViewer2> imageViewer =       vtkSmartPointer<vtkImageViewer2>::New();    imageViewer->SetInputConnection(reader->GetOutputPort());      // slice status message    vtkSmartPointer<vtkTextProperty> sliceTextProp = vtkSmartPointer<vtkTextProperty>::New();    sliceTextProp->SetFontFamilyToCourier();    sliceTextProp->SetFontSize(20);    sliceTextProp->SetVerticalJustificationToBottom();    sliceTextProp->SetJustificationToLeft();      vtkSmartPointer<vtkTextMapper> sliceTextMapper = vtkSmartPointer<vtkTextMapper>::New();    std::string msg = StatusMessage::Format(imageViewer->GetSliceMin(), imageViewer->GetSliceMax());    sliceTextMapper->SetInput(msg.c_str());    sliceTextMapper->SetTextProperty(sliceTextProp);      vtkSmartPointer<vtkActor2D> sliceTextActor = vtkSmartPointer<vtkActor2D>::New();    sliceTextActor->SetMapper(sliceTextMapper);    sliceTextActor->SetPosition(1510);      // usage hint message    vtkSmartPointer<vtkTextProperty> usageTextProp = vtkSmartPointer<vtkTextProperty>::New();    usageTextProp->SetFontFamilyToCourier();    usageTextProp->SetFontSize(14);    usageTextProp->SetVerticalJustificationToTop();    usageTextProp->SetJustificationToLeft();      vtkSmartPointer<vtkTextMapper> usageTextMapper = vtkSmartPointer<vtkTextMapper>::New();    usageTextMapper->SetInput("- Slice with mouse wheel\n  or Up/Down-Key\n- Zoom with pressed right\n  mouse button while dragging");    usageTextMapper->SetTextProperty(usageTextProp);      vtkSmartPointer<vtkActor2D> usageTextActor = vtkSmartPointer<vtkActor2D>::New();    usageTextActor->SetMapper(usageTextMapper);    usageTextActor->GetPositionCoordinate()->SetCoordinateSystemToNormalizedDisplay();    usageTextActor->GetPositionCoordinate()->SetValue( 0.050.95);      // create an interactor with our own style (inherit from vtkInteractorStyleImage)    // in order to catch mousewheel and key events    vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =       vtkSmartPointer<vtkRenderWindowInteractor>::New();      vtkSmartPointer<myVtkInteractorStyleImage> myInteractorStyle =       vtkSmartPointer<myVtkInteractorStyleImage>::New();      // make imageviewer2 and sliceTextMapper visible to our interactorstyle    // to enable slice status message updates when scrolling through the slices    myInteractorStyle->SetImageViewer(imageViewer);    myInteractorStyle->SetStatusMapper(sliceTextMapper);      imageViewer->SetupInteractor(renderWindowInteractor);    // make the interactor use our own interactorstyle    // cause SetupInteractor() is defining it's own default interatorstyle     // this must be called after SetupInteractor()    renderWindowInteractor->SetInteractorStyle(myInteractorStyle);    // add slice status message and usage hint message to the renderer    imageViewer->GetRenderer()->AddActor2D(sliceTextActor);    imageViewer->GetRenderer()->AddActor2D(usageTextActor);      // initialize rendering and interaction    //imageViewer->GetRenderWindow()->SetSize(400, 300);    //imageViewer->GetRenderer()->SetBackground(0.2, 0.3, 0.4);    imageViewer->Render();    imageViewer->GetRenderer()->ResetCamera();    imageViewer->Render();    renderWindowInteractor->Start();    **return** EXIT_SUCCESS; }
`
例二:
vtk取坐标点事件,窗口左下为坐标原点,但非世界坐标原点。
![](http://codeplanet-wordpress.stor.sinaapp.com/uploads/2014/01/wpid-dba777faf79c359dba7237c21485c07f_da48a6cd930350afb522d595ef030a4a.jpg)            ![](http://codeplanet-wordpress.stor.sinaapp.com/uploads/2014/01/wpid-dba777faf79c359dba7237c21485c07f_NXSNN1DJ5KE3CTSGWWB9D0.jpg)
`
#**include** <vtkRenderWindow.h> #**include** <vtkRenderWindowInteractor.h> #**include** <vtkRenderer.h> #**include** <vtkSphereSource.h> #**include** <vtkPolyDataMapper.h> #**include** <vtkActor.h> #**include** <vtkSmartPointer.h> #**include** <vtkPointPicker.h> #**include** <vtkCamera.h> #**include** <vtkInteractorStyleTrackballCamera.h> #**include** <vtkObjectFactory.h> #**include** <vtkCoordinate.h> #**include** <vtkRendererCollection.h>   // Define interaction style **class** MouseInteractorStyle3 : **public** vtkInteractorStyleTrackballCamera {   **public**:     **static** MouseInteractorStyle3* New();       **virtual** **void** OnLeftButtonDown()      {       std::cout << "Pressed left mouse button." << std::endl;       **int** x = **this**->Interactor->GetEventPosition()[0];       **int** y = **this**->Interactor->GetEventPosition()[1];       std::cout << "(x,y) = (" << x << "," << y << ")" << std::endl;       vtkSmartPointer<vtkCoordinate> coordinate =          vtkSmartPointer<vtkCoordinate>::New();       coordinate->SetCoordinateSystemToDisplay();       coordinate->SetValue(x,y,0);         // This doesn't produce the right value if the sphere is zoomed in???       **double*** world = coordinate->GetComputedWorldValue(**this**->Interactor->GetRenderWindow()->GetRenderers()->GetFirstRenderer());       std::cout << "World coordinate: " << world[0<< ", " << world[1<< ", " << world[2<< std::endl;         // Forward events       vtkInteractorStyleTrackballCamera::OnLeftButtonDown();     }   };   vtkStandardNewMacro(MouseInteractorStyle3);   **int** main(**int****char** *[]) {     vtkSmartPointer<vtkSphereSource> sphereSource =      vtkSmartPointer<vtkSphereSource>::New();   sphereSource->SetCenter(0.00.00.0);   sphereSource->SetRadius(5.0);   sphereSource->Update();     vtkSmartPointer<vtkPolyDataMapper> mapper =      vtkSmartPointer<vtkPolyDataMapper>::New();   mapper->SetInputConnection(sphereSource->GetOutputPort());     vtkSmartPointer<vtkActor> actor =      vtkSmartPointer<vtkActor>::New();   actor->SetMapper(mapper);     vtkSmartPointer<vtkRenderer> renderer =      vtkSmartPointer<vtkRenderer>::New();   renderer->SetBackground(1,1,1); // Background color white   renderer->AddActor(actor);     vtkSmartPointer<vtkRenderWindow> renderWindow =      vtkSmartPointer<vtkRenderWindow>::New();   renderWindow->AddRenderer(renderer);     vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =      vtkSmartPointer<vtkRenderWindowInteractor>::New();   renderWindowInteractor->SetRenderWindow ( renderWindow );     vtkSmartPointer<MouseInteractorStyle3> style =     vtkSmartPointer<MouseInteractorStyle3>::New();   renderWindowInteractor->SetInteractorStyle( style );     renderWindowInteractor->Initialize();   renderWindowInteractor->Start();     **return**  EXIT_SUCCESS ; }
`
例三:
单个renderwindow中添加多个render,生成冠状面,矢状面,横断面等四视图。
![](http://codeplanet-wordpress.stor.sinaapp.com/uploads/2014/01/wpid-dba777faf79c359dba7237c21485c07f_HOVX@PKCY07_YB4QXNSMRW.jpg)
`
#**include** "vtkDICOMImageReader.h" #**include** "vtkOutlineFilter.h" #**include** "vtkPolyDataMapper.h" #**include** "vtkActor.h" #**include** "vtkRenderer.h" #**include** "vtkRenderWindow.h" #**include** "vtkRenderWindowInteractor.h" #**include** "vtkImagePlaneWidget.h" #**include** "vtkCellPicker.h" #**include** "vtkProperty.h" #**include** "vtkImageMapToColors.h" #**include** "vtkImageActor.h" #**include** "vtkCamera.h" #**include** "vtkCommand.h" #**include** "vtkJPEGReader.h"
**class** vtkWidgetWindowLevelCallback : **public** vtkCommand { **public**:     **static** vtkWidgetWindowLevelCallback *New()     { **return** **new** vtkWidgetWindowLevelCallback; }     **void** Execute( vtkObject *caller, **unsigned** **long** vtkNotUsed( event ),         **void** *callData )     {         vtkImagePlaneWidget* self =             **reinterpret_cast**< vtkImagePlaneWidget* >( caller );         **if**(!self) **return**;         **double*** wl = **static_cast**<**double***>( callData );         **if** ( self == **this**->WidgetX )         {             **this**->WidgetY->SetWindowLevel(wl[0],wl[1]);             **this**->WidgetZ->SetWindowLevel(wl[0],wl[1]);         }         **else** **if**( self == **this**->WidgetY )         {             **this**->WidgetX->SetWindowLevel(wl[0],wl[1]);             **this**->WidgetZ->SetWindowLevel(wl[0],wl[1]);         }         **else** **if** (self == **this**->WidgetZ)         {             **this**->WidgetX->SetWindowLevel(wl[0],wl[1]);             **this**->WidgetY->SetWindowLevel(wl[0],wl[1]);         }     }     vtkWidgetWindowLevelCallback():WidgetX( 0 ), WidgetY( 0 ), WidgetZ ( 0 ) {}     vtkImagePlaneWidget* WidgetX;     vtkImagePlaneWidget* WidgetY;     vtkImagePlaneWidget* WidgetZ; }; **int** main() {     vtkDICOMImageReader *DicomReader = vtkDICOMImageReader::New();       DicomReader->SetDataByteOrderToLittleEndian();       DicomReader->SetDirectoryName( "D:\\yangfeichuan\\2" );       DicomReader->Update();       vtkOutlineFilter *DicomOutline = vtkOutlineFilter::New();     DicomOutline->SetInputConnection( DicomReader->GetOutputPort() );     vtkPolyDataMapper *DicomMapper = vtkPolyDataMapper::New();     DicomMapper->SetInputConnection( DicomOutline->GetOutputPort() );     vtkActor *DicomActor = vtkActor::New();     DicomActor->SetMapper( DicomMapper );     vtkRenderWindow *renWin = vtkRenderWindow::New();     vtkRenderer *ren = vtkRenderer::New();     vtkRenderer *ren1 = vtkRenderer::New();     vtkRenderer *ren2 = vtkRenderer::New();     vtkRenderer *ren3 = vtkRenderer::New();     vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();     renWin->AddRenderer( ren1 );     renWin->AddRenderer( ren2 );     renWin->AddRenderer( ren3 );     renWin->AddRenderer( ren );     iren->SetRenderWindow( renWin );     //        ren->AddActor( DicomActor );     vtkCellPicker * picker = vtkCellPicker::New();     picker->SetTolerance( 0.005 );     vtkImagePlaneWidget * planeWidgetX = vtkImagePlaneWidget::New();     planeWidgetX->SetInteractor( iren );     planeWidgetX->SetKeyPressActivationValue( 'x' );     planeWidgetX->SetPicker( picker );     planeWidgetX->RestrictPlaneToVolumeOn();     planeWidgetX->GetPlaneProperty()->SetColor( 0.00.01.0 );     planeWidgetX->DisplayTextOn();     //planeWidgetX->TextureInterpolateOn();     planeWidgetX->TextureInterpolateOff();     planeWidgetX->SetResliceInterpolateToLinear();     planeWidgetX->SetInput( (vtkDataSet*)DicomReader->GetOutput() );     planeWidgetX->SetPlaneOrientationToXAxes();//??     planeWidgetX->SetSliceIndex( 255 );     planeWidgetX->GetTexturePlaneProperty()->SetOpacity( 1 );     planeWidgetX->On();     vtkImagePlaneWidget * planeWidgetY = vtkImagePlaneWidget::New();     planeWidgetY->SetInteractor( iren );     planeWidgetY->SetKeyPressActivationValue( 'y' );     planeWidgetY->SetPicker( picker );     planeWidgetY->RestrictPlaneToVolumeOn();     planeWidgetY->GetPlaneProperty()->SetColor( 1.00.00.0 );     planeWidgetY->DisplayTextOn();     planeWidgetY->TextureInterpolateOn();     planeWidgetY->SetResliceInterpolateToLinear();     planeWidgetY->SetInput( (vtkDataSet*)DicomReader->GetOutput() );     planeWidgetY->SetPlaneOrientationToYAxes();//??     planeWidgetY->SetSliceIndex( 255 );     planeWidgetY->On();     vtkImagePlaneWidget * planeWidgetZ = vtkImagePlaneWidget::New();     planeWidgetZ->SetInteractor( iren );     planeWidgetZ->DisplayTextOn();     planeWidgetZ->RestrictPlaneToVolumeOn();     planeWidgetZ->SetKeyPressActivationValue( 'z' );     planeWidgetZ->SetPicker( picker );     planeWidgetZ->GetPlaneProperty()->SetColor( 0.01.00.0 );     planeWidgetZ->TextureInterpolateOn();     planeWidgetZ->SetResliceInterpolateToLinear();     planeWidgetZ->SetInput( (vtkDataSet*)DicomReader->GetOutput() );     planeWidgetZ->SetPlaneOrientationToZAxes(); //?ᨢ????     planeWidgetZ->SetSliceIndex( 150 );     planeWidgetZ->On();     /*        vtkImagePlaneWidget *planeWidgetZ = vtkImagePlaneWidget::New();     planeWidgetZ->SetInteractor( iren );     planeWidgetZ->SetKeyPressActivationValue( 'z' );     planeWidgetZ->DisplayTextOn();     planeWidgetZ->SetPicker( picker );     planeWidgetZ->GetPlaneProperty()->SetColor( 1.0, 0.0, 0.0 );     planeWidgetZ->TextureInterpolateOn();     planeWidgetZ->SetResliceInterpolateToCubic();     planeWidgetZ->SetInput( (vtkDataSet*)DicomReader->GetOutput() );     planeWidgetZ->SetPlaneOrientationToZAxes();     planeWidgetZ->SetSliceIndex( 183 );     planeWidgetZ->On();*/     vtkWidgetWindowLevelCallback* cbk = vtkWidgetWindowLevelCallback::New();     cbk->WidgetX = planeWidgetX;     cbk->WidgetY = planeWidgetY;     cbk->WidgetZ = planeWidgetZ;     cbk->Delete();     vtkImageMapToColors *colorMap1 = vtkImageMapToColors::New();     colorMap1->PassAlphaToOutputOff(); //use in RGBA     colorMap1->SetActiveComponent( 0 );     colorMap1->SetOutputFormatToLuminance();     colorMap1->SetInput( (vtkDataSet*)planeWidgetX->GetResliceOutput() );     colorMap1->SetLookupTable( (vtkScalarsToColors *)planeWidgetX->GetLookupTable() );     vtkImageActor * imageActor1 = vtkImageActor::New();     imageActor1->PickableOff();     imageActor1->SetInput( colorMap1->GetOutput() );     vtkImageMapToColors *colorMap2 = vtkImageMapToColors::New();     colorMap2->PassAlphaToOutputOff();      colorMap2->SetActiveComponent( 0 ); // for muti-component     colorMap2->SetOutputFormatToLuminance();     colorMap2->SetInput( (vtkDataSet*)planeWidgetY->GetResliceOutput() );     colorMap2->SetLookupTable( (vtkScalarsToColors *)planeWidgetX->GetLookupTable() );     vtkImageActor * imageActor2 = vtkImageActor::New();     imageActor2->PickableOff();     imageActor2->SetInput( colorMap2->GetOutput() );     vtkImageMapToColors *colorMap3 = vtkImageMapToColors::New();     colorMap3->PassAlphaToOutputOff();     colorMap3->SetActiveComponent( 0 );     colorMap3->SetOutputFormatToLuminance();     colorMap3->SetInput( (vtkDataSet*)planeWidgetZ->GetResliceOutput() );     colorMap3->SetLookupTable( (vtkScalarsToColors *)planeWidgetX->GetLookupTable());     //colorMap3->SetLookupTable(planeWidgetX->GetLookupTable());     vtkImageActor *imageActor3 = vtkImageActor::New();     imageActor3->PickableOff();     imageActor3->SetInput( colorMap3->GetOutput() );     ren->AddActor( DicomActor ); //outline     ren1->AddActor( imageActor1 );     ren2->AddActor( imageActor2 );     ren3->AddActor( imageActor3 );     // OK     ren->SetBackground( 0.30.30.6 );     ren1->SetBackground( 1.00.00.0 );     ren2->SetBackground( 0.01.00.0 );     ren3->SetBackground( 0.00.01.0 );     renWin->SetSize( 600400 );     ren->SetViewport( 00.50.51 );     ren1->SetViewport( 0.50.511 );     ren2->SetViewport( 000.50.5 );     ren3->SetViewport( 0.5010.5 );     iren->Initialize();     iren->Start();     renWin->Render();     **return** 0; }
`
[来自为知笔记(Wiz)](http://www.wiz.cn/i/c09d0bb5 "来自为知笔记(Wiz)")
坚持原创技术分享,您的支持将鼓励我继续创作!