]> Creatis software - clitk.git/blob - vv/vvSurfaceViewerDialog.cxx
Add clitkImage2DicomSeries tool to write a Dicom Series from an image without a corre...
[clitk.git] / vv / vvSurfaceViewerDialog.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to:
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://www.centreleonberard.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
18 #ifndef _vvSurfaceViewerDialog_CXX
19 #define _vvSurfaceViewerDialog_CXX
20 #include <QtGui>
21 #include <Qt>
22
23 #include "vvSurfaceViewerDialog.h"
24 #include "vtkOBJReader.h"
25 #include "vtkInteractorStyle.h"
26
27 #include <vtkVersion.h>
28 #include "vtkPolyDataMapper.h"
29 #include "vtkActor.h"
30 #include "vtkPolyData.h"
31 #include "vtkRenderWindow.h"
32 #include "vtkRendererCollection.h"
33 #include "vtkRenderer.h"
34
35 #include <QMessageBox>
36 #include <QFileDialog>
37
38 #ifdef Q_OS_OSX
39 # include "vvOSXHelper.h"
40 #endif
41
42 //----------------------------------------------------------------------------
43 class vvManagerCallback : public vtkCommand
44 {
45 public:
46   static vvManagerCallback *New() {
47     return new vvManagerCallback;
48   }
49
50   void Execute(vtkObject *caller,
51                unsigned long event,
52                void *vtkNotUsed(callData)) {
53     vtkInteractorStyle *isi = static_cast<vtkInteractorStyle *>(caller);
54     if (isi) {
55       std::string KeyPress = isi->GetInteractor()->GetKeySym();
56       if (KeyPress == "Left") {
57         this->IV->PreviousTime();
58       }
59       if (KeyPress == "Right") {
60         this->IV->NextTime();
61       }
62     }
63   }
64   vvSurfaceViewerDialog *IV;
65 };
66
67
68 //====================================================================
69 vvSurfaceViewerDialog::vvSurfaceViewerDialog(QWidget * parent, Qt::WindowFlags f)
70   :QDialog(parent,f), Ui::vvSurfaceViewerDialog()
71 {
72
73   // initialization
74   setupUi(this);
75
76   mReaders.clear();
77   mMapper = NULL;
78   mActor = NULL;
79   mRenderer = NULL;
80   mCurrentTime = 0;
81
82   connect(loadButton,SIGNAL(clicked()),this,SLOT(LoadSurface()));
83
84 #ifdef Q_OS_OSX
85   disableGLHiDPI(renderWidget->winId());
86 #endif
87 }
88
89 vvSurfaceViewerDialog::~vvSurfaceViewerDialog()
90 {
91   for (unsigned int i = 0; i < mReaders.size(); i++)
92     mReaders[i]->Delete();
93
94   if (mMapper)
95     mMapper->Delete();
96
97   if (mActor)
98     mActor->Delete();
99
100   if (mRenderer)
101     mRenderer->Delete();
102 }
103
104 void vvSurfaceViewerDialog::LoadSurface()
105 {
106   QString Extensions = "All Files (*)";
107   Extensions += ";;Surface ( *.vtk)";
108   QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Surfaces"),tr(""),Extensions);
109   if (files.isEmpty())
110     return;
111
112   if (!mMapper) {
113     mMapper = vtkPolyDataMapper::New();
114   }
115
116   for (int i = 0; i < files.size(); i++) {
117     vtkOBJReader* reader = vtkOBJReader::New();
118     reader->SetFileName(files[i].toStdString().c_str());
119     reader->Update();
120     mReaders.push_back(reader);
121   }
122 #if VTK_MAJOR_VERSION <= 5
123   mMapper->SetInput(mReaders[mCurrentTime]->GetOutput());
124 #else
125   mMapper->SetInputConnection(mReaders[mCurrentTime]->GetOutputPort());
126 #endif
127
128   if (!mActor) {
129     mActor = vtkActor::New();
130     mActor->SetMapper(mMapper);
131   }
132   if (!mRenderer) {
133     mRenderer = vtkRenderer::New();
134     mRenderer->AddActor(mActor);
135     renderWidget->GetRenderWindow()->AddRenderer(mRenderer);
136   }
137
138   mRenderer->ResetCamera();
139   renderWidget->GetRenderWindow()->Render();
140
141   vvManagerCallback *smc = vvManagerCallback::New();
142   smc->IV = this;
143
144   if (renderWidget->GetRenderWindow()->GetInteractor())
145     renderWidget->GetRenderWindow()->GetInteractor()->
146     GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
147   //readHeader->Delete();
148 }
149
150 void vvSurfaceViewerDialog::NextTime()
151 {
152   mCurrentTime++;
153   if (mCurrentTime >= mReaders.size())
154     mCurrentTime = 0;
155 #if VTK_MAJOR_VERSION <= 5
156   mMapper->SetInput(mReaders[mCurrentTime]->GetOutput());
157 #else
158   mMapper->SetInputConnection(mReaders[mCurrentTime]->GetOutputPort());
159 #endif
160   mMapper->Modified();
161   renderWidget->GetRenderWindow()->Render();
162 }
163
164 void vvSurfaceViewerDialog::PreviousTime()
165 {
166   mCurrentTime--;
167   if (mCurrentTime < 0)
168     mCurrentTime = (unsigned int) mReaders.size() - 1;
169 #if VTK_MAJOR_VERSION <= 5
170   mMapper->SetInput(mReaders[mCurrentTime]->GetOutput());
171 #else
172   mMapper->SetInputConnection(mReaders[mCurrentTime]->GetOutputPort());
173 #endif
174   mMapper->Modified();
175   renderWidget->GetRenderWindow()->Render();
176 }
177
178 #endif /* end #define _vvSurfaceViewerDialog_CXX */