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 <vtkImageActor.h>
27 #include <vtkCamera.h>
28 #include <vtkImageClip.h>
29 #include <vtkRenderWindow.h>
30 #include <vtkChartXY.h>
32 #include <vtkRendererCollection.h>
33 #include <vtkRenderer.h>
36 //------------------------------------------------------------------------------
37 // Create the tool and automagically (I like this word) insert it in
38 // the main window menu.
39 ADD_TOOL(vvToolProfile);
40 //------------------------------------------------------------------------------
43 //------------------------------------------------------------------------------
44 void vvToolProfile::Initialize()
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);
52 //------------------------------------------------------------------------------
55 //------------------------------------------------------------------------------
56 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
57 :vvToolWidgetBase(parent,f),
58 vvToolBase<vvToolProfile>(parent),
62 Ui_vvToolProfile::setupUi(mToolWidget);
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 ProfileWidget->hide();
75 mPoint1Selected = false;
76 mPoint2Selected = false;
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();
88 mFilter = clitk::ProfileImageGenericFilter::New();
90 // Set how many inputs are needed for this tool
91 AddInputSelector("Select one image", mFilter);
93 //------------------------------------------------------------------------------
96 //------------------------------------------------------------------------------
97 vvToolProfile::~vvToolProfile()
100 //------------------------------------------------------------------------------
103 //------------------------------------------------------------------------------
104 void vvToolProfile::selectPoint1()
106 QString position = "";
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();
120 mPoint1Selected = false;
121 if(mCurrentSlicerManager) {
122 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
125 pos = new double [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
126 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
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];
132 position += QString::number(pos[i],'f',1) + " ";
133 mPoint1[i] = index[i];
135 mPoint1Selected = true;
138 mPosPoint1Label->setText(position);
141 //------------------------------------------------------------------------------
144 //------------------------------------------------------------------------------
145 void vvToolProfile::selectPoint2()
147 QString position = "";
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();
161 mPoint2Selected = false;
162 if(mCurrentSlicerManager) {
163 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
166 pos = new double [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
167 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
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];
173 position += QString::number(pos[i],'f',1) + " ";
174 mPoint2[i] = index[i];
176 mPoint2Selected = true;
179 mPosPoint2Label->setText(position);
182 //------------------------------------------------------------------------------
184 //------------------------------------------------------------------------------
185 bool vvToolProfile::isPointsSelected()
187 if (mPoint1Selected && mPoint2Selected)
188 mComputeProfileButton->setEnabled(true);
190 mComputeProfileButton->setEnabled(false);
192 return (mPoint1Selected && mPoint2Selected);
194 //------------------------------------------------------------------------------
197 //------------------------------------------------------------------------------
198 void vvToolProfile::computeProfile()
200 if (!mCurrentSlicerManager) close();
202 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
203 GetArgsInfoFromGUI();
204 ProfileWidget->hide();
207 mFilter->SetInputVVImage(mCurrentImage);
208 mFilter->SetArgsInfo(mArgsInfo);
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);
221 mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
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);
231 line->SetInputData(table, 0, 1);
233 line->SetColor(0, 255, 0, 255);
236 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
237 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
238 ProfileWidget->show();
240 QApplication::restoreOverrideCursor();
242 //------------------------------------------------------------------------------
245 //------------------------------------------------------------------------------
246 void vvToolProfile::cancelPoints()
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();
258 QString position = "";
259 mPosPoint1Label->setText(position);
260 mPosPoint2Label->setText(position);
261 mPoint1Selected = false;
262 mPoint2Selected = false;
263 mComputeProfileButton->setEnabled(false);
266 //------------------------------------------------------------------------------
269 //------------------------------------------------------------------------------
270 void vvToolProfile::RemoveVTKObjects()
272 if (mCurrentSlicerManager)
273 mCurrentSlicerManager->Render();
275 //------------------------------------------------------------------------------
278 //------------------------------------------------------------------------------
279 bool vvToolProfile::close()
281 // RemoveVTKObjects();
282 return vvToolWidgetBase::close();
284 //------------------------------------------------------------------------------
287 //------------------------------------------------------------------------------
288 void vvToolProfile::closeEvent(QCloseEvent *event)
293 //------------------------------------------------------------------------------
296 //------------------------------------------------------------------------------
297 void vvToolProfile::reject()
299 // DD("vvToolProfile::reject");
303 return vvToolWidgetBase::reject();
305 //------------------------------------------------------------------------------
308 //------------------------------------------------------------------------------
309 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
311 mCurrentSlicerManager = m;
313 mPoint1 = new int[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
314 mPoint2 = new int[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
316 mComputeProfileButton->setEnabled(false);
318 //------------------------------------------------------------------------------
321 //------------------------------------------------------------------------------
322 void vvToolProfile::GetArgsInfoFromGUI()
325 /* //KEEP THIS FOR READING GGO FROM FILE
327 std::string a = "toto";
328 char * const* argv = new char*;
330 struct cmdline_parser_params p;
331 p.check_required = 0;
332 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
335 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
337 mArgsInfo.verbose_flag = false;
339 mArgsInfo.point1_arg = mPoint1;
340 mArgsInfo.point2_arg = mPoint2;
341 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
342 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
344 // Required (even if not used)
345 mArgsInfo.input_given = 0;
346 mArgsInfo.output_given = 0;
348 mArgsInfo.input_arg = new char;
349 mArgsInfo.output_arg = new char;
351 //------------------------------------------------------------------------------
354 //------------------------------------------------------------------------------
355 void vvToolProfile::apply()
357 if (!mCurrentSlicerManager || !isPointsSelected()) {
362 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
365 std::string fileName = "Profiled_" + mCurrentSlicerManager->GetSlicer(0)->GetFileName() + ".txt";
366 ofstream fileOpen(fileName.c_str(), std::ofstream::trunc);
369 cerr << "Error during saving" << endl;
370 QApplication::restoreOverrideCursor();
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();
382 tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
385 while (i<arrX->GetNumberOfTuples()) {
386 fileOpen << arrX->GetTuple(i)[0] << "\t" << arrY->GetTuple(i)[0] << "\t" ;
388 coords->GetTuple(i, tuple);
389 for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
390 fileOpen << tuple[j] << "\t" ;
400 QApplication::restoreOverrideCursor();
403 //------------------------------------------------------------------------------