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 ===========================================================================**/
19 #include <QFileDialog>
22 #include "vvToolProfile.h"
23 #include "vvProgressDialog.h"
24 #include "vvSlicerManager.h"
26 #include "vvToolInputSelectorWidget.h"
29 #include <vtkImageActor.h>
30 #include <vtkCamera.h>
31 #include <vtkImageClip.h>
32 #include <vtkRenderWindow.h>
33 #include <vtkChartXY.h>
35 #include <vtkRendererCollection.h>
36 #include <vtkRenderer.h>
39 #include <vtkCellArray.h>
40 #include <vtkCellData.h>
41 #include <vtkPolyDataMapper.h>
42 #include <vtkProperty.h>
44 #include <vtkInformation.h>
46 //------------------------------------------------------------------------------
47 // Create the tool and automagically (I like this word) insert it in
48 // the main window menu.
49 ADD_TOOL(vvToolProfile);
50 //------------------------------------------------------------------------------
53 //------------------------------------------------------------------------------
54 void vvToolProfile::Initialize()
56 SetToolName("Profile");
57 SetToolMenuName("Intensity Profile");
58 SetToolIconFilename(":/common/icons/profile.png");
59 SetToolTip("Display the intensity profile between 2 points of the image.");
60 SetToolExperimental(false);
62 //------------------------------------------------------------------------------
65 //------------------------------------------------------------------------------
66 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
67 :vvToolWidgetBase(parent,f),
68 vvToolBase<vvToolProfile>(parent),
72 Ui_vvToolProfile::setupUi(mToolWidget);
74 // Connect signals & slots
75 connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1()));
76 connect(mSelectPoint2Button, SIGNAL(clicked()), this, SLOT(selectPoint2()));
77 connect(mCancelPointsButton, SIGNAL(clicked()), this, SLOT(cancelPoints()));
78 connect(mSaveProfileButton, SIGNAL(clicked()), this, SLOT(SaveAs()));
80 // Initialize some widget
81 ProfileWidget->hide();
85 mPoint1Selected = false;
86 mPoint2Selected = false;
88 mView = vtkSmartPointer<vtkContextView>::New();
89 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
90 chart->SetAutoSize(false);
91 chart->SetRenderEmpty(true);
92 mView->GetScene()->AddItem(chart);
93 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
94 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
95 ProfileWidget->show();
98 mFilter = clitk::ProfileImageGenericFilter::New();
100 // Set how many inputs are needed for this tool
101 AddInputSelector("Select one image", mFilter);
103 //------------------------------------------------------------------------------
106 //------------------------------------------------------------------------------
107 vvToolProfile::~vvToolProfile()
109 connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
111 //------------------------------------------------------------------------------
114 //------------------------------------------------------------------------------
115 void vvToolProfile::selectPoint1()
117 QString position = "";
119 if (mPoint1Selected) {
120 ProfileWidget->hide();
121 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
122 chart->SetAutoSize(false);
123 chart->SetRenderEmpty(true);
124 mView->GetScene()->ClearItems();
125 mView->GetScene()->AddItem(chart);
126 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
127 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
128 ProfileWidget->show();
129 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
132 mPoint1Selected = false;
133 if(mCurrentSlicerManager) {
134 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
137 pos = new double [4];
138 pos[0] = pos[1] = pos[2] = pos[3] = 0;
139 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
142 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
143 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
144 index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
145 position += QString::number(pos[i],'f',1) + " ";
146 mPoint1[i] = index[i];
149 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
150 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
151 index[3] = (int)pos[3];
152 position += QString::number(pos[3],'f',1) + " ";
153 mPoint1[3] = index[3];
155 mPoint1Selected = true;
156 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
157 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
158 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
159 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P1");
162 mPosPoint1Label->setText(position);
164 mCurrentSlicerManager->Render();
166 //------------------------------------------------------------------------------
169 //------------------------------------------------------------------------------
170 void vvToolProfile::selectPoint2()
172 QString position = "";
174 if (mPoint2Selected) {
175 ProfileWidget->hide();
176 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
177 chart->SetAutoSize(false);
178 chart->SetRenderEmpty(true);
179 mView->GetScene()->ClearItems();
180 mView->GetScene()->AddItem(chart);
181 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
182 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
183 ProfileWidget->show();
184 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
187 mPoint2Selected = false;
188 if(mCurrentSlicerManager) {
189 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
192 pos = new double [4];
193 pos[0] = pos[1] = pos[2] = pos[3] = 0;;
194 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
197 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() &&i<3) {
198 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
199 index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
200 position += QString::number(pos[i],'f',1) + " ";
201 mPoint2[i] = index[i];
204 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
205 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
206 index[3] = (int)pos[3];
207 position += QString::number(pos[3],'f',1) + " ";
208 mPoint2[3] = index[3];
210 mPoint2Selected = true;
211 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
212 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
213 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
214 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2");
217 mPosPoint2Label->setText(position);
219 mCurrentSlicerManager->Render();
221 //------------------------------------------------------------------------------
223 //------------------------------------------------------------------------------
224 bool vvToolProfile::isPointsSelected()
226 if (mPoint1Selected && mPoint2Selected) {
227 mSaveProfileButton->setEnabled(true);
230 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
232 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
233 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
235 mCurrentSlicerManager->Render();
238 mSaveProfileButton->setEnabled(false);
239 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
240 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
241 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
242 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
246 return (mPoint1Selected && mPoint2Selected);
248 //------------------------------------------------------------------------------
251 //------------------------------------------------------------------------------
252 void vvToolProfile::computeProfile()
254 if (!mCurrentSlicerManager) close();
256 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
257 GetArgsInfoFromGUI();
258 ProfileWidget->hide();
261 mFilter->SetInputVVImage(mCurrentImage);
262 mFilter->SetArgsInfo(mArgsInfo);
264 //mImageLine = mFilter->GetOutputVVImage();
266 vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
267 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
268 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
269 arrX = mFilter->GetArrayX();
270 arrY = mFilter->GetArrayY();
271 arrX->SetName("Voxel");
272 arrY->SetName("Intensity");
273 table->AddColumn(arrX);
274 table->AddColumn(arrY);
276 mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
278 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
279 chart->SetAutoSize(true);
280 mView->GetScene()->ClearItems();
281 mView->GetScene()->AddItem(chart);
282 vtkPlot *line = chart->AddPlot(vtkChart::LINE);
283 #if VTK_MAJOR_VERSION <= 5
284 line->SetInput(table, 0, 1);
286 line->SetInputData(table, 0, 1);
288 line->SetColor(0, 255, 0, 255);
291 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
292 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
293 ProfileWidget->show();
295 QApplication::restoreOverrideCursor();
297 //------------------------------------------------------------------------------
300 //------------------------------------------------------------------------------
301 void vvToolProfile::cancelPoints()
304 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
306 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
307 ProfileWidget->hide();
308 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
309 chart->SetAutoSize(false);
310 chart->SetRenderEmpty(true);
311 mView->GetScene()->ClearItems();
312 mView->GetScene()->AddItem(chart);
313 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
314 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
315 ProfileWidget->show();
317 QString position = "";
318 mPosPoint1Label->setText(position);
319 mPosPoint2Label->setText(position);
320 mPoint1Selected = false;
321 mPoint2Selected = false;
322 mSaveProfileButton->setEnabled(false);
324 mCurrentSlicerManager->Render();
326 //------------------------------------------------------------------------------
329 //------------------------------------------------------------------------------
330 void vvToolProfile::RemoveVTKObjects()
332 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
333 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
337 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
339 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
342 if (mCurrentSlicerManager)
343 mCurrentSlicerManager->Render();
348 //------------------------------------------------------------------------------
351 //------------------------------------------------------------------------------
352 bool vvToolProfile::close()
354 //RemoveVTKObjects();
355 return vvToolWidgetBase::close();
357 //------------------------------------------------------------------------------
360 //------------------------------------------------------------------------------
361 void vvToolProfile::closeEvent(QCloseEvent *event)
366 //------------------------------------------------------------------------------
369 //------------------------------------------------------------------------------
370 void vvToolProfile::reject()
372 // DD("vvToolProfile::reject");
374 return vvToolWidgetBase::reject();
376 //------------------------------------------------------------------------------
379 //------------------------------------------------------------------------------
380 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
382 mCurrentSlicerManager = m;
384 mPoint1 = new int[4];
385 mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
386 mPoint2 = new int[4];
387 mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
389 mSaveProfileButton->setEnabled(false);
390 mTextFileName = "Profile.txt";
393 disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
395 //------------------------------------------------------------------------------
398 //------------------------------------------------------------------------------
399 void vvToolProfile::GetArgsInfoFromGUI()
402 /* //KEEP THIS FOR READING GGO FROM FILE
404 std::string a = "toto";
405 char * const* argv = new char*;
407 struct cmdline_parser_params p;
408 p.check_required = 0;
409 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
412 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
414 mArgsInfo.verbose_flag = false;
416 mArgsInfo.point1_arg = mPoint1;
417 mArgsInfo.point2_arg = mPoint2;
418 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
419 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
421 // Required (even if not used)
422 mArgsInfo.input_given = 0;
423 mArgsInfo.output_given = 0;
425 mArgsInfo.input_arg = new char;
426 mArgsInfo.output_arg = new char;
428 //------------------------------------------------------------------------------
431 //------------------------------------------------------------------------------
432 void vvToolProfile::apply()
436 //------------------------------------------------------------------------------
439 //------------------------------------------------------------------------------
440 void vvToolProfile::SaveAs()
442 QStringList OutputListeFormat;
443 OutputListeFormat.clear();
444 OutputListeFormat.push_back(".txt");
446 QString Extensions = "AllFiles(*.*)";
447 for (int i = 0; i < OutputListeFormat.count(); i++) {
448 Extensions += ";;Text File ( *";
449 Extensions += OutputListeFormat[i];
452 QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions);
453 if (!fileName.isEmpty()) {
454 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
455 QString fileQFormat = fileformat.c_str();
456 if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) {
457 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
458 std::string action = "Saving";
459 vvProgressDialog progress("Saving "+fileName.toStdString());
460 qApp->processEvents();
462 if (!mCurrentSlicerManager || !isPointsSelected()) {
468 mTextFileName = fileName.toStdString();
469 if (fileQFormat.isEmpty())
470 mTextFileName += ".txt";
471 ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
474 cerr << "Error during saving" << endl;
475 QApplication::restoreOverrideCursor();
480 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
481 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
482 vtkSmartPointer<vtkFloatArray> coords = vtkSmartPointer<vtkFloatArray>::New();
483 arrX = mFilter->GetArrayX();
484 arrY = mFilter->GetArrayY();
485 coords = mFilter->GetCoord();
487 tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
490 fileOpen << "Id" << "\t" << "Value" << "\t" ;
491 fileOpen << "x(vox)" << "\t" << "y(vox)" << "\t";
492 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
493 fileOpen << "z(vox)" << "\t";
494 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
495 fileOpen << "t" << "\t";
496 fileOpen << "x(mm)" << "\t" << "y(mm)" << "\t";
497 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
498 fileOpen << "z(mm)" << "\t";
499 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
500 fileOpen << "t" << "\t";
503 while (i<arrX->GetNumberOfTuples()) {
504 fileOpen << arrX->GetTuple(i)[0] << "\t" << arrY->GetTuple(i)[0] << "\t" ;
506 coords->GetTuple(i, tuple);
507 for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
508 fileOpen << tuple[j] << "\t" ;
511 while (j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && j<3) {
512 fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[j] << "\t" ;
515 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
516 fileOpen << tuple[3] << "\t" ;
525 QApplication::restoreOverrideCursor();
527 QString error = fileformat.c_str();
528 error += " format unknown !!!\n";
529 QMessageBox::information(this,tr("Saving Problem"),error);
534 //------------------------------------------------------------------------------
537 //------------------------------------------------------------------------------
538 void vvToolProfile::DeleteLine(int slicer)
540 if (!mPoint1Selected && !mPoint2Selected)
543 if(mCurrentSlicerManager) {
544 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
545 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]);
549 //------------------------------------------------------------------------------
552 //------------------------------------------------------------------------------
553 void vvToolProfile::DisplayLine(int slicer)
555 if (!mPoint1Selected && !mPoint2Selected)
558 if(mCurrentSlicerManager) {
559 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
560 vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
562 for (int j=0; j<6; ++j) {
563 extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
565 extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] = mCurrentSlicerManager->GetSlicer(slicer)->GetSlice();
566 extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()+1] = mCurrentSlicerManager->GetSlicer(slicer)->GetSlice();
567 clippingBox->SetBounds(extent);
568 vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
569 clipper->SetClipFunction(clippingBox);
570 #if VTK_MAJOR_VERSION <= 5
571 clipper->SetInput(mLinesPolyData);
573 clipper->SetInputData(mLinesPolyData);
575 clipper->InsideOutOff();
577 vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
578 #if VTK_MAJOR_VERSION <= 5
579 lineMapper->SetInput(clipper->GetOutput());
581 lineMapper->SetInputData(clipper->GetOutput());
584 mLineActors[slicer]->SetMapper(lineMapper);
585 mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
587 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
591 //------------------------------------------------------------------------------
594 //------------------------------------------------------------------------------
595 void vvToolProfile::InitializeLine()
597 if(mCurrentSlicerManager) {
599 mLinesPolyData = vtkSmartPointer<vtkPolyData>::New();
601 vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
603 pos[0] = pos[1] = pos[2] = pos[3] = 0;
604 pts->InsertNextPoint(pos);
605 pts->InsertNextPoint(pos);
606 mLinesPolyData->SetPoints(pts);
608 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
609 vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
610 line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts)
611 line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts)
612 lines->InsertNextCell(line);
613 mLinesPolyData->SetLines(lines);
615 unsigned char red[3] = { 255, 0, 0 };
616 vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
617 colors->SetNumberOfComponents(3);
618 colors->InsertNextTupleValue(red);
619 mLinesPolyData->GetCellData()->SetScalars(colors);
621 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
622 mLineActors.push_back(vtkSmartPointer<vtkActor>::New());
626 //------------------------------------------------------------------------------
629 //------------------------------------------------------------------------------
630 void vvToolProfile::SetPoints()
632 if (!mPoint1Selected && !mPoint2Selected)
635 if(mCurrentSlicerManager) {
636 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
638 pos = new double [4];
639 pos[0] = pos[1] = pos[2] = pos[3] = 0;
643 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
646 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
647 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
651 p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
652 p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
653 p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
656 p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
657 p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
658 p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
661 vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
667 //------------------------------------------------------------------------------