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(mCancelPoints, SIGNAL(clicked()), this, SLOT(cancelPoints()));
69 // Initialize some widget
70 //mThresholdSlider1->SetText("");
71 //mThresholdSlider2->SetText("");
72 //mFGSlider->SetText("Foreground value");
73 //mBGSlider->SetText("Background value");
79 mFilter = clitk::ProfileImageGenericFilter::New();
81 // Set how many inputs are needed for this tool
82 AddInputSelector("Select one image", mFilter);
84 //------------------------------------------------------------------------------
87 //------------------------------------------------------------------------------
88 vvToolProfile::~vvToolProfile()
91 //------------------------------------------------------------------------------
94 //------------------------------------------------------------------------------
95 void vvToolProfile::selectPoint1()
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) + " ";
112 point1Selected = true;
115 mPosPoint1Label->setText(position);
118 //------------------------------------------------------------------------------
121 //------------------------------------------------------------------------------
122 void vvToolProfile::selectPoint2()
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) + " ";
139 point2Selected = true;
142 mPosPoint2Label->setText(position);
145 //------------------------------------------------------------------------------
147 //------------------------------------------------------------------------------
148 bool vvToolProfile::isPointsSelected()
150 if (point1Selected && point2Selected) {
151 //Lancer le calcule du profil
154 return (point1Selected && point2Selected);
156 //------------------------------------------------------------------------------
159 //------------------------------------------------------------------------------
160 void vvToolProfile::cancelPoints()
162 QString position = "";
163 mPosPoint1Label->setText(position);
164 mPosPoint2Label->setText(position);
165 point1Selected = false;
166 point2Selected = false;
169 //------------------------------------------------------------------------------
172 //------------------------------------------------------------------------------
173 void vvToolProfile::InteractiveDisplayToggled(bool b)
175 /*mInteractiveDisplayIsEnabled = b;
176 if (!mInteractiveDisplayIsEnabled) {
179 for(unsigned int i=0; i<mImageContour.size(); i++) {
180 mImageContour[i]->ShowActors();
181 if (mRadioButtonLowerThan->isChecked())
182 mImageContourLower[i]->ShowActors();
184 if (mCurrentSlicerManager)
185 mCurrentSlicerManager->Render();
188 //------------------------------------------------------------------------------
191 //------------------------------------------------------------------------------
192 void vvToolProfile::RemoveVTKObjects()
194 for(unsigned int i=0; i<mImageContour.size(); i++) {
195 mImageContour[i]->HideActors();
196 mImageContourLower[i]->HideActors();
198 if (mCurrentSlicerManager)
199 mCurrentSlicerManager->Render();
201 //------------------------------------------------------------------------------
204 //------------------------------------------------------------------------------
205 bool vvToolProfile::close()
207 // RemoveVTKObjects();
208 return vvToolWidgetBase::close();
210 //------------------------------------------------------------------------------
213 //------------------------------------------------------------------------------
214 void vvToolProfile::closeEvent(QCloseEvent *event)
219 //------------------------------------------------------------------------------
222 //------------------------------------------------------------------------------
223 void vvToolProfile::reject()
225 // DD("vvToolProfile::reject");
229 return vvToolWidgetBase::reject();
231 //------------------------------------------------------------------------------
234 //------------------------------------------------------------------------------
235 void vvToolProfile::enableLowerThan(bool b)
238 mThresholdSlider1->resetMaximum();
239 for(unsigned int i=0; i<mImageContour.size(); i++) {
240 mImageContourLower[i]->HideActors();
242 mCurrentSlicerManager->Render();
244 valueChangedT1(mThresholdSlider1->GetValue());
245 valueChangedT2(mThresholdSlider2->GetValue());
246 for(unsigned int i=0; i<mImageContour.size(); i++) {
247 mImageContourLower[i]->ShowActors();
249 mCurrentSlicerManager->Render();
252 //------------------------------------------------------------------------------
255 //------------------------------------------------------------------------------
256 void vvToolProfile::useFGBGtoggled(bool)
258 if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked())
259 mCheckBoxUseBG->toggle();
261 //------------------------------------------------------------------------------
264 //------------------------------------------------------------------------------
265 // void vvToolProfile::InputIsSelected(std::vector<vvSlicerManager *> & m) {
266 // DD("vvToolProfile::InputIsSelected vector in Profile");
269 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
271 mCurrentSlicerManager = m;
273 mPoint1 = new double[3];
274 mPoint2 = new double[3];
275 //mPoint1 = new double[m->GetImage()->GetNumberOfSpatialDimensions()];
276 //mPoint2 = new double[m->GetImage()->GetNumberOfSpatialDimensions()];
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());
291 // Output is uchar ...
292 /*mFGSlider->SetMaximum(255);
293 mFGSlider->SetMinimum(0);
294 mBGSlider->SetMaximum(255);
295 mBGSlider->SetMinimum(0);
297 mFGSlider->SetValue(1);
298 mBGSlider->SetValue(0);
299 mFGSlider->SetSingleStep(1);
300 mBGSlider->SetSingleStep(1);
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)
313 //valueChangedT1(mThresholdSlider1->GetValue());
315 //connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double)));
316 //connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double)));
318 //connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
319 //connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
321 //connect(mCurrentSlicerManager,SIGNAL(UpdateOrientation(int,int)),this,SLOT(UpdateOrientation(int, int)));
323 // connect(mCurrentSlicerManager, SIGNAL(LeftButtonReleaseSignal(int)), SLOT(LeftButtonReleaseEvent(int)));
324 InteractiveDisplayToggled(mInteractiveDisplayIsEnabled);
326 //------------------------------------------------------------------------------
329 //------------------------------------------------------------------------------
330 // void vvToolProfile::LeftButtonReleaseEvent(int slicer) {
331 // DD("LeftButtonReleaseEvent");
332 // for(int i=0; i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
334 // mCurrentSlicerManager->GetSlicer(i)->GetRenderWindow()->Render();
337 //------------------------------------------------------------------------------
340 //------------------------------------------------------------------------------
341 void vvToolProfile::UpdateOrientation(int slicer,int orientation)
345 //------------------------------------------------------------------------------
347 //------------------------------------------------------------------------------
348 void vvToolProfile::UpdateSlice(int slicer,int slices)
352 //------------------------------------------------------------------------------
354 //------------------------------------------------------------------------------
355 void vvToolProfile::Update(int slicer)
357 if (!mInteractiveDisplayIsEnabled) return;
358 if (!mCurrentSlicerManager) close();
359 //mImageContour[slicer]->Update(mThresholdSlider1->GetValue());
360 //if (mRadioButtonLowerThan->isChecked())
361 // mImageContourLower[slicer]->Update(mThresholdSlider2->GetValue());
363 //------------------------------------------------------------------------------
365 //------------------------------------------------------------------------------
366 void vvToolProfile::GetArgsInfoFromGUI()
369 /* //KEEP THIS FOR READING GGO FROM FILE
371 std::string a = "toto";
372 char * const* argv = new char*;
374 struct cmdline_parser_params p;
375 p.check_required = 0;
376 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
379 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
380 bool inverseBGandFG = false;
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 ");
393 mArgsInfo.fg_arg = mFGSlider->GetValue();
394 mArgsInfo.bg_arg = mBGSlider->GetValue();
396 if (inverseBGandFG) {
397 mArgsInfo.fg_arg = mFGSlider->GetValue();
398 mArgsInfo.bg_arg = mBGSlider->GetValue();
400 mArgsInfo.fg_given = 1;
401 mArgsInfo.bg_given = 1;
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";
408 mArgsInfo.verbose_flag = false;
410 // // Required (even if not used)
411 // mArgsInfo.input_given = 0;
412 // mArgsInfo.output_given = 0;
414 // mArgsInfo.input_arg = new char;
415 // mArgsInfo.output_arg = new char;
417 //------------------------------------------------------------------------------
420 //------------------------------------------------------------------------------
421 void vvToolProfile::apply()
423 if (!mCurrentSlicerManager) close();
424 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
425 GetArgsInfoFromGUI();
428 clitk::ProfileImageGenericFilter::Pointer filter =
429 clitk::ProfileImageGenericFilter::New();
430 filter->SetInputVVImage(mCurrentImage);
431 filter->SetArgsInfo(mArgsInfo);
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();
443 //------------------------------------------------------------------------------
446 //------------------------------------------------------------------------------
447 void vvToolProfile::valueChangedT2(double v)
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);
456 mCurrentSlicerManager->Render();
459 //------------------------------------------------------------------------------
462 //------------------------------------------------------------------------------
463 void vvToolProfile::valueChangedT1(double v)
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);
473 mCurrentSlicerManager->Render();*/
475 //------------------------------------------------------------------------------