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"
32 #include <vtkImageActor.h>
33 #include <vtkCamera.h>
34 #include <vtkImageClip.h>
35 #include <vtkRenderWindow.h>
36 #include <vtkChartXY.h>
38 #include <vtkRendererCollection.h>
39 #include <vtkRenderer.h>
42 #include <vtkCellArray.h>
43 #include <vtkCellData.h>
44 #include <vtkPolyDataMapper.h>
45 #include <vtkProperty.h>
47 #include <vtkInformation.h>
49 //------------------------------------------------------------------------------
50 // Create the tool and automagically (I like this word) insert it in
51 // the main window menu.
52 ADD_TOOL(vvToolProfile);
53 //------------------------------------------------------------------------------
56 //------------------------------------------------------------------------------
57 void vvToolProfile::Initialize()
59 SetToolName("Profile");
60 SetToolMenuName("Intensity Profile");
61 SetToolIconFilename(":/common/icons/profile.png");
62 SetToolTip("Display the intensity profile between 2 points of the image.");
63 SetToolExperimental(false);
65 //------------------------------------------------------------------------------
68 //------------------------------------------------------------------------------
69 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
70 :vvToolWidgetBase(parent,f),
71 vvToolBase<vvToolProfile>(parent),
75 Ui_vvToolProfile::setupUi(mToolWidget);
77 QShortcut *shortcutPoint1 = new QShortcut(QKeySequence("Ctrl+1"), parent);
78 shortcutPoint1->setContext(Qt::ApplicationShortcut);
79 QObject::connect(shortcutPoint1, SIGNAL(activated()), this, SLOT(selectPoint1()));
80 QShortcut *shortcutPoint2 = new QShortcut(QKeySequence("Ctrl+2"), parent);
81 shortcutPoint2->setContext(Qt::ApplicationShortcut);
82 QObject::connect(shortcutPoint2, SIGNAL(activated()), this, SLOT(selectPoint2()));
84 // Connect signals & slots
85 connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1()));
86 connect(mSelectPoint2Button, SIGNAL(clicked()), this, SLOT(selectPoint2()));
87 connect(mCancelPointsButton, SIGNAL(clicked()), this, SLOT(cancelPoints()));
88 connect(mSaveProfileButton, SIGNAL(clicked()), this, SLOT(SaveAs()));
90 // Initialize some widget
91 ProfileWidget->hide();
95 mPoint1Selected = false;
96 mPoint2Selected = false;
98 mView = vtkSmartPointer<vtkContextView>::New();
99 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
100 chart->SetAutoSize(false);
101 chart->SetRenderEmpty(true);
102 mView->GetScene()->AddItem(chart);
103 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
104 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
105 ProfileWidget->show();
108 mFilter = clitk::ProfileImageGenericFilter::New();
110 // Set how many inputs are needed for this tool
111 AddInputSelector("Select one image", mFilter);
113 //------------------------------------------------------------------------------
116 //------------------------------------------------------------------------------
117 vvToolProfile::~vvToolProfile()
122 //------------------------------------------------------------------------------
125 //------------------------------------------------------------------------------
126 void vvToolProfile::selectPoint1()
128 QString position = "";
130 if(mCurrentSlicerManager) {
131 cout << mCurrentSlicerManager->GetSelectedSlicer() << endl;
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 vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
270 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
271 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
272 arrX = mFilter->GetArrayX();
273 arrY = mFilter->GetArrayY();
274 arrX->SetName("Voxel");
275 arrY->SetName("Intensity");
276 table->AddColumn(arrX);
277 table->AddColumn(arrY);
279 mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
281 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
282 chart->SetAutoSize(true);
283 mView->GetScene()->ClearItems();
284 mView->GetScene()->AddItem(chart);
285 vtkPlot *line = chart->AddPlot(vtkChart::LINE);
286 #if VTK_MAJOR_VERSION <= 5
287 line->SetInput(table, 0, 1);
289 line->SetInputData(table, 0, 1);
291 line->SetColor(0, 255, 0, 255);
294 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
295 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
296 ProfileWidget->show();
298 QApplication::restoreOverrideCursor();
300 //------------------------------------------------------------------------------
303 //------------------------------------------------------------------------------
304 void vvToolProfile::cancelPoints()
307 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
309 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
310 ProfileWidget->hide();
311 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
312 chart->SetAutoSize(false);
313 chart->SetRenderEmpty(true);
314 mView->GetScene()->ClearItems();
315 mView->GetScene()->AddItem(chart);
316 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
317 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
318 ProfileWidget->show();
320 QString position = "";
321 mPosPoint1Label->setText(position);
322 mPosPoint2Label->setText(position);
323 mPoint1Selected = false;
324 mPoint2Selected = false;
325 mSaveProfileButton->setEnabled(false);
327 mCurrentSlicerManager->Render();
329 //------------------------------------------------------------------------------
332 //------------------------------------------------------------------------------
333 void vvToolProfile::RemoveVTKObjects()
335 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
336 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
340 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
342 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
345 if (mCurrentSlicerManager)
346 mCurrentSlicerManager->Render();
348 //------------------------------------------------------------------------------
351 //------------------------------------------------------------------------------
352 bool vvToolProfile::close()
354 //RemoveVTKObjects();
356 connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
357 return vvToolWidgetBase::close();
359 //------------------------------------------------------------------------------
362 //------------------------------------------------------------------------------
363 void vvToolProfile::closeEvent(QCloseEvent *event)
368 //------------------------------------------------------------------------------
371 //------------------------------------------------------------------------------
372 void vvToolProfile::reject()
374 // DD("vvToolProfile::reject");
376 return vvToolWidgetBase::reject();
378 //------------------------------------------------------------------------------
381 //------------------------------------------------------------------------------
382 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
384 mCurrentSlicerManager = m;
386 mPoint1 = new int[4];
387 mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
388 mPoint2 = new int[4];
389 mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
391 mSaveProfileButton->setEnabled(false);
392 mTextFileName = "Profile.txt";
395 disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
397 //------------------------------------------------------------------------------
400 //------------------------------------------------------------------------------
401 void vvToolProfile::GetArgsInfoFromGUI()
404 /* //KEEP THIS FOR READING GGO FROM FILE
406 std::string a = "toto";
407 char * const* argv = new char*;
409 struct cmdline_parser_params p;
410 p.check_required = 0;
411 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
414 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
416 mArgsInfo.verbose_flag = false;
418 mArgsInfo.point1_arg = mPoint1;
419 mArgsInfo.point2_arg = mPoint2;
420 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
421 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
423 // Required (even if not used)
424 mArgsInfo.input_given = 0;
425 mArgsInfo.output_given = 0;
427 mArgsInfo.input_arg = new char;
428 mArgsInfo.output_arg = new char;
432 //------------------------------------------------------------------------------
435 //------------------------------------------------------------------------------
436 void vvToolProfile::apply()
440 //------------------------------------------------------------------------------
443 //------------------------------------------------------------------------------
444 void vvToolProfile::SaveAs()
446 QStringList OutputListeFormat;
447 OutputListeFormat.clear();
448 OutputListeFormat.push_back(".txt");
450 QString Extensions = "AllFiles(*.*)";
451 for (int i = 0; i < OutputListeFormat.count(); i++) {
452 Extensions += ";;Text File ( *";
453 Extensions += OutputListeFormat[i];
456 QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions);
457 if (!fileName.isEmpty()) {
458 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
459 QString fileQFormat = fileformat.c_str();
460 if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) {
461 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
462 std::string action = "Saving";
463 vvProgressDialog progress("Saving "+fileName.toStdString());
464 qApp->processEvents();
466 if (!mCurrentSlicerManager || !isPointsSelected()) {
472 mTextFileName = fileName.toStdString();
473 if (fileQFormat.isEmpty())
474 mTextFileName += ".txt";
475 ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
478 cerr << "Error during saving" << endl;
479 QApplication::restoreOverrideCursor();
484 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
485 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
486 vtkSmartPointer<vtkFloatArray> coords = vtkSmartPointer<vtkFloatArray>::New();
487 arrX = mFilter->GetArrayX();
488 arrY = mFilter->GetArrayY();
489 coords = mFilter->GetCoord();
491 tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
494 fileOpen << "Id" << "\t" << "Value" << "\t" ;
495 fileOpen << "x(vox)" << "\t" << "y(vox)" << "\t";
496 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
497 fileOpen << "z(vox)" << "\t";
498 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
499 fileOpen << "t" << "\t";
500 fileOpen << "x(mm)" << "\t" << "y(mm)" << "\t";
501 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
502 fileOpen << "z(mm)" << "\t";
503 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
504 fileOpen << "t" << "\t";
507 while (i<arrX->GetNumberOfTuples()) {
508 fileOpen << arrX->GetTuple(i)[0] << "\t" << arrY->GetTuple(i)[0] << "\t" ;
510 coords->GetTuple(i, tuple);
511 for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
512 fileOpen << tuple[j] << "\t" ;
515 while (j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && j<3) {
516 fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[j] << "\t" ;
519 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
520 fileOpen << tuple[3] << "\t" ;
529 QApplication::restoreOverrideCursor();
531 QString error = fileformat.c_str();
532 error += " format unknown !!!\n";
533 QMessageBox::information(this,tr("Saving Problem"),error);
538 //------------------------------------------------------------------------------
541 //------------------------------------------------------------------------------
542 void vvToolProfile::DeleteLine(int slicer)
544 if (!mPoint1Selected && !mPoint2Selected)
547 if(mCurrentSlicerManager) {
548 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
549 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]);
553 //------------------------------------------------------------------------------
556 //------------------------------------------------------------------------------
557 void vvToolProfile::DisplayLine(int slicer)
559 if (!mPoint1Selected && !mPoint2Selected)
562 if(mCurrentSlicerManager) {
563 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
564 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()) {
565 vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
567 for (int j=0; j<6; ++j) {
568 extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
570 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()]);
571 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()]);
572 clippingBox->SetBounds(extent);
574 vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
575 clipper->SetClipFunction(clippingBox);
576 #if VTK_MAJOR_VERSION <= 5
577 clipper->SetInput(mLinesPolyData);
579 clipper->SetInputData(mLinesPolyData);
581 clipper->InsideOutOff();
583 vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
584 #if VTK_MAJOR_VERSION <= 5
585 lineMapper->SetInput(clipper->GetOutput());
587 lineMapper->SetInputData(clipper->GetOutput());
590 mLineActors[slicer]->SetMapper(lineMapper);
591 mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
593 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
598 //------------------------------------------------------------------------------
601 //------------------------------------------------------------------------------
602 void vvToolProfile::InitializeLine()
604 if(mCurrentSlicerManager) {
606 mLinesPolyData = vtkSmartPointer<vtkPolyData>::New();
608 vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
610 pos[0] = pos[1] = pos[2] = pos[3] = 0;
611 pts->InsertNextPoint(pos);
612 pts->InsertNextPoint(pos);
613 mLinesPolyData->SetPoints(pts);
615 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
616 vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
617 line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts)
618 line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts)
619 lines->InsertNextCell(line);
620 mLinesPolyData->SetLines(lines);
622 unsigned char red[3] = { 255, 0, 0 };
623 vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
624 colors->SetNumberOfComponents(3);
625 colors->InsertNextTupleValue(red);
626 mLinesPolyData->GetCellData()->SetScalars(colors);
628 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
629 mLineActors.push_back(vtkSmartPointer<vtkActor>::New());
633 //------------------------------------------------------------------------------
636 //------------------------------------------------------------------------------
637 void vvToolProfile::SetPoints()
639 if (!mPoint1Selected && !mPoint2Selected)
642 if(mCurrentSlicerManager) {
643 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
645 pos = new double [4];
646 pos[0] = pos[1] = pos[2] = pos[3] = 0;
650 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
653 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
654 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
658 p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
659 p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
660 p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
663 p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
664 p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
665 p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
668 vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
674 //------------------------------------------------------------------------------