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>
23 #include "vvToolProfile.h"
24 #include "vvProgressDialog.h"
25 #include "vvSlicerManager.h"
27 #include "vvToolInputSelectorWidget.h"
30 #include <vtkImageActor.h>
31 #include <vtkCamera.h>
32 #include <vtkImageClip.h>
33 #include <vtkRenderWindow.h>
34 #include <vtkChartXY.h>
36 #include <vtkRendererCollection.h>
37 #include <vtkRenderer.h>
40 #include <vtkCellArray.h>
41 #include <vtkCellData.h>
42 #include <vtkPolyDataMapper.h>
43 #include <vtkProperty.h>
45 #include <vtkInformation.h>
47 //------------------------------------------------------------------------------
48 // Create the tool and automagically (I like this word) insert it in
49 // the main window menu.
50 ADD_TOOL(vvToolProfile);
51 //------------------------------------------------------------------------------
54 //------------------------------------------------------------------------------
55 void vvToolProfile::Initialize()
57 SetToolName("Profile");
58 SetToolMenuName("Intensity Profile");
59 SetToolIconFilename(":/common/icons/profile.png");
60 SetToolTip("Display the intensity profile between 2 points of the image.");
61 SetToolExperimental(false);
63 //------------------------------------------------------------------------------
66 //------------------------------------------------------------------------------
67 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
68 :vvToolWidgetBase(parent,f),
69 vvToolBase<vvToolProfile>(parent),
73 Ui_vvToolProfile::setupUi(mToolWidget);
75 QShortcut *shortcutPoint1 = new QShortcut(QKeySequence("Ctrl+1"), parent);
76 shortcutPoint1->setContext(Qt::ApplicationShortcut);
77 QObject::connect(shortcutPoint1, SIGNAL(activated()), this, SLOT(selectPoint1()));
78 QShortcut *shortcutPoint2 = new QShortcut(QKeySequence("Ctrl+2"), parent);
79 shortcutPoint2->setContext(Qt::ApplicationShortcut);
80 QObject::connect(shortcutPoint2, SIGNAL(activated()), this, SLOT(selectPoint2()));
82 // Connect signals & slots
83 connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1()));
84 connect(mSelectPoint2Button, SIGNAL(clicked()), this, SLOT(selectPoint2()));
85 connect(mCancelPointsButton, SIGNAL(clicked()), this, SLOT(cancelPoints()));
86 connect(mSaveProfileButton, SIGNAL(clicked()), this, SLOT(SaveAs()));
88 // Initialize some widget
89 ProfileWidget->hide();
93 mPoint1Selected = false;
94 mPoint2Selected = false;
96 mView = vtkSmartPointer<vtkContextView>::New();
97 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
98 chart->SetAutoSize(false);
99 chart->SetRenderEmpty(true);
100 mView->GetScene()->AddItem(chart);
101 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
102 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
103 ProfileWidget->show();
106 mFilter = clitk::ProfileImageGenericFilter::New();
108 // Set how many inputs are needed for this tool
109 AddInputSelector("Select one image", mFilter);
111 //------------------------------------------------------------------------------
114 //------------------------------------------------------------------------------
115 vvToolProfile::~vvToolProfile()
120 //------------------------------------------------------------------------------
123 //------------------------------------------------------------------------------
124 void vvToolProfile::selectPoint1()
126 QString position = "";
128 if (mPoint1Selected) {
129 ProfileWidget->hide();
130 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
131 chart->SetAutoSize(false);
132 chart->SetRenderEmpty(true);
133 mView->GetScene()->ClearItems();
134 mView->GetScene()->AddItem(chart);
135 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
136 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
137 ProfileWidget->show();
138 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
141 mPoint1Selected = false;
142 if(mCurrentSlicerManager) {
143 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
146 pos = new double [4];
147 pos[0] = pos[1] = pos[2] = pos[3] = 0;
148 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
151 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
152 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
153 index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
154 position += QString::number(pos[i],'f',1) + " ";
155 mPoint1[i] = index[i];
158 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
159 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
160 index[3] = (int)pos[3];
161 position += QString::number(pos[3],'f',1) + " ";
162 mPoint1[3] = index[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 (mPoint2Selected) {
184 ProfileWidget->hide();
185 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
186 chart->SetAutoSize(false);
187 chart->SetRenderEmpty(true);
188 mView->GetScene()->ClearItems();
189 mView->GetScene()->AddItem(chart);
190 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
191 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
192 ProfileWidget->show();
193 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
196 mPoint2Selected = false;
197 if(mCurrentSlicerManager) {
198 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
201 pos = new double [4];
202 pos[0] = pos[1] = pos[2] = pos[3] = 0;;
203 index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
206 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() &&i<3) {
207 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
208 index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i];
209 position += QString::number(pos[i],'f',1) + " ";
210 mPoint2[i] = index[i];
213 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
214 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
215 index[3] = (int)pos[3];
216 position += QString::number(pos[3],'f',1) + " ";
217 mPoint2[3] = index[3];
219 mPoint2Selected = true;
220 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
221 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
222 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
223 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2");
226 mPosPoint2Label->setText(position);
228 mCurrentSlicerManager->Render();
230 //------------------------------------------------------------------------------
232 //------------------------------------------------------------------------------
233 bool vvToolProfile::isPointsSelected()
235 if (mPoint1Selected && mPoint2Selected) {
236 mSaveProfileButton->setEnabled(true);
239 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
241 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
242 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
244 mCurrentSlicerManager->Render();
247 mSaveProfileButton->setEnabled(false);
248 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
249 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
250 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
251 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
255 return (mPoint1Selected && mPoint2Selected);
257 //------------------------------------------------------------------------------
260 //------------------------------------------------------------------------------
261 void vvToolProfile::computeProfile()
263 if (!mCurrentSlicerManager) close();
265 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
266 GetArgsInfoFromGUI();
267 ProfileWidget->hide();
270 mFilter->SetInputVVImage(mCurrentImage);
271 mFilter->SetArgsInfo(mArgsInfo);
273 //mImageLine = mFilter->GetOutputVVImage();
275 vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
276 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
277 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
278 arrX = mFilter->GetArrayX();
279 arrY = mFilter->GetArrayY();
280 arrX->SetName("Voxel");
281 arrY->SetName("Intensity");
282 table->AddColumn(arrX);
283 table->AddColumn(arrY);
285 mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
287 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
288 chart->SetAutoSize(true);
289 mView->GetScene()->ClearItems();
290 mView->GetScene()->AddItem(chart);
291 vtkPlot *line = chart->AddPlot(vtkChart::LINE);
292 #if VTK_MAJOR_VERSION <= 5
293 line->SetInput(table, 0, 1);
295 line->SetInputData(table, 0, 1);
297 line->SetColor(0, 255, 0, 255);
300 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
301 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
302 ProfileWidget->show();
304 QApplication::restoreOverrideCursor();
306 //------------------------------------------------------------------------------
309 //------------------------------------------------------------------------------
310 void vvToolProfile::cancelPoints()
313 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
315 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
316 ProfileWidget->hide();
317 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
318 chart->SetAutoSize(false);
319 chart->SetRenderEmpty(true);
320 mView->GetScene()->ClearItems();
321 mView->GetScene()->AddItem(chart);
322 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
323 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
324 ProfileWidget->show();
326 QString position = "";
327 mPosPoint1Label->setText(position);
328 mPosPoint2Label->setText(position);
329 mPoint1Selected = false;
330 mPoint2Selected = false;
331 mSaveProfileButton->setEnabled(false);
333 mCurrentSlicerManager->Render();
335 //------------------------------------------------------------------------------
338 //------------------------------------------------------------------------------
339 void vvToolProfile::RemoveVTKObjects()
341 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
342 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
346 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
348 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
351 if (mCurrentSlicerManager)
352 mCurrentSlicerManager->Render();
354 //------------------------------------------------------------------------------
357 //------------------------------------------------------------------------------
358 bool vvToolProfile::close()
360 //RemoveVTKObjects();
362 connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
363 return vvToolWidgetBase::close();
365 //------------------------------------------------------------------------------
368 //------------------------------------------------------------------------------
369 void vvToolProfile::closeEvent(QCloseEvent *event)
374 //------------------------------------------------------------------------------
377 //------------------------------------------------------------------------------
378 void vvToolProfile::reject()
380 // DD("vvToolProfile::reject");
382 return vvToolWidgetBase::reject();
384 //------------------------------------------------------------------------------
387 //------------------------------------------------------------------------------
388 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
390 mCurrentSlicerManager = m;
392 mPoint1 = new int[4];
393 mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
394 mPoint2 = new int[4];
395 mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
397 mSaveProfileButton->setEnabled(false);
398 mTextFileName = "Profile.txt";
401 disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
403 //------------------------------------------------------------------------------
406 //------------------------------------------------------------------------------
407 void vvToolProfile::GetArgsInfoFromGUI()
410 /* //KEEP THIS FOR READING GGO FROM FILE
412 std::string a = "toto";
413 char * const* argv = new char*;
415 struct cmdline_parser_params p;
416 p.check_required = 0;
417 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
420 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
422 mArgsInfo.verbose_flag = false;
424 mArgsInfo.point1_arg = mPoint1;
425 mArgsInfo.point2_arg = mPoint2;
426 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
427 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
429 // Required (even if not used)
430 mArgsInfo.input_given = 0;
431 mArgsInfo.output_given = 0;
433 mArgsInfo.input_arg = new char;
434 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 << arrX->GetTuple(i)[0] << "\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 vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
570 for (int j=0; j<6; ++j) {
571 extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
573 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()]);
574 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()]);
575 clippingBox->SetBounds(extent);
577 vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
578 clipper->SetClipFunction(clippingBox);
579 #if VTK_MAJOR_VERSION <= 5
580 clipper->SetInput(mLinesPolyData);
582 clipper->SetInputData(mLinesPolyData);
584 clipper->InsideOutOff();
586 vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
587 #if VTK_MAJOR_VERSION <= 5
588 lineMapper->SetInput(clipper->GetOutput());
590 lineMapper->SetInputData(clipper->GetOutput());
593 mLineActors[slicer]->SetMapper(lineMapper);
594 mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
596 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
600 //------------------------------------------------------------------------------
603 //------------------------------------------------------------------------------
604 void vvToolProfile::InitializeLine()
606 if(mCurrentSlicerManager) {
608 mLinesPolyData = vtkSmartPointer<vtkPolyData>::New();
610 vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
612 pos[0] = pos[1] = pos[2] = pos[3] = 0;
613 pts->InsertNextPoint(pos);
614 pts->InsertNextPoint(pos);
615 mLinesPolyData->SetPoints(pts);
617 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
618 vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
619 line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts)
620 line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts)
621 lines->InsertNextCell(line);
622 mLinesPolyData->SetLines(lines);
624 unsigned char red[3] = { 255, 0, 0 };
625 vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
626 colors->SetNumberOfComponents(3);
627 colors->InsertNextTupleValue(red);
628 mLinesPolyData->GetCellData()->SetScalars(colors);
630 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
631 mLineActors.push_back(vtkSmartPointer<vtkActor>::New());
635 //------------------------------------------------------------------------------
638 //------------------------------------------------------------------------------
639 void vvToolProfile::SetPoints()
641 if (!mPoint1Selected && !mPoint2Selected)
644 if(mCurrentSlicerManager) {
645 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
647 pos = new double [4];
648 pos[0] = pos[1] = pos[2] = pos[3] = 0;
652 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
655 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
656 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
660 p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
661 p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
662 p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
665 p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
666 p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
667 p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
670 vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
676 //------------------------------------------------------------------------------