]> Creatis software - clitk.git/blob - vv/vvToolProfile.cxx
Merge branch 'VTK6_Qt5_Profile' into VTK6_Qt5
[clitk.git] / vv / vvToolProfile.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
19 // vv
20 #include "vvToolProfile.h"
21 #include "vvSlicerManager.h"
22 #include "vvSlicer.h"
23 #include "vvToolInputSelectorWidget.h"
24
25 // vtk
26 #include <vtkImageActor.h>
27 #include <vtkCamera.h>
28 #include <vtkImageClip.h>
29 #include <vtkRenderWindow.h>
30 #include <vtkChartXY.h>
31 #include <vtkPlot.h>
32 #include <vtkRendererCollection.h>
33 #include <vtkRenderer.h>
34
35
36 //------------------------------------------------------------------------------
37 // Create the tool and automagically (I like this word) insert it in
38 // the main window menu.
39 ADD_TOOL(vvToolProfile);
40 //------------------------------------------------------------------------------
41
42
43 //------------------------------------------------------------------------------
44 void vvToolProfile::Initialize()
45
46   SetToolName("Profile");
47   SetToolMenuName("Intensity Profile");
48   SetToolIconFilename(":/common/icons/profile.png");
49   SetToolTip("Display the intensity profile between 2 points of the image.");
50   SetToolExperimental(false);
51 }
52 //------------------------------------------------------------------------------
53
54
55 //------------------------------------------------------------------------------
56 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
57   :vvToolWidgetBase(parent,f),
58    vvToolBase<vvToolProfile>(parent),
59    Ui::vvToolProfile()
60
61   // GUI Initialization
62   Ui_vvToolProfile::setupUi(mToolWidget);
63
64   // Connect signals & slots
65   connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1()));
66   connect(mSelectPoint2Button, SIGNAL(clicked()), this, SLOT(selectPoint2()));
67   connect(mCancelPointsButton, SIGNAL(clicked()), this, SLOT(cancelPoints()));
68   connect(mComputeProfileButton, SIGNAL(clicked()), this, SLOT(computeProfile()));
69
70   // Initialize some widget
71   ProfileWidget->hide();
72   mPoint1 = NULL;
73   mPoint2 = NULL;
74   
75   mPoint1Selected = false;
76   mPoint2Selected = false;
77     
78   mView = vtkSmartPointer<vtkContextView>::New();
79   vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
80   chart->SetAutoSize(false);
81   chart->SetRenderEmpty(true);
82   mView->GetScene()->AddItem(chart);
83   this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
84   this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
85   ProfileWidget->show();
86
87   // Main filter
88   mFilter = clitk::ProfileImageGenericFilter::New();
89
90   // Set how many inputs are needed for this tool
91   AddInputSelector("Select one image", mFilter);
92 }
93 //------------------------------------------------------------------------------
94
95
96 //------------------------------------------------------------------------------
97 vvToolProfile::~vvToolProfile()
98
99 }
100 //------------------------------------------------------------------------------
101
102
103 //------------------------------------------------------------------------------
104 void vvToolProfile::selectPoint1()
105 {
106   QString position = "";
107   
108     if (mPoint1Selected) {
109       ProfileWidget->hide();
110       vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
111       chart->SetAutoSize(false);
112       chart->SetRenderEmpty(true);
113       mView->GetScene()->ClearItems();
114       mView->GetScene()->AddItem(chart);
115       this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
116       this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
117       ProfileWidget->show();
118   }
119   
120   mPoint1Selected = false;
121   if(mCurrentSlicerManager) {
122       if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
123           double *pos;
124           int *index;
125           pos = new double [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
126           index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
127           
128           for (int i=0; i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions(); ++i) {
129             pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
130             index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
131             
132             position += QString::number(pos[i],'f',1) + " ";
133             mPoint1[i] = index[i];
134           }
135           mPoint1Selected = true;
136       }
137   }
138   mPosPoint1Label->setText(position);
139   isPointsSelected();
140 }
141 //------------------------------------------------------------------------------
142
143
144 //------------------------------------------------------------------------------
145 void vvToolProfile::selectPoint2()
146 {
147   QString position = "";
148   
149   if (mPoint2Selected) {
150       ProfileWidget->hide();
151       vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
152       chart->SetAutoSize(false);
153       chart->SetRenderEmpty(true);
154       mView->GetScene()->ClearItems();
155       mView->GetScene()->AddItem(chart);
156       this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
157       this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
158       ProfileWidget->show();
159   }
160   
161   mPoint2Selected = false;
162   if(mCurrentSlicerManager) {
163       if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
164           double *pos;
165           int *index;
166           pos = new double [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
167           index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
168           
169           for (int i=0; i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions(); ++i) {
170             pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
171             index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
172             
173             position += QString::number(pos[i],'f',1) + " ";
174             mPoint2[i] = index[i];
175           }
176           mPoint2Selected = true;
177       }
178   }
179   mPosPoint2Label->setText(position);
180   isPointsSelected();
181 }
182 //------------------------------------------------------------------------------
183
184 //------------------------------------------------------------------------------
185 bool vvToolProfile::isPointsSelected()
186 {
187   if (mPoint1Selected && mPoint2Selected)
188       mComputeProfileButton->setEnabled(true);
189   else
190       mComputeProfileButton->setEnabled(false);
191   
192   return (mPoint1Selected && mPoint2Selected);
193 }
194 //------------------------------------------------------------------------------
195
196
197 //------------------------------------------------------------------------------
198 void vvToolProfile::computeProfile()
199 {
200     if (!mCurrentSlicerManager) close();
201
202     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
203     GetArgsInfoFromGUI();
204     ProfileWidget->hide();
205     
206     // Main filter
207     mFilter->SetInputVVImage(mCurrentImage);
208     mFilter->SetArgsInfo(mArgsInfo);
209     mFilter->Update();
210     
211     vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
212     vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
213     vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
214     arrX = mFilter->GetArrayX();
215     arrY = mFilter->GetArrayY();
216     arrX->SetName("Voxel");
217     arrY->SetName("Intensity");
218     table->AddColumn(arrX);
219     table->AddColumn(arrY);
220     
221     mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
222  
223     vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
224     chart->SetAutoSize(true);
225     mView->GetScene()->ClearItems();
226     mView->GetScene()->AddItem(chart);
227     vtkPlot *line = chart->AddPlot(vtkChart::LINE);
228 #if VTK_MAJOR_VERSION <= 5
229     line->SetInput(table, 0, 1);
230 #else
231     line->SetInputData(table, 0, 1);
232 #endif
233     line->SetColor(0, 255, 0, 255);
234     line->SetWidth(1.0);
235     
236     this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
237     this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
238     ProfileWidget->show();
239     
240     QApplication::restoreOverrideCursor();
241 }
242 //------------------------------------------------------------------------------
243
244
245 //------------------------------------------------------------------------------
246 void vvToolProfile::cancelPoints()
247
248   ProfileWidget->hide();
249   vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
250   chart->SetAutoSize(false);
251   chart->SetRenderEmpty(true);
252   mView->GetScene()->ClearItems();
253   mView->GetScene()->AddItem(chart);
254   this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
255   this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
256   ProfileWidget->show();
257   
258   QString position = "";
259   mPosPoint1Label->setText(position);
260   mPosPoint2Label->setText(position);
261   mPoint1Selected = false;
262   mPoint2Selected = false;
263   mComputeProfileButton->setEnabled(false);
264   isPointsSelected();
265 }
266 //------------------------------------------------------------------------------
267
268
269 //------------------------------------------------------------------------------
270 void vvToolProfile::RemoveVTKObjects()
271
272   if (mCurrentSlicerManager)
273     mCurrentSlicerManager->Render();
274 }
275 //------------------------------------------------------------------------------
276
277
278 //------------------------------------------------------------------------------
279 bool vvToolProfile::close()
280
281   // RemoveVTKObjects();
282   return vvToolWidgetBase::close();
283 }
284 //------------------------------------------------------------------------------
285
286
287 //------------------------------------------------------------------------------
288 void vvToolProfile::closeEvent(QCloseEvent *event)
289
290   RemoveVTKObjects();
291   event->accept();
292 }
293 //------------------------------------------------------------------------------
294
295
296 //------------------------------------------------------------------------------
297 void vvToolProfile::reject()
298
299   // DD("vvToolProfile::reject");
300   RemoveVTKObjects();
301   delete [] mPoint1;
302   delete [] mPoint2;
303   return vvToolWidgetBase::reject();
304 }
305 //------------------------------------------------------------------------------
306
307
308 //------------------------------------------------------------------------------
309 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
310
311   mCurrentSlicerManager = m;
312
313   mPoint1 = new int[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
314   mPoint2 = new int[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
315   
316   mComputeProfileButton->setEnabled(false);
317 }
318 //------------------------------------------------------------------------------
319
320
321 //------------------------------------------------------------------------------
322 void vvToolProfile::GetArgsInfoFromGUI()
323
324
325   /* //KEEP THIS FOR READING GGO FROM FILE
326      int argc=1;
327      std::string a = "toto";
328      char * const* argv = new char*;
329      //a.c_str();
330      struct cmdline_parser_params p;
331      p.check_required = 0;
332      int good = cmdline_parser_ext(argc, argv, &args_info, &p);
333      DD(good);
334   */
335   cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
336
337   mArgsInfo.verbose_flag = false;
338   
339   mArgsInfo.point1_arg = mPoint1;
340   mArgsInfo.point2_arg = mPoint2;
341   mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
342   mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
343   
344   // Required (even if not used)
345   mArgsInfo.input_given = 0;
346   mArgsInfo.output_given = 0;
347
348   mArgsInfo.input_arg = new char;
349   mArgsInfo.output_arg = new char;
350 }
351 //------------------------------------------------------------------------------
352
353
354 //------------------------------------------------------------------------------
355 void vvToolProfile::apply()
356
357   if (!mCurrentSlicerManager || !isPointsSelected()) {
358       close();
359       return;
360   }
361   
362   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
363
364   // Output
365   std::string fileName = "Profiled_" + mCurrentSlicerManager->GetSlicer(0)->GetFileName() + ".txt";
366   ofstream fileOpen(fileName.c_str(), std::ofstream::trunc);
367   
368   if(!fileOpen) {
369     cerr << "Error during saving" << endl;
370     QApplication::restoreOverrideCursor();
371     close();
372     
373     return;
374   }
375   vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
376   vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
377   vtkSmartPointer<vtkFloatArray> coords = vtkSmartPointer<vtkFloatArray>::New();
378   arrX = mFilter->GetArrayX();
379   arrY = mFilter->GetArrayY();
380   coords = mFilter->GetCoord();
381   double *tuple;
382   tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
383   int i(0);
384    
385   while (i<arrX->GetNumberOfTuples()) {
386       fileOpen << arrX->GetTuple(i)[0] << "\t" << arrY->GetTuple(i)[0] << "\t" ;
387       
388       coords->GetTuple(i, tuple);
389       for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
390           fileOpen << tuple[j] << "\t" ;
391       }
392       fileOpen << endl;
393       ++i;
394   }
395   
396   delete [] tuple;
397
398   fileOpen.close();
399
400   QApplication::restoreOverrideCursor();
401   close();
402 }
403 //------------------------------------------------------------------------------
404
405