]> Creatis software - clitk.git/blob - vv/vvSurfaceViewerDialog.cxx
Initial revision
[clitk.git] / vv / vvSurfaceViewerDialog.cxx
1 #ifndef _vvSurfaceViewerDialog_CXX
2 #define _vvSurfaceViewerDialog_CXX
3
4 /*=========================================================================
5
6 Program:   vv
7 Module:    $RCSfile: vvSurfaceViewerDialog.cxx,v $
8 Language:  C++
9 Date:      $Date: 2010/01/06 13:31:57 $
10 Version:   $Revision: 1.1 $
11 Author :   David Sarrut (david.sarrut@gmail.com)
12
13 Copyright (C) 2008
14 Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
15 CREATIS-LRMN http://www.creatis.insa-lyon.fr
16
17 This program is free software: you can redistribute it and/or modify
18 it under the terms of the GNU General Public License as published by
19 the Free Software Foundation, version 3 of the License.
20
21 This program is distributed in the hope that it will be useful,
22 but WITHOUT ANY WARRANTY; without even the implied warranty of
23 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 GNU General Public License for more details.
25
26 You should have received a copy of the GNU General Public License
27 along with this program.  If not, see <http://www.gnu.org/licenses/>.
28
29 =========================================================================*/
30 #include <QtGui>
31 #include <Qt>
32
33 #include "vvSurfaceViewerDialog.h"
34 #include "vtkOBJReader.h"
35 #include "vtkInteractorStyle.h"
36
37
38 #include "vtkPolyDataMapper.h"
39 #include "vtkActor.h"
40 #include "vtkPolyData.h"
41 #include "vtkRenderWindow.h"
42 #include "vtkRendererCollection.h"
43 #include "vtkRenderer.h"
44
45 #include <QMessageBox>
46
47 //----------------------------------------------------------------------------
48 class vvManagerCallback : public vtkCommand
49 {
50 public:
51     static vvManagerCallback *New() {
52         return new vvManagerCallback;
53     }
54
55     void Execute(vtkObject *caller,
56                  unsigned long event,
57                  void *vtkNotUsed(callData))
58     {
59         vtkInteractorStyle *isi = static_cast<vtkInteractorStyle *>(caller);
60         if (isi)
61         {
62             std::string KeyPress = isi->GetInteractor()->GetKeySym();
63             if (KeyPress == "Left")
64             {
65                 this->IV->PreviousTime();
66             }
67             if (KeyPress == "Right")
68             {
69                 this->IV->NextTime();
70             }
71         }
72     }
73     vvSurfaceViewerDialog *IV;
74 };
75
76
77 //====================================================================
78 vvSurfaceViewerDialog::vvSurfaceViewerDialog(QWidget * parent, Qt::WindowFlags f)
79         :QDialog(parent,f), Ui::vvSurfaceViewerDialog() {
80
81     // initialization
82     setupUi(this);
83
84     mReaders.clear();
85     mMapper = NULL;
86     mActor = NULL;
87     mRenderer = NULL;
88     mCurrentTime = 0;
89
90     connect(loadButton,SIGNAL(clicked()),this,SLOT(LoadSurface()));
91 }
92
93 vvSurfaceViewerDialog::~vvSurfaceViewerDialog()
94 {
95     for (unsigned int i = 0; i < mReaders.size();i++)
96         mReaders[i]->Delete();
97
98     if (mMapper)
99         mMapper->Delete();
100
101     if (mActor)
102         mActor->Delete();
103
104     if (mRenderer)
105         mRenderer->Delete();
106 }
107
108 void vvSurfaceViewerDialog::LoadSurface()
109 {
110     QString Extensions = "All Files (*)";
111     Extensions += ";;Surface ( *.vtk)";
112     QStringList files = QFileDialog::getOpenFileNames(this,tr("Load Surfaces"),tr(""),Extensions);
113     if (files.isEmpty())
114         return;
115
116     if (!mMapper)
117     {
118         mMapper = vtkPolyDataMapper::New();
119     }
120
121     for (int i = 0; i < files.size(); i++)
122     {
123         vtkOBJReader* reader = vtkOBJReader::New();
124         reader->SetFileName(files[i].toStdString().c_str());
125         reader->Update();
126         mReaders.push_back(reader);
127     }
128
129     mMapper->SetInput(mReaders[mCurrentTime]->GetOutput());
130
131     if (!mActor)
132     {
133         mActor = vtkActor::New();
134         mActor->SetMapper(mMapper);
135     }
136     if (!mRenderer)
137     {
138         mRenderer = vtkRenderer::New();
139         mRenderer->AddActor(mActor);
140         renderWidget->GetRenderWindow()->AddRenderer(mRenderer);
141     }
142
143     mRenderer->ResetCamera();
144     renderWidget->GetRenderWindow()->Render();
145
146     vvManagerCallback *smc = vvManagerCallback::New();
147     smc->IV = this;
148
149     if (renderWidget->GetRenderWindow()->GetInteractor())
150         renderWidget->GetRenderWindow()->GetInteractor()->
151         GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
152     //readHeader->Delete();
153 }
154
155 void vvSurfaceViewerDialog::NextTime()
156 {
157     mCurrentTime++;
158     if (mCurrentTime >= mReaders.size())
159         mCurrentTime = 0;
160     mMapper->SetInput(mReaders[mCurrentTime]->GetOutput());
161     mMapper->Modified();
162     renderWidget->GetRenderWindow()->Render();
163 }
164
165 void vvSurfaceViewerDialog::PreviousTime()
166 {
167     mCurrentTime--;
168     if (mCurrentTime < 0)
169         mCurrentTime = mReaders.size() - 1;
170     mMapper->SetInput(mReaders[mCurrentTime]->GetOutput());
171     mMapper->Modified();
172     renderWidget->GetRenderWindow()->Render();
173 }
174
175 #endif /* end #define _vvSurfaceViewerDialog_CXX */