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>
25 #include "vvToolProfile.h"
26 #include "vvProgressDialog.h"
27 #include "vvSlicerManager.h"
29 #include "vvToolInputSelectorWidget.h"
33 #include <vtkImageActor.h>
34 #include <vtkCamera.h>
35 #include <vtkImageClip.h>
36 #include <vtkRenderWindow.h>
37 #include <vtkChartXY.h>
39 #include <vtkRendererCollection.h>
40 #include <vtkRenderer.h>
43 #include <vtkCellArray.h>
44 #include <vtkCellData.h>
45 #include <vtkPolyDataMapper.h>
46 #include <vtkProperty.h>
48 #include <vtkInformation.h>
50 //------------------------------------------------------------------------------
51 // Create the tool and automagically (I like this word) insert it in
52 // the main window menu.
53 ADD_TOOL(vvToolProfile);
54 //------------------------------------------------------------------------------
57 //------------------------------------------------------------------------------
58 void vvToolProfile::Initialize()
60 SetToolName("Profile");
61 SetToolMenuName("Intensity Profile");
62 SetToolIconFilename(":/common/icons/profile.png");
63 SetToolTip("Display the intensity profile between 2 points of the image.");
64 SetToolExperimental(false);
66 //------------------------------------------------------------------------------
69 //------------------------------------------------------------------------------
70 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
71 :vvToolWidgetBase(parent,f),
72 vvToolBase<vvToolProfile>(parent),
76 Ui_vvToolProfile::setupUi(mToolWidget);
78 QShortcut *shortcutPoint1 = new QShortcut(QKeySequence("Ctrl+1"), parent);
79 shortcutPoint1->setContext(Qt::ApplicationShortcut);
80 QObject::connect(shortcutPoint1, SIGNAL(activated()), this, SLOT(selectPoint1()));
81 QShortcut *shortcutPoint2 = new QShortcut(QKeySequence("Ctrl+2"), parent);
82 shortcutPoint2->setContext(Qt::ApplicationShortcut);
83 QObject::connect(shortcutPoint2, SIGNAL(activated()), this, SLOT(selectPoint2()));
85 // Connect signals & slots
86 connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1()));
87 connect(mSelectPoint2Button, SIGNAL(clicked()), this, SLOT(selectPoint2()));
88 connect(mCancelPointsButton, SIGNAL(clicked()), this, SLOT(cancelPoints()));
89 connect(mSaveProfileButton, SIGNAL(clicked()), this, SLOT(SaveAs()));
91 // Initialize some widget
92 ProfileWidget->hide();
96 mPoint1Selected = false;
97 mPoint2Selected = false;
99 mView = vtkSmartPointer<vtkContextView>::New();
100 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
101 chart->SetAutoSize(false);
102 chart->SetRenderEmpty(true);
103 mView->GetScene()->AddItem(chart);
104 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
105 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
106 ProfileWidget->show();
109 mFilter = clitk::ProfileImageGenericFilter::New();
111 // Set how many inputs are needed for this tool
112 AddInputSelector("Select one image", mFilter);
114 //------------------------------------------------------------------------------
117 //------------------------------------------------------------------------------
118 vvToolProfile::~vvToolProfile()
123 //------------------------------------------------------------------------------
126 //------------------------------------------------------------------------------
127 void vvToolProfile::selectPoint1()
129 QString position = "";
131 if(mCurrentSlicerManager) {
132 if (mPoint1Selected) {
133 ProfileWidget->hide();
134 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
135 chart->SetAutoSize(false);
136 chart->SetRenderEmpty(true);
137 mView->GetScene()->ClearItems();
138 mView->GetScene()->AddItem(chart);
139 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
140 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
141 ProfileWidget->show();
142 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
145 mPoint1Selected = false;
147 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
149 pos = new double [4];
150 pos[0] = pos[1] = pos[2] = pos[3] = 0;
153 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
154 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
155 position += QString::number(pos[i],'f',1) + " ";
156 mPoint1[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i]);
159 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
160 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
161 position += QString::number(pos[3],'f',1) + " ";
162 mPoint1[3] = round(pos[3]);
164 mPoint1Selected = true;
165 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
166 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
167 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
168 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P1");
171 mPosPoint1Label->setText(position);
173 mCurrentSlicerManager->Render();
175 //------------------------------------------------------------------------------
178 //------------------------------------------------------------------------------
179 void vvToolProfile::selectPoint2()
181 QString position = "";
183 if(mCurrentSlicerManager) {
184 if (mPoint2Selected) {
185 ProfileWidget->hide();
186 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
187 chart->SetAutoSize(false);
188 chart->SetRenderEmpty(true);
189 mView->GetScene()->ClearItems();
190 mView->GetScene()->AddItem(chart);
191 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
192 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
193 ProfileWidget->show();
194 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
197 mPoint2Selected = false;
198 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
200 pos = new double [4];
201 pos[0] = pos[1] = pos[2] = pos[3] = 0;;
204 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() &&i<3) {
205 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
206 position += QString::number(pos[i],'f',1) + " ";
207 mPoint2[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i]);
210 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
211 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
212 position += QString::number(pos[3],'f',1) + " ";
213 mPoint2[3] = round(pos[3]);
215 mPoint2Selected = true;
216 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
217 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
218 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
219 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2");
222 mPosPoint2Label->setText(position);
224 mCurrentSlicerManager->Render();
226 //------------------------------------------------------------------------------
228 //------------------------------------------------------------------------------
229 bool vvToolProfile::isPointsSelected()
231 if (mPoint1Selected && mPoint2Selected) {
232 mSaveProfileButton->setEnabled(true);
235 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
237 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
238 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
240 mCurrentSlicerManager->Render();
243 mSaveProfileButton->setEnabled(false);
244 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
245 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
246 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
247 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
251 return (mPoint1Selected && mPoint2Selected);
253 //------------------------------------------------------------------------------
256 //------------------------------------------------------------------------------
257 void vvToolProfile::computeProfile()
259 if (!mCurrentSlicerManager) close();
260 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
261 GetArgsInfoFromGUI();
262 ProfileWidget->hide();
265 mFilter->SetInputVVImage(mCurrentImage);
266 mFilter->SetArgsInfo(mArgsInfo);
269 //Creation of the XY chart
270 vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
271 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
272 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
273 arrX = mFilter->GetArrayX();
274 arrY = mFilter->GetArrayY();
275 arrX->SetName("Distance (mm)");
276 arrY->SetName("Intensity");
278 table->AddColumn(arrX);
279 table->AddColumn(arrY);
281 mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
283 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
284 chart->SetAutoSize(true);
285 mView->GetScene()->ClearItems();
286 mView->GetScene()->AddItem(chart);
287 vtkPlot *line = chart->AddPlot(vtkChart::LINE);
288 #if VTK_MAJOR_VERSION <= 5
289 line->SetInput(table, 0, 1);
291 line->SetInputData(table, 0, 1);
293 line->SetColor(0, 255, 0, 255);
295 chart->GetAxis(vtkAxis::LEFT)->SetTitle("Intensity");
296 chart->GetAxis(vtkAxis::BOTTOM)->SetTitle("Distance (mm)");
298 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
299 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
300 ProfileWidget->show();
302 QApplication::restoreOverrideCursor();
304 //------------------------------------------------------------------------------
307 //------------------------------------------------------------------------------
308 void vvToolProfile::cancelPoints()
311 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
313 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
314 ProfileWidget->hide();
315 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
316 chart->SetAutoSize(false);
317 chart->SetRenderEmpty(true);
318 mView->GetScene()->ClearItems();
319 mView->GetScene()->AddItem(chart);
320 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
321 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
322 ProfileWidget->show();
324 QString position = "";
325 mPosPoint1Label->setText(position);
326 mPosPoint2Label->setText(position);
327 mPoint1Selected = false;
328 mPoint2Selected = false;
329 mSaveProfileButton->setEnabled(false);
331 mCurrentSlicerManager->Render();
333 //------------------------------------------------------------------------------
336 //------------------------------------------------------------------------------
337 void vvToolProfile::RemoveVTKObjects()
339 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
340 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
344 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
346 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
349 if (mCurrentSlicerManager)
350 mCurrentSlicerManager->Render();
352 //------------------------------------------------------------------------------
355 //------------------------------------------------------------------------------
356 bool vvToolProfile::close()
358 //RemoveVTKObjects();
360 connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
361 return vvToolWidgetBase::close();
363 //------------------------------------------------------------------------------
366 //------------------------------------------------------------------------------
367 void vvToolProfile::closeEvent(QCloseEvent *event)
372 //------------------------------------------------------------------------------
375 //------------------------------------------------------------------------------
376 void vvToolProfile::reject()
378 // DD("vvToolProfile::reject");
380 return vvToolWidgetBase::reject();
382 //------------------------------------------------------------------------------
385 //------------------------------------------------------------------------------
386 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
388 mCurrentSlicerManager = m;
390 mPoint1 = new int[4];
391 mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
392 mPoint2 = new int[4];
393 mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
395 mSaveProfileButton->setEnabled(false);
396 mTextFileName = "Profile.txt";
399 disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
401 //------------------------------------------------------------------------------
404 //------------------------------------------------------------------------------
405 void vvToolProfile::GetArgsInfoFromGUI()
408 /* //KEEP THIS FOR READING GGO FROM FILE
410 std::string a = "toto";
411 char * const* argv = new char*;
413 struct cmdline_parser_params p;
414 p.check_required = 0;
415 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
418 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
420 mArgsInfo.verbose_flag = false;
422 mArgsInfo.point1_arg = mPoint1;
423 mArgsInfo.point2_arg = mPoint2;
424 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
425 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
427 // Required (even if not used)
428 mArgsInfo.input_given = 0;
429 mArgsInfo.output_given = 0;
431 mArgsInfo.input_arg = new char;
432 mArgsInfo.output_arg = new char;
436 //------------------------------------------------------------------------------
439 //------------------------------------------------------------------------------
440 void vvToolProfile::apply()
444 //------------------------------------------------------------------------------
447 //------------------------------------------------------------------------------
448 void vvToolProfile::SaveAs()
450 QStringList OutputListeFormat;
451 OutputListeFormat.clear();
452 OutputListeFormat.push_back(".txt");
454 QString Extensions = "AllFiles(*.*)";
455 for (int i = 0; i < OutputListeFormat.count(); i++) {
456 Extensions += ";;Text File ( *";
457 Extensions += OutputListeFormat[i];
460 QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions);
461 if (!fileName.isEmpty()) {
462 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
463 QString fileQFormat = fileformat.c_str();
464 if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) {
465 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
466 std::string action = "Saving";
467 vvProgressDialog progress("Saving "+fileName.toStdString());
468 qApp->processEvents();
470 if (!mCurrentSlicerManager || !isPointsSelected()) {
476 mTextFileName = fileName.toStdString();
477 if (fileQFormat.isEmpty())
478 mTextFileName += ".txt";
479 ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
482 cerr << "Error during saving" << endl;
483 QApplication::restoreOverrideCursor();
488 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
489 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
490 vtkSmartPointer<vtkFloatArray> coords = vtkSmartPointer<vtkFloatArray>::New();
491 arrX = mFilter->GetArrayX();
492 arrY = mFilter->GetArrayY();
493 coords = mFilter->GetCoord();
495 tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
498 fileOpen << "Id" << "\t" << "Value" << "\t" ;
499 fileOpen << "x(vox)" << "\t" << "y(vox)" << "\t";
500 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
501 fileOpen << "z(vox)" << "\t";
502 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
503 fileOpen << "t" << "\t";
504 fileOpen << "x(mm)" << "\t" << "y(mm)" << "\t";
505 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
506 fileOpen << "z(mm)" << "\t";
507 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
508 fileOpen << "t" << "\t";
511 while (i<arrX->GetNumberOfTuples()) {
512 fileOpen << i << "\t" << arrY->GetTuple(i)[0] << "\t" ;
514 coords->GetTuple(i, tuple);
515 for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
516 fileOpen << tuple[j] << "\t" ;
519 while (j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && j<3) {
520 fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[j] << "\t" ;
523 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
524 fileOpen << tuple[3] << "\t" ;
533 QApplication::restoreOverrideCursor();
535 QString error = fileformat.c_str();
536 error += " format unknown !!!\n";
537 QMessageBox::information(this,tr("Saving Problem"),error);
542 //------------------------------------------------------------------------------
545 //------------------------------------------------------------------------------
546 void vvToolProfile::DeleteLine(int slicer)
548 if (!mPoint1Selected && !mPoint2Selected)
551 if(mCurrentSlicerManager) {
552 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
553 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]);
557 //------------------------------------------------------------------------------
560 //------------------------------------------------------------------------------
561 void vvToolProfile::DisplayLine(int slicer)
563 if (!mPoint1Selected && !mPoint2Selected)
566 if(mCurrentSlicerManager) {
567 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
568 if (std::min(mPoint1[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()],mPoint2[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]) <= mCurrentSlicerManager->GetSlicer(slicer)->GetSlice() && std::max(mPoint1[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()],mPoint2[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]) >= mCurrentSlicerManager->GetSlicer(slicer)->GetSlice()) {
569 vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
571 for (int j=0; j<6; ++j) {
572 extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
574 extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] = mCurrentSlicerManager->GetSlicer(slicer)->GetImageActor()->GetBounds()[ mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()*2 ]-fabs(mCurrentSlicerManager->GetSlicer(slicer)->GetInput()->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]);
575 extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()+1] = mCurrentSlicerManager->GetSlicer(slicer)->GetImageActor()->GetBounds()[ mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()*2+1 ]+fabs(mCurrentSlicerManager->GetSlicer(slicer)->GetInput()->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]);
576 clippingBox->SetBounds(extent);
578 vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
579 clipper->SetClipFunction(clippingBox);
580 #if VTK_MAJOR_VERSION <= 5
581 clipper->SetInput(mLinesPolyData);
583 clipper->SetInputData(mLinesPolyData);
585 clipper->InsideOutOff();
587 vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
588 #if VTK_MAJOR_VERSION <= 5
589 lineMapper->SetInput(clipper->GetOutput());
591 lineMapper->SetInputData(clipper->GetOutput());
594 mLineActors[slicer]->SetMapper(lineMapper);
595 mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
597 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
602 //------------------------------------------------------------------------------
605 //------------------------------------------------------------------------------
606 void vvToolProfile::InitializeLine()
608 if(mCurrentSlicerManager) {
610 mLinesPolyData = vtkSmartPointer<vtkPolyData>::New();
612 vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
614 pos[0] = pos[1] = pos[2] = pos[3] = 0;
615 pts->InsertNextPoint(pos);
616 pts->InsertNextPoint(pos);
617 mLinesPolyData->SetPoints(pts);
619 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
620 vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
621 line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts)
622 line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts)
623 lines->InsertNextCell(line);
624 mLinesPolyData->SetLines(lines);
626 unsigned char red[3] = { 255, 0, 0 };
627 vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
628 colors->SetNumberOfComponents(3);
629 colors->InsertNextTupleValue(red);
630 mLinesPolyData->GetCellData()->SetScalars(colors);
632 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
633 mLineActors.push_back(vtkSmartPointer<vtkActor>::New());
637 //------------------------------------------------------------------------------
640 //------------------------------------------------------------------------------
641 void vvToolProfile::SetPoints()
643 if (!mPoint1Selected && !mPoint2Selected)
646 if(mCurrentSlicerManager) {
647 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
649 pos = new double [4];
650 pos[0] = pos[1] = pos[2] = pos[3] = 0;
654 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
657 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
658 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
662 p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
663 p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
664 p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
667 p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
668 p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
669 p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
672 vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
678 //------------------------------------------------------------------------------