]> Creatis software - clitk.git/blob - vv/vvToolProfile.cxx
Create the line iterator
[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 // clitk
26 #include "clitkProfileImageGenericFilter.h"
27
28 // vtk
29 #include <vtkImageActor.h>
30 #include <vtkCamera.h>
31 #include <vtkImageClip.h>
32 #include <vtkRenderWindow.h>
33
34
35 //------------------------------------------------------------------------------
36 // Create the tool and automagically (I like this word) insert it in
37 // the main window menu.
38 ADD_TOOL(vvToolProfile);
39 //------------------------------------------------------------------------------
40
41
42 //------------------------------------------------------------------------------
43 void vvToolProfile::Initialize()
44
45   SetToolName("Profile");
46   SetToolMenuName("Intensity Profile");
47   SetToolIconFilename(":/common/icons/profile.png");
48   SetToolTip("Display the intensity profile between 2 points of the image.");
49   SetToolExperimental(false);
50 }
51 //------------------------------------------------------------------------------
52
53
54 //------------------------------------------------------------------------------
55 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
56   :vvToolWidgetBase(parent,f),
57    vvToolBase<vvToolProfile>(parent),
58    Ui::vvToolProfile()
59
60   // GUI Initialization
61   Ui_vvToolProfile::setupUi(mToolWidget);
62   //mInteractiveDisplayIsEnabled = mCheckBoxInteractiveDisplay->isChecked();
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   //mThresholdSlider1->SetText("");
72   //mThresholdSlider2->SetText("");
73   //mFGSlider->SetText("Foreground value");
74   //mBGSlider->SetText("Background value");
75   
76   mPoint1 = NULL;
77   mPoint2 = NULL;
78   
79   point1Selected = false;
80   point2Selected = false;
81
82   // Main filter
83   mFilter = clitk::ProfileImageGenericFilter::New();
84
85   // Set how many inputs are needed for this tool
86   AddInputSelector("Select one image", mFilter);
87 }
88 //------------------------------------------------------------------------------
89
90
91 //------------------------------------------------------------------------------
92 vvToolProfile::~vvToolProfile()
93
94 }
95 //------------------------------------------------------------------------------
96
97
98 //------------------------------------------------------------------------------
99 void vvToolProfile::selectPoint1()
100 {
101   QString position = "";
102   point1Selected = false;
103   if(mCurrentSlicerManager) {
104       if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
105           double *pos;
106           int *index;
107           pos = new double [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
108           index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
109           
110           for (int i=0; i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions(); ++i) {
111             pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
112             index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
113             
114             position += QString::number(pos[i],'f',1) + " ";
115             mPoint1[i] = index[i];
116           }
117           point1Selected = true;
118       }
119   }
120   mPosPoint1Label->setText(position);
121   isPointsSelected();
122 }
123 //------------------------------------------------------------------------------
124
125
126 //------------------------------------------------------------------------------
127 void vvToolProfile::selectPoint2()
128 {
129   QString position = "";
130   point2Selected = false;
131   if(mCurrentSlicerManager) {
132       if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
133           double *pos;
134           int *index;
135           pos = new double [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
136           index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
137           
138           for (int i=0; i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions(); ++i) {
139             pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
140             index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
141             
142             position += QString::number(pos[i],'f',1) + " ";
143             mPoint2[i] = index[i];
144           }
145           point2Selected = true;
146       }
147   }
148   mPosPoint2Label->setText(position);
149   isPointsSelected();
150 }
151 //------------------------------------------------------------------------------
152
153 //------------------------------------------------------------------------------
154 bool vvToolProfile::isPointsSelected()
155 {
156   if (point1Selected && point2Selected)
157       mComputeProfileButton->setEnabled(true);
158   else
159       mComputeProfileButton->setEnabled(false);
160   
161   return (point1Selected && point2Selected);
162 }
163 //------------------------------------------------------------------------------
164
165
166 //------------------------------------------------------------------------------
167 void vvToolProfile::computeProfile()
168 {
169     if (!mCurrentSlicerManager) close();
170
171     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
172     GetArgsInfoFromGUI();
173     
174     // Main filter
175     clitk::ProfileImageGenericFilter::Pointer filter = clitk::ProfileImageGenericFilter::New();
176     filter->SetInputVVImage(mCurrentImage);
177     filter->SetArgsInfo(mArgsInfo);
178     filter->Update();
179     
180     QApplication::restoreOverrideCursor();
181  
182 }
183 //------------------------------------------------------------------------------
184
185
186 //------------------------------------------------------------------------------
187 void vvToolProfile::cancelPoints()
188
189   QString position = "";
190   mPosPoint1Label->setText(position);
191   mPosPoint2Label->setText(position);
192   point1Selected = false;
193   point2Selected = false;
194   mComputeProfileButton->setEnabled(false);
195   isPointsSelected();
196 }
197 //------------------------------------------------------------------------------
198
199
200 //------------------------------------------------------------------------------
201 void vvToolProfile::InteractiveDisplayToggled(bool b)
202
203   /*mInteractiveDisplayIsEnabled = b;
204   if (!mInteractiveDisplayIsEnabled) {
205     RemoveVTKObjects();
206   } else {
207     for(unsigned int i=0; i<mImageContour.size(); i++) {
208       mImageContour[i]->ShowActors();
209       if (mRadioButtonLowerThan->isChecked())
210         mImageContourLower[i]->ShowActors();
211     }
212     if (mCurrentSlicerManager)
213       mCurrentSlicerManager->Render();
214   }*/  
215 }
216 //------------------------------------------------------------------------------
217
218
219 //------------------------------------------------------------------------------
220 void vvToolProfile::RemoveVTKObjects()
221
222   for(unsigned int i=0; i<mImageContour.size(); i++) {
223     mImageContour[i]->HideActors();
224     mImageContourLower[i]->HideActors();    
225   }
226   if (mCurrentSlicerManager)
227     mCurrentSlicerManager->Render();
228 }
229 //------------------------------------------------------------------------------
230
231
232 //------------------------------------------------------------------------------
233 bool vvToolProfile::close()
234
235   // RemoveVTKObjects();
236   return vvToolWidgetBase::close();
237 }
238 //------------------------------------------------------------------------------
239
240
241 //------------------------------------------------------------------------------
242 void vvToolProfile::closeEvent(QCloseEvent *event)
243
244   RemoveVTKObjects();
245   event->accept();
246 }
247 //------------------------------------------------------------------------------
248
249
250 //------------------------------------------------------------------------------
251 void vvToolProfile::reject()
252
253   // DD("vvToolProfile::reject");
254   RemoveVTKObjects();
255   delete [] mPoint1;
256   delete [] mPoint2;
257   return vvToolWidgetBase::reject();
258 }
259 //------------------------------------------------------------------------------
260
261
262 //------------------------------------------------------------------------------
263 void vvToolProfile::enableLowerThan(bool b)
264
265   /*if (!b) {
266     mThresholdSlider1->resetMaximum();
267     for(unsigned int i=0; i<mImageContour.size(); i++) {
268       mImageContourLower[i]->HideActors();    
269     }
270     mCurrentSlicerManager->Render();
271   } else {
272     valueChangedT1(mThresholdSlider1->GetValue());
273     valueChangedT2(mThresholdSlider2->GetValue());
274     for(unsigned int i=0; i<mImageContour.size(); i++) {
275       mImageContourLower[i]->ShowActors();    
276     }
277     mCurrentSlicerManager->Render();
278   }*/
279 }
280 //------------------------------------------------------------------------------
281
282
283 //------------------------------------------------------------------------------
284 void vvToolProfile::useFGBGtoggled(bool)
285
286   if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked())
287     mCheckBoxUseBG->toggle();
288 }
289 //------------------------------------------------------------------------------
290
291
292 //------------------------------------------------------------------------------
293 // void vvToolProfile::InputIsSelected(std::vector<vvSlicerManager *> & m) {
294 //   DD("vvToolProfile::InputIsSelected vector in Profile");
295 //   DD(m.size());
296 // }
297 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
298
299   mCurrentSlicerManager = m;
300
301   mPoint1 = new int[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
302   mPoint2 = new int[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
303   
304   mComputeProfileButton->setEnabled(false);
305
306   // Specific for this gui
307   //mThresholdSlider1->SetValue(0);
308   //mThresholdSlider2->SetValue(0);
309   //mThresholdSlider1->SetImage(mCurrentImage);
310   //mThresholdSlider2->SetImage(mCurrentImage);
311   //mFGSlider->SetImage(mCurrentImage);
312   //mBGSlider->SetImage(mCurrentImage);
313   //  DD(mCurrentSlicerManager->GetFileName().c_str());
314   //  mFGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
315   //   mFGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
316   //   mBGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax());
317   //   mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin());
318
319   // Output is uchar ...
320   /*mFGSlider->SetMaximum(255);
321   mFGSlider->SetMinimum(0);
322   mBGSlider->SetMaximum(255);
323   mBGSlider->SetMinimum(0);
324
325   mFGSlider->SetValue(1);
326   mBGSlider->SetValue(0);
327   mFGSlider->SetSingleStep(1);
328   mBGSlider->SetSingleStep(1);
329
330   // VTK objects for interactive display
331   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
332     mImageContour.push_back(vvImageContour::New());
333     mImageContour[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i));
334     mImageContour[i]->SetColor(1.0, 0.0, 0.0);
335     mImageContour[i]->SetDepth(0); // to be in front of (whe used with ROI tool)
336     mImageContourLower.push_back(vvImageContour::New());
337     mImageContourLower[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i));
338     mImageContourLower[i]->SetColor(0.0, 0.0, 1.0);
339     mImageContourLower[i]->SetDepth(100); // to be in front of (whe used with ROI tool)
340   }
341   //valueChangedT1(mThresholdSlider1->GetValue());
342
343   //connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
344   //connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
345
346   //connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
347   //connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
348   
349   //connect(mCurrentSlicerManager,SIGNAL(UpdateOrientation(int,int)),this,SLOT(UpdateOrientation(int, int)));
350
351   //  connect(mCurrentSlicerManager, SIGNAL(LeftButtonReleaseSignal(int)), SLOT(LeftButtonReleaseEvent(int)));
352   InteractiveDisplayToggled(mInteractiveDisplayIsEnabled); */
353 }
354 //------------------------------------------------------------------------------
355
356
357 //------------------------------------------------------------------------------
358 // void vvToolProfile::LeftButtonReleaseEvent(int slicer) {
359 //   DD("LeftButtonReleaseEvent");
360 //   for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
361 //     if (i == slicer);
362 //     mCurrentSlicerManager->GetSlicer(i)->GetRenderWindow()->Render();
363 //   }
364 // }
365 //------------------------------------------------------------------------------
366
367
368 //------------------------------------------------------------------------------
369 void vvToolProfile::UpdateOrientation(int slicer,int orientation)
370
371   Update(slicer);
372 }
373 //------------------------------------------------------------------------------
374
375 //------------------------------------------------------------------------------
376 void vvToolProfile::UpdateSlice(int slicer,int slices)
377
378   Update(slicer);
379 }
380 //------------------------------------------------------------------------------
381
382 //------------------------------------------------------------------------------
383 void vvToolProfile::Update(int slicer)
384
385   //if (!mInteractiveDisplayIsEnabled) return;
386   if (!mCurrentSlicerManager) close();
387   //mImageContour[slicer]->Update(mThresholdSlider1->GetValue());
388   //if (mRadioButtonLowerThan->isChecked()) 
389   //  mImageContourLower[slicer]->Update(mThresholdSlider2->GetValue());
390 }
391 //------------------------------------------------------------------------------
392
393 //------------------------------------------------------------------------------
394 void vvToolProfile::GetArgsInfoFromGUI()
395
396
397   /* //KEEP THIS FOR READING GGO FROM FILE
398      int argc=1;
399      std::string a = "toto";
400      char * const* argv = new char*;
401      //a.c_str();
402      struct cmdline_parser_params p;
403      p.check_required = 0;
404      int good = cmdline_parser_ext(argc, argv, &args_info, &p);
405      DD(good);
406   */
407   cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
408   //bool inverseBGandFG = false;
409
410   //mArgsInfo.lower_given = 1;
411   /*mArgsInfo.lower_arg = mThresholdSlider1->GetValue();
412   if (mRadioButtonLowerThan->isChecked()) {
413     mArgsInfo.upper_given = 1;
414     mArgsInfo.upper_arg = mThresholdSlider2->GetValue();
415     if (mArgsInfo.upper_arg<mArgsInfo.lower_arg) {
416       mArgsInfo.upper_given = 0;
417       DD("TODO : lower thres greater than greater thres ! Ignoring ");
418     }
419   }
420
421   mArgsInfo.fg_arg = mFGSlider->GetValue();
422   mArgsInfo.bg_arg = mBGSlider->GetValue();
423
424   if (inverseBGandFG) {
425     mArgsInfo.fg_arg = mFGSlider->GetValue();
426     mArgsInfo.bg_arg = mBGSlider->GetValue();
427   }
428   mArgsInfo.fg_given = 1;
429   mArgsInfo.bg_given = 1;
430
431   if (mCheckBoxUseBG->isChecked()) {
432     if (mCheckBoxUseFG->isChecked()) mArgsInfo.mode_arg = (char*)"both";
433     else mArgsInfo.mode_arg = (char*)"BG";
434   } else mArgsInfo.mode_arg = (char*)"FG";
435 */
436   mArgsInfo.verbose_flag = false;
437   
438   mArgsInfo.point1_arg = mPoint1;
439   mArgsInfo.point2_arg = mPoint2;
440   mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
441   mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
442   
443   // Required (even if not used)
444   mArgsInfo.input_given = 0;
445   mArgsInfo.output_given = 0;
446
447   mArgsInfo.input_arg = new char;
448   mArgsInfo.output_arg = new char;
449 }
450 //------------------------------------------------------------------------------
451
452
453 //------------------------------------------------------------------------------
454 void vvToolProfile::apply()
455
456   if (!mCurrentSlicerManager) close();
457   QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
458   GetArgsInfoFromGUI();  
459   
460   // Main filter
461   clitk::ProfileImageGenericFilter::Pointer filter =
462     clitk::ProfileImageGenericFilter::New();
463   filter->SetInputVVImage(mCurrentImage);
464   filter->SetArgsInfo(mArgsInfo);
465   filter->Update();
466
467
468   // Output
469   vvImage::Pointer output = filter->GetOutputVVImage();  
470   std::ostringstream osstream;
471   osstream << "Profiled_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd";
472   AddImage(output,osstream.str());
473   QApplication::restoreOverrideCursor();
474   close();
475 }
476 //------------------------------------------------------------------------------
477
478
479 //------------------------------------------------------------------------------
480 void vvToolProfile::valueChangedT2(double v)
481
482   /*//  DD("valueChangedT2");
483   if (mRadioButtonLowerThan->isChecked()) {
484     mThresholdSlider1->SetMaximum(v);
485     if (!mInteractiveDisplayIsEnabled) return;
486     for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
487       mImageContourLower[i]->Update(v);
488     }
489     mCurrentSlicerManager->Render();
490   }*/
491 }
492 //------------------------------------------------------------------------------
493
494
495 //------------------------------------------------------------------------------
496 void vvToolProfile::valueChangedT1(double v)
497
498   /*//  DD("valueChangedT1");
499   if (!mCurrentSlicerManager) close();
500   mThresholdSlider2->SetMinimum(v);
501   //  int m1 = (int)lrint(v);
502   if (!mInteractiveDisplayIsEnabled) return;
503   for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
504     mImageContour[i]->Update(v);
505   }
506   mCurrentSlicerManager->Render();*/
507 }
508 //------------------------------------------------------------------------------