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>
51 # include "vvOSXHelper.h"
54 //------------------------------------------------------------------------------
55 // Create the tool and automagically (I like this word) insert it in
56 // the main window menu.
57 ADD_TOOL(vvToolProfile);
58 //------------------------------------------------------------------------------
61 //------------------------------------------------------------------------------
62 void vvToolProfile::Initialize()
64 SetToolName("Profile");
65 SetToolMenuName("Intensity Profile");
66 SetToolIconFilename(":/common/icons/profile.png");
67 SetToolTip("Display the intensity profile between 2 points of the image.");
68 SetToolExperimental(false);
70 //------------------------------------------------------------------------------
73 //------------------------------------------------------------------------------
74 vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f)
75 :vvToolWidgetBase(parent,f),
76 vvToolBase<vvToolProfile>(parent),
80 Ui_vvToolProfile::setupUi(mToolWidget);
82 QShortcut *shortcutPoint1 = new QShortcut(QKeySequence("Ctrl+1"), parent);
83 shortcutPoint1->setContext(Qt::ApplicationShortcut);
84 QObject::connect(shortcutPoint1, SIGNAL(activated()), this, SLOT(selectPoint1()));
85 QShortcut *shortcutPoint2 = new QShortcut(QKeySequence("Ctrl+2"), parent);
86 shortcutPoint2->setContext(Qt::ApplicationShortcut);
87 QObject::connect(shortcutPoint2, SIGNAL(activated()), this, SLOT(selectPoint2()));
89 // Connect signals & slots
90 connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1()));
91 connect(mSelectPoint2Button, SIGNAL(clicked()), this, SLOT(selectPoint2()));
92 connect(mCancelPointsButton, SIGNAL(clicked()), this, SLOT(cancelPoints()));
93 connect(mSaveProfileButton, SIGNAL(clicked()), this, SLOT(SaveAs()));
95 // Initialize some widget
96 ProfileWidget->hide();
100 mPoint1Selected = false;
101 mPoint2Selected = false;
103 mView = vtkSmartPointer<vtkContextView>::New();
104 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
105 chart->SetAutoSize(false);
106 chart->SetRenderEmpty(true);
107 mView->GetScene()->AddItem(chart);
108 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
109 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
110 ProfileWidget->show();
113 disableGLHiDPI(ProfileWidget->winId());
117 mFilter = clitk::ProfileImageGenericFilter::New();
119 // Set how many inputs are needed for this tool
120 AddInputSelector("Select one image", mFilter);
122 //------------------------------------------------------------------------------
125 //------------------------------------------------------------------------------
126 vvToolProfile::~vvToolProfile()
131 //------------------------------------------------------------------------------
134 //------------------------------------------------------------------------------
135 void vvToolProfile::selectPoint1()
137 QString position = "";
139 if(mCurrentSlicerManager) {
140 if (mPoint1Selected) {
141 ProfileWidget->hide();
142 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
143 chart->SetAutoSize(false);
144 chart->SetRenderEmpty(true);
145 mView->GetScene()->ClearItems();
146 mView->GetScene()->AddItem(chart);
147 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
148 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
149 ProfileWidget->show();
150 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
153 mPoint1Selected = false;
155 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
157 pos = new double [4];
158 pos[0] = pos[1] = pos[2] = pos[3] = 0;
161 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
162 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
163 mPoint1[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i]);
164 pos[i] = mPoint1[i]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i]; //Ensure to be at the center of the voxel
165 position += QString::number(mPoint1[i],'f',0) + " ";
168 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
169 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
171 position += QString::number(mPoint1[3],'f',0) + " ";
173 mPoint1Selected = true;
174 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
175 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
176 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
177 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P1");
180 mPosPoint1Label->setText(position);
182 mCurrentSlicerManager->Render();
184 //------------------------------------------------------------------------------
187 //------------------------------------------------------------------------------
188 void vvToolProfile::selectPoint2()
190 QString position = "";
192 if(mCurrentSlicerManager) {
193 if (mPoint2Selected) {
194 ProfileWidget->hide();
195 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
196 chart->SetAutoSize(false);
197 chart->SetRenderEmpty(true);
198 mView->GetScene()->ClearItems();
199 mView->GetScene()->AddItem(chart);
200 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
201 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
202 ProfileWidget->show();
203 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
206 mPoint2Selected = false;
208 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
210 pos = new double [4];
211 pos[0] = pos[1] = pos[2] = pos[3] = 0;;
214 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() &&i<3) {
215 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
216 mPoint2[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i]);
217 pos[i] = mPoint2[i]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i]; //Ensure to be at the center of the voxel
218 position += QString::number(mPoint2[i],'f',0) + " ";
221 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
222 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
224 position += QString::number(mPoint2[3],'f',0) + " ";
226 mPoint2Selected = true;
227 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
228 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
229 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
230 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2");
233 mPosPoint2Label->setText(position);
235 mCurrentSlicerManager->Render();
237 //------------------------------------------------------------------------------
239 //------------------------------------------------------------------------------
240 bool vvToolProfile::isPointsSelected()
242 if (mPoint1Selected && mPoint2Selected) {
243 mSaveProfileButton->setEnabled(true);
246 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
248 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
249 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
251 mCurrentSlicerManager->Render();
254 mSaveProfileButton->setEnabled(false);
255 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
256 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
257 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
258 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
262 return (mPoint1Selected && mPoint2Selected);
264 //------------------------------------------------------------------------------
267 //------------------------------------------------------------------------------
268 void vvToolProfile::computeProfile()
270 if (!mCurrentSlicerManager) close();
271 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
272 GetArgsInfoFromGUI();
273 ProfileWidget->hide();
276 mFilter->SetInputVVImage(mCurrentImage);
277 mFilter->SetArgsInfo(mArgsInfo);
280 //Creation of the XY chart
281 vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
282 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
283 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
284 arrX = mFilter->GetArrayX();
285 arrY = mFilter->GetArrayY();
286 arrX->SetName("Distance (mm)");
287 arrY->SetName("Intensity");
289 table->AddColumn(arrX);
290 table->AddColumn(arrY);
292 mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
294 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
295 chart->SetAutoSize(true);
296 mView->GetScene()->ClearItems();
297 mView->GetScene()->AddItem(chart);
298 vtkPlot *line = chart->AddPlot(vtkChart::LINE);
299 #if VTK_MAJOR_VERSION <= 5
300 line->SetInput(table, 0, 1);
302 line->SetInputData(table, 0, 1);
304 line->SetColor(0, 255, 0, 255);
306 chart->GetAxis(vtkAxis::LEFT)->SetTitle("Intensity");
307 chart->GetAxis(vtkAxis::BOTTOM)->SetTitle("Distance (mm)");
309 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
310 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
311 ProfileWidget->show();
313 QApplication::restoreOverrideCursor();
315 //------------------------------------------------------------------------------
318 //------------------------------------------------------------------------------
319 void vvToolProfile::cancelPoints()
322 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
324 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
325 ProfileWidget->hide();
326 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
327 chart->SetAutoSize(false);
328 chart->SetRenderEmpty(true);
329 mView->GetScene()->ClearItems();
330 mView->GetScene()->AddItem(chart);
331 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
332 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
333 ProfileWidget->show();
335 QString position = "";
336 mPosPoint1Label->setText(position);
337 mPosPoint2Label->setText(position);
338 mPoint1Selected = false;
339 mPoint2Selected = false;
340 mSaveProfileButton->setEnabled(false);
342 mCurrentSlicerManager->Render();
344 //------------------------------------------------------------------------------
347 //------------------------------------------------------------------------------
348 void vvToolProfile::RemoveVTKObjects()
350 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
351 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
355 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
357 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
360 if (mCurrentSlicerManager)
361 mCurrentSlicerManager->Render();
363 //------------------------------------------------------------------------------
366 //------------------------------------------------------------------------------
367 bool vvToolProfile::close()
369 //RemoveVTKObjects();
371 connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
372 return vvToolWidgetBase::close();
374 //------------------------------------------------------------------------------
377 //------------------------------------------------------------------------------
378 void vvToolProfile::closeEvent(QCloseEvent *event)
383 //------------------------------------------------------------------------------
386 //------------------------------------------------------------------------------
387 void vvToolProfile::reject()
389 // DD("vvToolProfile::reject");
391 return vvToolWidgetBase::reject();
393 //------------------------------------------------------------------------------
396 //------------------------------------------------------------------------------
397 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
399 mCurrentSlicerManager = m;
401 mPoint1 = new double[4];
402 mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
403 mPoint2 = new double[4];
404 mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
406 mSaveProfileButton->setEnabled(false);
407 mTextFileName = "Profile.txt";
410 disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
412 //------------------------------------------------------------------------------
415 //------------------------------------------------------------------------------
416 void vvToolProfile::GetArgsInfoFromGUI()
419 /* //KEEP THIS FOR READING GGO FROM FILE
421 std::string a = "toto";
422 char * const* argv = new char*;
424 struct cmdline_parser_params p;
425 p.check_required = 0;
426 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
429 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
431 mArgsInfo.verbose_flag = false;
433 mArgsInfo.point1_arg = mPoint1;
434 mArgsInfo.point2_arg = mPoint2;
435 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
436 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
438 // Required (even if not used)
439 mArgsInfo.input_given = 0;
440 mArgsInfo.output_given = 0;
442 mArgsInfo.input_arg = new char;
443 mArgsInfo.output_arg = new char;
447 //------------------------------------------------------------------------------
450 //------------------------------------------------------------------------------
451 void vvToolProfile::apply()
455 //------------------------------------------------------------------------------
458 //------------------------------------------------------------------------------
459 void vvToolProfile::SaveAs()
461 QStringList OutputListeFormat;
462 OutputListeFormat.clear();
463 OutputListeFormat.push_back(".txt");
465 QString Extensions = "AllFiles(*.*)";
466 for (int i = 0; i < OutputListeFormat.count(); i++) {
467 Extensions += ";;Text File ( *";
468 Extensions += OutputListeFormat[i];
471 QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions);
472 if (!fileName.isEmpty()) {
473 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
474 QString fileQFormat = fileformat.c_str();
475 if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) {
476 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
477 std::string action = "Saving";
478 vvProgressDialog progress("Saving "+fileName.toStdString());
479 qApp->processEvents();
481 if (!mCurrentSlicerManager || !isPointsSelected()) {
487 mTextFileName = fileName.toStdString();
488 if (fileQFormat.isEmpty())
489 mTextFileName += ".txt";
490 ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
493 cerr << "Error during saving" << endl;
494 QApplication::restoreOverrideCursor();
499 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
500 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
501 vtkSmartPointer<vtkFloatArray> coords = vtkSmartPointer<vtkFloatArray>::New();
502 arrX = mFilter->GetArrayX();
503 arrY = mFilter->GetArrayY();
504 coords = mFilter->GetCoord();
506 tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
508 fileOpen << "The Bresenham algorithm is used to travel along the line. Values represent the center of each crossed voxel (in voxel and mm)" << endl;
509 fileOpen << "Id" << "\t" << "Value" << "\t" ;
510 fileOpen << "x(vox)" << "\t" << "y(vox)" << "\t";
511 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
512 fileOpen << "z(vox)" << "\t";
513 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
514 fileOpen << "t" << "\t";
515 fileOpen << "x(mm)" << "\t" << "y(mm)" << "\t";
516 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
517 fileOpen << "z(mm)" << "\t";
518 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
519 fileOpen << "t" << "\t";
522 while (i<arrX->GetNumberOfTuples()) {
523 fileOpen << i << "\t" << arrY->GetTuple(i)[0] << "\t" ;
525 coords->GetTuple(i, tuple);
526 for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
527 fileOpen << tuple[j] << "\t" ;
530 while (j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && j<3) {
531 fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[j] << "\t" ;
534 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
535 fileOpen << tuple[3] << "\t" ;
544 QApplication::restoreOverrideCursor();
546 QString error = fileformat.c_str();
547 error += " format unknown !!!\n";
548 QMessageBox::information(this,tr("Saving Problem"),error);
553 //------------------------------------------------------------------------------
556 //------------------------------------------------------------------------------
557 void vvToolProfile::DeleteLine(int slicer)
559 if (!mPoint1Selected && !mPoint2Selected)
562 if(mCurrentSlicerManager) {
563 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
564 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]);
568 //------------------------------------------------------------------------------
571 //------------------------------------------------------------------------------
572 void vvToolProfile::DisplayLine(int slicer)
574 if (!mPoint1Selected && !mPoint2Selected)
577 if(mCurrentSlicerManager) {
578 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
579 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()) {
580 vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
582 for (int j=0; j<6; ++j) {
583 extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
585 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()]);
586 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()]);
587 clippingBox->SetBounds(extent);
589 vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
590 clipper->SetClipFunction(clippingBox);
591 #if VTK_MAJOR_VERSION <= 5
592 clipper->SetInput(mLinesPolyData);
594 clipper->SetInputData(mLinesPolyData);
596 clipper->InsideOutOff();
598 vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
599 #if VTK_MAJOR_VERSION <= 5
600 lineMapper->SetInput(clipper->GetOutput());
602 lineMapper->SetInputData(clipper->GetOutput());
605 mLineActors[slicer]->SetMapper(lineMapper);
606 mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
608 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
613 //------------------------------------------------------------------------------
616 //------------------------------------------------------------------------------
617 void vvToolProfile::InitializeLine()
619 if(mCurrentSlicerManager) {
621 mLinesPolyData = vtkSmartPointer<vtkPolyData>::New();
623 vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
625 pos[0] = pos[1] = pos[2] = pos[3] = 0;
626 pts->InsertNextPoint(pos);
627 pts->InsertNextPoint(pos);
628 mLinesPolyData->SetPoints(pts);
630 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
631 vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
632 line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts)
633 line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts)
634 lines->InsertNextCell(line);
635 mLinesPolyData->SetLines(lines);
637 unsigned char red[3] = { 255, 0, 0 };
638 vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
639 colors->SetNumberOfComponents(3);
640 colors->InsertNextTupleValue(red);
641 mLinesPolyData->GetCellData()->SetScalars(colors);
643 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
644 mLineActors.push_back(vtkSmartPointer<vtkActor>::New());
648 //------------------------------------------------------------------------------
651 //------------------------------------------------------------------------------
652 void vvToolProfile::SetPoints()
654 if (!mPoint1Selected && !mPoint2Selected)
657 if(mCurrentSlicerManager) {
658 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
660 pos = new double [4];
661 pos[0] = pos[1] = pos[2] = pos[3] = 0;
665 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
668 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
669 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
673 p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
674 p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
675 p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
678 p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
679 p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
680 p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
683 vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
689 //------------------------------------------------------------------------------