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