1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
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
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.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ===========================================================================**/
20 #include "vvToolProfile.h"
21 #include "vvSlicerManager.h"
23 #include "vvToolInputSelectorWidget.h"
26 #include "clitkProfileImageGenericFilter.h"
29 #include <vtkImageActor.h>
30 #include <vtkCamera.h>
31 #include <vtkImageClip.h>
32 #include <vtkRenderWindow.h>
35 //------------------------------------------------------------------------------
36 // Create the tool and automagically (I like this word) insert it in
37 // the main window menu.
38 ADD_TOOL(vvToolProfile);
39 //------------------------------------------------------------------------------
42 //------------------------------------------------------------------------------
43 void vvToolProfile::Initialize()
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);
51 //------------------------------------------------------------------------------
54 //------------------------------------------------------------------------------
55 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
56 :vvToolWidgetBase(parent,f),
57 vvToolBase<vvToolProfile>(parent),
61 Ui_vvToolProfile::setupUi(mToolWidget);
62 //mInteractiveDisplayIsEnabled = mCheckBoxInteractiveDisplay->isChecked();
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()));
70 // Initialize some widget
71 //mThresholdSlider1->SetText("");
72 //mThresholdSlider2->SetText("");
73 //mFGSlider->SetText("Foreground value");
74 //mBGSlider->SetText("Background value");
79 point1Selected = false;
80 point2Selected = false;
83 mFilter = clitk::ProfileImageGenericFilter::New();
85 // Set how many inputs are needed for this tool
86 AddInputSelector("Select one image", mFilter);
88 //------------------------------------------------------------------------------
91 //------------------------------------------------------------------------------
92 vvToolProfile::~vvToolProfile()
95 //------------------------------------------------------------------------------
98 //------------------------------------------------------------------------------
99 void vvToolProfile::selectPoint1()
101 QString position = "";
102 point1Selected = false;
103 if(mCurrentSlicerManager) {
104 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
107 pos = new double [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
108 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
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];
114 position += QString::number(pos[i],'f',1) + " ";
115 mPoint1[i] = index[i];
117 point1Selected = true;
120 mPosPoint1Label->setText(position);
123 //------------------------------------------------------------------------------
126 //------------------------------------------------------------------------------
127 void vvToolProfile::selectPoint2()
129 QString position = "";
130 point2Selected = false;
131 if(mCurrentSlicerManager) {
132 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
135 pos = new double [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
136 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
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];
142 position += QString::number(pos[i],'f',1) + " ";
143 mPoint2[i] = index[i];
145 point2Selected = true;
148 mPosPoint2Label->setText(position);
151 //------------------------------------------------------------------------------
153 //------------------------------------------------------------------------------
154 bool vvToolProfile::isPointsSelected()
156 if (point1Selected && point2Selected)
157 mComputeProfileButton->setEnabled(true);
159 mComputeProfileButton->setEnabled(false);
161 return (point1Selected && point2Selected);
163 //------------------------------------------------------------------------------
166 //------------------------------------------------------------------------------
167 void vvToolProfile::computeProfile()
169 if (!mCurrentSlicerManager) close();
171 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
172 GetArgsInfoFromGUI();
175 clitk::ProfileImageGenericFilter::Pointer filter = clitk::ProfileImageGenericFilter::New();
176 filter->SetInputVVImage(mCurrentImage);
177 filter->SetArgsInfo(mArgsInfo);
180 QApplication::restoreOverrideCursor();
183 //------------------------------------------------------------------------------
186 //------------------------------------------------------------------------------
187 void vvToolProfile::cancelPoints()
189 QString position = "";
190 mPosPoint1Label->setText(position);
191 mPosPoint2Label->setText(position);
192 point1Selected = false;
193 point2Selected = false;
194 mComputeProfileButton->setEnabled(false);
197 //------------------------------------------------------------------------------
200 //------------------------------------------------------------------------------
201 void vvToolProfile::InteractiveDisplayToggled(bool b)
203 /*mInteractiveDisplayIsEnabled = b;
204 if (!mInteractiveDisplayIsEnabled) {
207 for(unsigned int i=0; i<mImageContour.size(); i++) {
208 mImageContour[i]->ShowActors();
209 if (mRadioButtonLowerThan->isChecked())
210 mImageContourLower[i]->ShowActors();
212 if (mCurrentSlicerManager)
213 mCurrentSlicerManager->Render();
216 //------------------------------------------------------------------------------
219 //------------------------------------------------------------------------------
220 void vvToolProfile::RemoveVTKObjects()
222 for(unsigned int i=0; i<mImageContour.size(); i++) {
223 mImageContour[i]->HideActors();
224 mImageContourLower[i]->HideActors();
226 if (mCurrentSlicerManager)
227 mCurrentSlicerManager->Render();
229 //------------------------------------------------------------------------------
232 //------------------------------------------------------------------------------
233 bool vvToolProfile::close()
235 // RemoveVTKObjects();
236 return vvToolWidgetBase::close();
238 //------------------------------------------------------------------------------
241 //------------------------------------------------------------------------------
242 void vvToolProfile::closeEvent(QCloseEvent *event)
247 //------------------------------------------------------------------------------
250 //------------------------------------------------------------------------------
251 void vvToolProfile::reject()
253 // DD("vvToolProfile::reject");
257 return vvToolWidgetBase::reject();
259 //------------------------------------------------------------------------------
262 //------------------------------------------------------------------------------
263 void vvToolProfile::enableLowerThan(bool b)
266 mThresholdSlider1->resetMaximum();
267 for(unsigned int i=0; i<mImageContour.size(); i++) {
268 mImageContourLower[i]->HideActors();
270 mCurrentSlicerManager->Render();
272 valueChangedT1(mThresholdSlider1->GetValue());
273 valueChangedT2(mThresholdSlider2->GetValue());
274 for(unsigned int i=0; i<mImageContour.size(); i++) {
275 mImageContourLower[i]->ShowActors();
277 mCurrentSlicerManager->Render();
280 //------------------------------------------------------------------------------
283 //------------------------------------------------------------------------------
284 void vvToolProfile::useFGBGtoggled(bool)
286 if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked())
287 mCheckBoxUseBG->toggle();
289 //------------------------------------------------------------------------------
292 //------------------------------------------------------------------------------
293 // void vvToolProfile::InputIsSelected(std::vector<vvSlicerManager *> & m) {
294 // DD("vvToolProfile::InputIsSelected vector in Profile");
297 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
299 mCurrentSlicerManager = m;
301 mPoint1 = new int[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
302 mPoint2 = new int[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
304 mComputeProfileButton->setEnabled(false);
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());
319 // Output is uchar ...
320 /*mFGSlider->SetMaximum(255);
321 mFGSlider->SetMinimum(0);
322 mBGSlider->SetMaximum(255);
323 mBGSlider->SetMinimum(0);
325 mFGSlider->SetValue(1);
326 mBGSlider->SetValue(0);
327 mFGSlider->SetSingleStep(1);
328 mBGSlider->SetSingleStep(1);
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)
341 //valueChangedT1(mThresholdSlider1->GetValue());
343 //connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
344 //connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
346 //connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
347 //connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
349 //connect(mCurrentSlicerManager,SIGNAL(UpdateOrientation(int,int)),this,SLOT(UpdateOrientation(int, int)));
351 // connect(mCurrentSlicerManager, SIGNAL(LeftButtonReleaseSignal(int)), SLOT(LeftButtonReleaseEvent(int)));
352 InteractiveDisplayToggled(mInteractiveDisplayIsEnabled); */
354 //------------------------------------------------------------------------------
357 //------------------------------------------------------------------------------
358 // void vvToolProfile::LeftButtonReleaseEvent(int slicer) {
359 // DD("LeftButtonReleaseEvent");
360 // for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
362 // mCurrentSlicerManager->GetSlicer(i)->GetRenderWindow()->Render();
365 //------------------------------------------------------------------------------
368 //------------------------------------------------------------------------------
369 void vvToolProfile::UpdateOrientation(int slicer,int orientation)
373 //------------------------------------------------------------------------------
375 //------------------------------------------------------------------------------
376 void vvToolProfile::UpdateSlice(int slicer,int slices)
380 //------------------------------------------------------------------------------
382 //------------------------------------------------------------------------------
383 void vvToolProfile::Update(int slicer)
385 //if (!mInteractiveDisplayIsEnabled) return;
386 if (!mCurrentSlicerManager) close();
387 //mImageContour[slicer]->Update(mThresholdSlider1->GetValue());
388 //if (mRadioButtonLowerThan->isChecked())
389 // mImageContourLower[slicer]->Update(mThresholdSlider2->GetValue());
391 //------------------------------------------------------------------------------
393 //------------------------------------------------------------------------------
394 void vvToolProfile::GetArgsInfoFromGUI()
397 /* //KEEP THIS FOR READING GGO FROM FILE
399 std::string a = "toto";
400 char * const* argv = new char*;
402 struct cmdline_parser_params p;
403 p.check_required = 0;
404 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
407 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
408 //bool inverseBGandFG = false;
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 ");
421 mArgsInfo.fg_arg = mFGSlider->GetValue();
422 mArgsInfo.bg_arg = mBGSlider->GetValue();
424 if (inverseBGandFG) {
425 mArgsInfo.fg_arg = mFGSlider->GetValue();
426 mArgsInfo.bg_arg = mBGSlider->GetValue();
428 mArgsInfo.fg_given = 1;
429 mArgsInfo.bg_given = 1;
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";
436 mArgsInfo.verbose_flag = false;
438 mArgsInfo.point1_arg = mPoint1;
439 mArgsInfo.point2_arg = mPoint2;
440 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
441 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
443 // Required (even if not used)
444 mArgsInfo.input_given = 0;
445 mArgsInfo.output_given = 0;
447 mArgsInfo.input_arg = new char;
448 mArgsInfo.output_arg = new char;
450 //------------------------------------------------------------------------------
453 //------------------------------------------------------------------------------
454 void vvToolProfile::apply()
456 if (!mCurrentSlicerManager) close();
457 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
458 GetArgsInfoFromGUI();
461 clitk::ProfileImageGenericFilter::Pointer filter =
462 clitk::ProfileImageGenericFilter::New();
463 filter->SetInputVVImage(mCurrentImage);
464 filter->SetArgsInfo(mArgsInfo);
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();
476 //------------------------------------------------------------------------------
479 //------------------------------------------------------------------------------
480 void vvToolProfile::valueChangedT2(double v)
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);
489 mCurrentSlicerManager->Render();
492 //------------------------------------------------------------------------------
495 //------------------------------------------------------------------------------
496 void vvToolProfile::valueChangedT1(double v)
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);
506 mCurrentSlicerManager->Render();*/
508 //------------------------------------------------------------------------------