Advertisement
Guest User

Sub-classing vtkRenderWindowInteractor

a guest
Sep 12th, 2013
276
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // The original code is from VTK's Examples from here:
  2. // https://github.com/Kitware/VTK/tree/master/Examples/GUI/Qt/FourPaneViewer
  3. // This link also includes the necessary .ui file for Qt
  4. // and the cmake file.
  5. //
  6. // Note: In QtVTKRenderWindows.cxx you may want to change
  7. // the path to the Dicom directory to an appropriate location.
  8.  
  9. //==========================
  10. //QtVTKRenderWindows.h
  11. //==========================
  12.  
  13. #ifndef QtVTKRenderWindows_H
  14. #define QtVTKRenderWindows_H
  15.  
  16. #include "vtkSmartPointer.h"
  17. #include "vtkResliceImageViewer.h"
  18. #include "vtkImagePlaneWidget.h"
  19. #include "vtkDistanceWidget.h"
  20. #include "vtkResliceImageViewerMeasurements.h"
  21. #include <QMainWindow>
  22.  
  23. // Forward Qt class declarations
  24. class Ui_QtVTKRenderWindows;
  25.  
  26. class QtVTKRenderWindows : public QMainWindow
  27. {
  28.   Q_OBJECT
  29. public:
  30.  
  31.   // Constructor/Destructor
  32.   QtVTKRenderWindows(int argc, char *argv[]);
  33.   ~QtVTKRenderWindows() {};
  34.  
  35. public slots:
  36.   virtual void resliceMode(int);
  37.   virtual void Render();
  38.  
  39. protected:
  40.   vtkSmartPointer< vtkResliceImageViewer > riw[3];
  41.   vtkSmartPointer< vtkImagePlaneWidget > planeWidget[3];
  42.   vtkSmartPointer< vtkDistanceWidget > DistanceWidget[3];
  43.   vtkSmartPointer< vtkResliceImageViewerMeasurements > ResliceMeasurements;
  44.  
  45. private:
  46.  
  47.   // Designer form
  48.   Ui_QtVTKRenderWindows *ui;
  49. };
  50.  
  51. #endif // QtVTKRenderWindows_H
  52.  
  53. //============================
  54. //QtVTKRenderWindows.cxx
  55. //============================
  56.  
  57. #include "ui_QtVTKRenderWindows.h"
  58. #include "QtVTKRenderWindows.h"
  59.  
  60. #include <vtkRenderer.h>
  61. #include <vtkRenderWindow.h>
  62. #include "vtkResliceImageViewer.h"
  63. #include "vtkResliceCursorLineRepresentation.h"
  64. #include "vtkResliceCursorThickLineRepresentation.h"
  65. #include "vtkResliceCursorWidget.h"
  66. #include "vtkResliceCursorActor.h"
  67. #include "vtkResliceCursorPolyDataAlgorithm.h"
  68. #include "vtkResliceCursor.h"
  69. #include "vtkDICOMImageReader.h"
  70. #include "vtkCellPicker.h"
  71. #include "vtkProperty.h"
  72. #include "vtkPlane.h"
  73. #include "vtkImageData.h"
  74. #include "vtkCommand.h"
  75. #include "vtkPlaneSource.h"
  76. #include "vtkLookupTable.h"
  77. #include "vtkImageMapToWindowLevelColors.h"
  78. #include "vtkInteractorStyleImage.h"
  79. #include "vtkImageSlabReslice.h"
  80. #include "vtkBoundedPlanePointPlacer.h"
  81. #include "vtkDistanceWidget.h"
  82. #include "vtkDistanceRepresentation.h"
  83. #include "vtkHandleRepresentation.h"
  84. #include "vtkResliceImageViewerMeasurements.h"
  85. #include "vtkDistanceRepresentation2D.h"
  86. #include "vtkPointHandleRepresentation3D.h"
  87. #include "vtkPointHandleRepresentation2D.h"
  88. #include <qdebug.h>
  89.  
  90. #include <vtkPolyDataMapper.h>
  91. #include <vtkObjectFactory.h>
  92. #include <vtkActor.h>
  93. #include <vtkSmartPointer.h>
  94. #include <vtkRenderWindow.h>
  95. #include <vtkRenderer.h>
  96. #include <vtkRenderWindowInteractor.h>
  97. #include <vtkPolyData.h>
  98. #include <vtkSphereSource.h>
  99. #include <vtkInteractorStyleTrackballCamera.h>
  100. #include "QVTKWidget.h"
  101. #include <QKeyEvent>
  102.  
  103. //----------------------------------------------------------------------------
  104. // NEW: Define interactor
  105. class myRenderWindowInteractor : public QVTKInteractor  //vtkRenderWindowInteractor
  106. {
  107. public:
  108.     static myRenderWindowInteractor* New(); //return new KeyPressInteractorStyle;
  109.     vtkTypeMacro(myRenderWindowInteractor, QVTKInteractor);
  110.  
  111.     virtual void OnChar(){qDebug()<<"OnChar() event stopped";};
  112.     virtual void OnKeyDown(){qDebug()<<"OnKeyDown() event stopped";};
  113.     virtual void OnKeyUp(){qDebug()<<"OnKeyUp() event stopped";};
  114.     virtual void OnKeyPress(){qDebug()<<"OnKeyPress() event stopped";};
  115.     virtual void OnKeyRelease(){qDebug()<<"OnKeyRelease() event stopped";};
  116. };
  117. vtkStandardNewMacro(myRenderWindowInteractor);
  118.  
  119. // Define interaction style
  120. class KeyPressInteractorStyle : public vtkInteractorStyle
  121. {
  122. public:
  123.     static KeyPressInteractorStyle* New();
  124.     vtkTypeMacro(KeyPressInteractorStyle, vtkInteractorStyle);
  125.  
  126.     virtual void OnKeyPress()
  127.     {
  128.         // Get the keypress
  129.         vtkRenderWindowInteractor *rwi = this->Interactor;
  130.         std::string key = rwi->GetKeySym();
  131.  
  132.         // Output the key that was pressed
  133.         std::cout << "Pressed " << key << std::endl;
  134.         qDebug()<< "Pressed " << rwi->GetKeySym();
  135.  
  136.         // Forward events
  137.         vtkInteractorStyle::OnKeyPress();
  138.     }
  139.  
  140.     virtual void OnChar()
  141.     {
  142.  
  143.         qDebug()<<"keeeey";
  144.     }
  145.  
  146. };
  147. vtkStandardNewMacro(KeyPressInteractorStyle);
  148.  
  149. class MouseInteractorStyleDoubleClick : public vtkInteractorStyleTrackballCamera
  150. {
  151. public:
  152.  
  153.     static MouseInteractorStyleDoubleClick* New();
  154.     vtkTypeMacro(MouseInteractorStyleDoubleClick, vtkInteractorStyleTrackballCamera);
  155.  
  156.     MouseInteractorStyleDoubleClick() : NumberOfClicks(0), ResetPixelDistance(5)
  157.     {
  158.         this->PreviousPosition[0] = 0;
  159.         this->PreviousPosition[1] = 0;
  160.     }
  161.  
  162.     virtual void OnLeftButtonDown()
  163.     {
  164.         //std::cout << "Pressed left mouse button." << std::endl;
  165.         this->NumberOfClicks++;
  166.         //std::cout << "NumberOfClicks = " << this->NumberOfClicks << std::endl;
  167.         int pickPosition[2];
  168.         this->GetInteractor()->GetEventPosition(pickPosition);
  169.  
  170.         int xdist = pickPosition[0] - this->PreviousPosition[0];
  171.         int ydist = pickPosition[1] - this->PreviousPosition[1];
  172.  
  173.         this->PreviousPosition[0] = pickPosition[0];
  174.         this->PreviousPosition[1] = pickPosition[1];
  175.  
  176.         int moveDistance = (int)sqrt((double)(xdist*xdist + ydist*ydist));
  177.  
  178.         // Reset numClicks - If mouse moved further than resetPixelDistance
  179.         if(moveDistance > this->ResetPixelDistance)
  180.         {
  181.             this->NumberOfClicks = 1;
  182.         }
  183.  
  184.  
  185.         if(this->NumberOfClicks == 2)
  186.         {
  187.             std::cout << "Double clicked." << std::endl;
  188.             this->NumberOfClicks = 0;
  189.         }
  190.         // forward events
  191.         vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
  192.     }
  193.  
  194. private:
  195.     unsigned int NumberOfClicks;
  196.     int PreviousPosition[2];
  197.     int ResetPixelDistance;
  198. };
  199. vtkStandardNewMacro(MouseInteractorStyleDoubleClick);
  200.  
  201.  
  202. //----------------------------------------------------------------------------
  203. class vtkResliceCursorCallback : public vtkCommand
  204. {
  205. public:
  206.  
  207.     static vtkResliceCursorCallback *New()
  208.     {
  209.         return new vtkResliceCursorCallback; }
  210.  
  211.     void Execute( vtkObject *caller, unsigned long ev,
  212.         void *callData )
  213.     {
  214.  
  215.         if (ev == vtkCommand::KeyPressEvent)
  216.         {
  217.             QKeyEvent* keyPressed = static_cast<QKeyEvent*>(callData);
  218.            
  219.             qDebug()<<"key pressed: "<<keyPressed->text();
  220.         }
  221.  
  222.         if (ev == vtkResliceCursorWidget::WindowLevelEvent ||
  223.             ev == vtkCommand::WindowLevelEvent ||
  224.             ev == vtkResliceCursorWidget::ResliceThicknessChangedEvent||
  225.             ev == vtkResliceCursorWidget::ResliceAxesChangedEvent||
  226.             ev == vtkResliceCursorWidget::ResetCursorEvent)
  227.         {
  228.             //do nothing
  229.         }
  230.  
  231.         vtkImagePlaneWidget* ipw =
  232.             dynamic_cast< vtkImagePlaneWidget* >( caller );
  233.         if (ipw)
  234.         {
  235.             double* wl = static_cast<double*>( callData );
  236.  
  237.             if ( ipw == this->IPW[0] )
  238.             {
  239.  
  240.                 this->IPW[1]->SetWindowLevel(wl[0],wl[1],1);
  241.                 this->IPW[2]->SetWindowLevel(wl[0],wl[1],1);
  242.  
  243.             }
  244.             else if( ipw == this->IPW[1] )
  245.             {
  246.                 this->IPW[0]->SetWindowLevel(wl[0],wl[1],1);
  247.                 this->IPW[2]->SetWindowLevel(wl[0],wl[1],1);
  248.             }
  249.             else if (ipw == this->IPW[2])
  250.             {
  251.                 this->IPW[0]->SetWindowLevel(wl[0],wl[1],1);
  252.                 this->IPW[1]->SetWindowLevel(wl[0],wl[1],1);
  253.             }
  254.         }
  255.  
  256.         vtkResliceCursorWidget *rcw = dynamic_cast<
  257.             vtkResliceCursorWidget * >(caller);
  258.         if (rcw)
  259.         {
  260.             vtkResliceCursorLineRepresentation *rep = dynamic_cast<
  261.                 vtkResliceCursorLineRepresentation * >(rcw->GetRepresentation());
  262.             // Although the return value is not used, we keep the get calls
  263.             // in case they had side-effects
  264.             rep->GetResliceCursorActor()->GetCursorAlgorithm()->GetResliceCursor();
  265.             for (int i = 0; i < 3; i++)
  266.             {
  267.                 vtkPlaneSource *ps = static_cast< vtkPlaneSource * >(
  268.                     this->IPW[i]->GetPolyDataAlgorithm());
  269.                 ps->SetOrigin(this->RCW[i]->GetResliceCursorRepresentation()->
  270.                     GetPlaneSource()->GetOrigin());
  271.                 ps->SetPoint1(this->RCW[i]->GetResliceCursorRepresentation()->
  272.                     GetPlaneSource()->GetPoint1());
  273.                 ps->SetPoint2(this->RCW[i]->GetResliceCursorRepresentation()->
  274.                     GetPlaneSource()->GetPoint2());
  275.  
  276.                 // If the reslice plane has modified, update it on the 3D widget
  277.                 this->IPW[i]->UpdatePlacement();
  278.             }
  279.         }
  280.  
  281.         if(ev == vtkResliceImageViewer::SliceChangedEvent)
  282.         {
  283.             for (int i = 0; i < 3; i++)
  284.             {
  285.                 vtkPlaneSource *ps = static_cast< vtkPlaneSource * >(
  286.                     this->IPW[i]->GetPolyDataAlgorithm());
  287.                 ps->SetOrigin(this->RCW[i]->GetResliceCursorRepresentation()->
  288.                     GetPlaneSource()->GetOrigin());
  289.                 ps->SetPoint1(this->RCW[i]->GetResliceCursorRepresentation()->
  290.                     GetPlaneSource()->GetPoint1());
  291.                 ps->SetPoint2(this->RCW[i]->GetResliceCursorRepresentation()->
  292.                     GetPlaneSource()->GetPoint2());
  293.  
  294.                 // If the reslice plane has modified, update it on the 3D widget
  295.                 this->IPW[i]->UpdatePlacement();
  296.             }
  297.         }
  298.  
  299.         // Render everything
  300.         for (int i = 0; i < 3; i++)
  301.         {
  302.             this->RCW[i]->Render();
  303.         }
  304.         this->IPW[0]->GetInteractor()->GetRenderWindow()->Render();
  305.     }
  306.  
  307.     vtkResliceCursorCallback() {}
  308.     vtkImagePlaneWidget* IPW[3];
  309.     vtkResliceCursorWidget *RCW[3];
  310. };
  311.  
  312.  
  313. QtVTKRenderWindows::QtVTKRenderWindows( int vtkNotUsed(argc), char *argv[])
  314. {
  315.     this->ui = new Ui_QtVTKRenderWindows;
  316.     this->ui->setupUi(this);
  317.  
  318.     vtkSmartPointer< vtkDICOMImageReader > reader =
  319.         vtkSmartPointer< vtkDICOMImageReader >::New();
  320.     //reader->SetDirectoryName(argv[1]);
  321.     reader->SetDirectoryName("C:/Users/Panayiotis/DentalCEsse/qt_interface/build/Release/temp_dental/2/dicom");
  322.     reader->Update();
  323.     int imageDims[3];
  324.     reader->GetOutput()->GetDimensions(imageDims);
  325.  
  326.  
  327.     for (int i = 0; i < 3; i++)
  328.     {
  329.         riw[i] = vtkSmartPointer< vtkResliceImageViewer >::New();
  330.     }
  331.  
  332.     vtkSmartPointer<myRenderWindowInteractor> myInteractor1 = vtkSmartPointer<myRenderWindowInteractor>::New();
  333.     vtkSmartPointer<myRenderWindowInteractor> myInteractor2 = vtkSmartPointer<myRenderWindowInteractor>::New();
  334.     vtkSmartPointer<myRenderWindowInteractor> myInteractor3 = vtkSmartPointer<myRenderWindowInteractor>::New();
  335.  
  336.     this->ui->view1->SetRenderWindow(riw[0]->GetRenderWindow());
  337.     this->ui->view2->SetRenderWindow(riw[1]->GetRenderWindow());   
  338.     this->ui->view3->SetRenderWindow(riw[2]->GetRenderWindow());
  339.  
  340.     riw[2]->SetupInteractor(this->ui->view3->GetRenderWindow()->GetInteractor());
  341.     riw[1]->SetupInteractor(this->ui->view2->GetRenderWindow()->GetInteractor());
  342.     riw[0]->SetupInteractor(this->ui->view1->GetRenderWindow()->GetInteractor());
  343.  
  344.     myInteractor1->SetRenderWindow(this->ui->view1->GetRenderWindow());
  345.     myInteractor2->SetRenderWindow(this->ui->view2->GetRenderWindow());
  346.     myInteractor3->SetRenderWindow(this->ui->view3->GetRenderWindow());
  347.  
  348.     for (int i = 0; i < 3; i++)
  349.     {
  350.         // make them all share the same reslice cursor object.
  351.         vtkResliceCursorLineRepresentation *rep =
  352.             vtkResliceCursorLineRepresentation::SafeDownCast(
  353.             riw[i]->GetResliceCursorWidget()->GetRepresentation());
  354.         riw[i]->SetResliceCursor(riw[0]->GetResliceCursor());
  355.  
  356.         rep->GetResliceCursorActor()->
  357.             GetCursorAlgorithm()->SetReslicePlaneNormal(i);
  358.  
  359.         riw[i]->SetInput(reader->GetOutput());
  360.         riw[i]->SetSliceOrientation(i);
  361.         riw[i]->SetResliceModeToAxisAligned();
  362.     }
  363.  
  364.     vtkSmartPointer<vtkCellPicker> picker =
  365.         vtkSmartPointer<vtkCellPicker>::New();
  366.     picker->SetTolerance(0.005);
  367.  
  368.     vtkSmartPointer<vtkProperty> ipwProp =
  369.         vtkSmartPointer<vtkProperty>::New();
  370.  
  371.     vtkSmartPointer< vtkRenderer > ren =
  372.         vtkSmartPointer< vtkRenderer >::New();
  373.  
  374.  
  375.  
  376.     this->ui->view4->GetRenderWindow()->AddRenderer(ren);
  377.     vtkRenderWindowInteractor *iren = this->ui->view4->GetInteractor();
  378.     //commenting out the following code succesfully applies the
  379.     //'style' to view4
  380.     //iren->SetInteractorStyle(style);
  381.     //style->SetCurrentRenderer(ren);
  382.  
  383.  
  384.     //vtkSmartPointer<MouseInteractorStyleDoubleClick> style2 =   vtkSmartPointer<MouseInteractorStyleDoubleClick>::New();
  385.     //this->ui->view4->GetRenderWindow()->GetInteractor()->SetInteractorStyle( style2 );
  386.  
  387.     for (int i = 0; i < 3; i++)
  388.     {
  389.         planeWidget[i] = vtkSmartPointer<vtkImagePlaneWidget>::New();
  390.         planeWidget[i]->SetInteractor( iren );
  391.         planeWidget[i]->SetPicker(picker);
  392.         planeWidget[i]->RestrictPlaneToVolumeOn();
  393.         double color[3] = {0, 0, 0};
  394.         color[i] = 1;
  395.         planeWidget[i]->GetPlaneProperty()->SetColor(color);
  396.  
  397.         color[i] = 0.25;
  398.         riw[i]->GetRenderer()->SetBackground( color );
  399.  
  400.         planeWidget[i]->SetTexturePlaneProperty(ipwProp);
  401.         planeWidget[i]->TextureInterpolateOff();
  402.         planeWidget[i]->SetResliceInterpolateToCubic();
  403.         planeWidget[i]->SetInput(reader->GetOutput());
  404.         planeWidget[i]->SetPlaneOrientation(i);
  405.         planeWidget[i]->SetSliceIndex(imageDims[i]/2);
  406.         planeWidget[i]->DisplayTextOn();
  407.         planeWidget[i]->SetDefaultRenderer(ren);
  408.         planeWidget[i]->On();
  409.         planeWidget[i]->InteractionOn();
  410.         planeWidget[i]->SetTextureVisibility(0);
  411.     }
  412.  
  413.     vtkSmartPointer<vtkResliceCursorCallback> cbk =
  414.         vtkSmartPointer<vtkResliceCursorCallback>::New();
  415.  
  416.     for (int i = 0; i < 3; i++)
  417.     {
  418.         cbk->IPW[i] = planeWidget[i];
  419.         cbk->RCW[i] = riw[i]->GetResliceCursorWidget();
  420.         riw[i]->GetResliceCursorWidget()->AddObserver(
  421.             vtkResliceCursorWidget::ResliceAxesChangedEvent, cbk );
  422.  
  423.         riw[i]->GetResliceCursorWidget()->AddObserver(
  424.             vtkResliceCursorWidget::WindowLevelEvent, cbk );
  425.  
  426.         riw[i]->GetResliceCursorWidget()->AddObserver(
  427.             vtkResliceCursorWidget::ResliceThicknessChangedEvent, cbk );
  428.  
  429.         riw[i]->GetResliceCursorWidget()->AddObserver(
  430.             vtkResliceCursorWidget::ResetCursorEvent, cbk );
  431.  
  432.         riw[i]->GetInteractorStyle()->AddObserver(
  433.             vtkCommand::WindowLevelEvent, cbk );
  434.  
  435.         riw[i]->AddObserver(vtkResliceImageViewer::SliceChangedEvent,cbk);
  436.  
  437.         // Make them all share the same color map.
  438.         riw[i]->SetLookupTable(riw[0]->GetLookupTable());
  439.         planeWidget[i]->GetColorMap()->SetLookupTable(riw[0]->GetLookupTable());
  440.         planeWidget[i]->SetColorMap(riw[i]->GetResliceCursorWidget()->GetResliceCursorRepresentation()->GetColorMap());
  441.  
  442.     }
  443.  
  444.     //riw[0]->GetRenderWindow()->GetInteractor()->AddObserver(vtkCommand::KeyPressEvent,cbk);
  445.  
  446.     resliceMode(1);
  447.     this->ui->resliceModeCheckBox->setChecked(true);
  448.  
  449.     vtkSmartPointer<KeyPressInteractorStyle> style1 = vtkSmartPointer<KeyPressInteractorStyle>::New();
  450.     vtkSmartPointer<KeyPressInteractorStyle> style2 = vtkSmartPointer<KeyPressInteractorStyle>::New();
  451.     vtkSmartPointer<KeyPressInteractorStyle> style3 = vtkSmartPointer<KeyPressInteractorStyle>::New();
  452.     vtkSmartPointer<KeyPressInteractorStyle> style4 = vtkSmartPointer<KeyPressInteractorStyle>::New();
  453.  
  454.     this->ui->view1->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style1);
  455.     this->ui->view2->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style2);
  456.     this->ui->view3->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style3);
  457.     //this->ui->view4->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style4);  //don't need it on 4th view
  458.  
  459.     this->ui->view1->show();
  460.     this->ui->view2->show();
  461.     this->ui->view3->show();
  462.  
  463.     // Set up action signals and slots
  464.     this->ui->thickModeCheckBox->setEnabled(0);
  465.     this->ui->resliceModeCheckBox->setEnabled(0);
  466.  
  467.     this->ui->blendModeGroupBox->setEnabled(0);
  468.     this->ui->resetButton->setEnabled(0);
  469.     this->ui->AddDistance1Button->setEnabled(0);
  470. };
  471.  
  472. void QtVTKRenderWindows::resliceMode(int mode)
  473. {
  474.     for (int i = 0; i < 3; i++)
  475.     {
  476.         riw[i]->SetResliceMode(mode ? 1 : 0);
  477.         riw[i]->GetRenderer()->ResetCamera();
  478.         riw[i]->Render();
  479.     }
  480. }
  481.  
  482. void QtVTKRenderWindows::Render()
  483. {
  484.     for (int i = 0; i < 3; i++)
  485.     {
  486.         riw[i]->Render();
  487.     }
  488.     this->ui->view3->GetRenderWindow()->Render();
  489. }
  490.  
  491. //==================================
  492. //QtVTKRenderWindowsApp.cxx
  493. //==================================
  494.  
  495. #include <QApplication>
  496. #include "QtVTKRenderWindows.h"
  497.  
  498. int main( int argc, char** argv )
  499. {
  500.   // QT Stuff
  501.   QApplication app( argc, argv );
  502.  
  503.   QtVTKRenderWindows myQtVTKRenderWindows(argc, argv);
  504.   myQtVTKRenderWindows.show();
  505.  
  506.   return app.exec();
  507. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement