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 mPoint1[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i]);
156 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
157 position += QString::number(mPoint1[i],'f',0) + " ";
160 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
161 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
163 position += QString::number(mPoint1[3],'f',0) + " ";
165 mPoint1Selected = true;
166 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
167 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
168 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
169 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P1");
172 mPosPoint1Label->setText(position);
174 mCurrentSlicerManager->Render();
176 //------------------------------------------------------------------------------
179 //------------------------------------------------------------------------------
180 void vvToolProfile::selectPoint2()
182 QString position = "";
184 if(mCurrentSlicerManager) {
185 if (mPoint2Selected) {
186 ProfileWidget->hide();
187 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
188 chart->SetAutoSize(false);
189 chart->SetRenderEmpty(true);
190 mView->GetScene()->ClearItems();
191 mView->GetScene()->AddItem(chart);
192 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
193 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
194 ProfileWidget->show();
195 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
198 mPoint2Selected = false;
200 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
202 pos = new double [4];
203 pos[0] = pos[1] = pos[2] = pos[3] = 0;;
206 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() &&i<3) {
207 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
208 mPoint2[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i]);
209 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
210 position += QString::number(mPoint2[i],'f',0) + " ";
213 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
214 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
216 position += QString::number(mPoint2[3],'f',0) + " ";
218 mPoint2Selected = true;
219 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
220 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
221 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
222 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2");
225 mPosPoint2Label->setText(position);
227 mCurrentSlicerManager->Render();
229 //------------------------------------------------------------------------------
231 //------------------------------------------------------------------------------
232 bool vvToolProfile::isPointsSelected()
234 if (mPoint1Selected && mPoint2Selected) {
235 mSaveProfileButton->setEnabled(true);
238 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
240 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
241 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
243 mCurrentSlicerManager->Render();
246 mSaveProfileButton->setEnabled(false);
247 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
248 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
249 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
250 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
254 return (mPoint1Selected && mPoint2Selected);
256 //------------------------------------------------------------------------------
259 //------------------------------------------------------------------------------
260 void vvToolProfile::computeProfile()
262 if (!mCurrentSlicerManager) close();
263 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
264 GetArgsInfoFromGUI();
265 ProfileWidget->hide();
268 mFilter->SetInputVVImage(mCurrentImage);
269 mFilter->SetArgsInfo(mArgsInfo);
272 //Creation of the XY chart
273 vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
274 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
275 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
276 arrX = mFilter->GetArrayX();
277 arrY = mFilter->GetArrayY();
278 arrX->SetName("Distance (mm)");
279 arrY->SetName("Intensity");
281 table->AddColumn(arrX);
282 table->AddColumn(arrY);
284 mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
286 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
287 chart->SetAutoSize(true);
288 mView->GetScene()->ClearItems();
289 mView->GetScene()->AddItem(chart);
290 vtkPlot *line = chart->AddPlot(vtkChart::LINE);
291 #if VTK_MAJOR_VERSION <= 5
292 line->SetInput(table, 0, 1);
294 line->SetInputData(table, 0, 1);
296 line->SetColor(0, 255, 0, 255);
298 chart->GetAxis(vtkAxis::LEFT)->SetTitle("Intensity");
299 chart->GetAxis(vtkAxis::BOTTOM)->SetTitle("Distance (mm)");
301 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
302 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
303 ProfileWidget->show();
305 QApplication::restoreOverrideCursor();
307 //------------------------------------------------------------------------------
310 //------------------------------------------------------------------------------
311 void vvToolProfile::cancelPoints()
314 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
316 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
317 ProfileWidget->hide();
318 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
319 chart->SetAutoSize(false);
320 chart->SetRenderEmpty(true);
321 mView->GetScene()->ClearItems();
322 mView->GetScene()->AddItem(chart);
323 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
324 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
325 ProfileWidget->show();
327 QString position = "";
328 mPosPoint1Label->setText(position);
329 mPosPoint2Label->setText(position);
330 mPoint1Selected = false;
331 mPoint2Selected = false;
332 mSaveProfileButton->setEnabled(false);
334 mCurrentSlicerManager->Render();
336 //------------------------------------------------------------------------------
339 //------------------------------------------------------------------------------
340 void vvToolProfile::RemoveVTKObjects()
342 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
343 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
347 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
349 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
352 if (mCurrentSlicerManager)
353 mCurrentSlicerManager->Render();
355 //------------------------------------------------------------------------------
358 //------------------------------------------------------------------------------
359 bool vvToolProfile::close()
361 //RemoveVTKObjects();
363 connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
364 return vvToolWidgetBase::close();
366 //------------------------------------------------------------------------------
369 //------------------------------------------------------------------------------
370 void vvToolProfile::closeEvent(QCloseEvent *event)
375 //------------------------------------------------------------------------------
378 //------------------------------------------------------------------------------
379 void vvToolProfile::reject()
381 // DD("vvToolProfile::reject");
383 return vvToolWidgetBase::reject();
385 //------------------------------------------------------------------------------
388 //------------------------------------------------------------------------------
389 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
391 mCurrentSlicerManager = m;
393 mPoint1 = new double[4];
394 mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
395 mPoint2 = new double[4];
396 mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
398 mSaveProfileButton->setEnabled(false);
399 mTextFileName = "Profile.txt";
402 disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
404 //------------------------------------------------------------------------------
407 //------------------------------------------------------------------------------
408 void vvToolProfile::GetArgsInfoFromGUI()
411 /* //KEEP THIS FOR READING GGO FROM FILE
413 std::string a = "toto";
414 char * const* argv = new char*;
416 struct cmdline_parser_params p;
417 p.check_required = 0;
418 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
421 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
423 mArgsInfo.verbose_flag = false;
425 mArgsInfo.point1_arg = mPoint1;
426 mArgsInfo.point2_arg = mPoint2;
427 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
428 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
430 // Required (even if not used)
431 mArgsInfo.input_given = 0;
432 mArgsInfo.output_given = 0;
434 mArgsInfo.input_arg = new char;
435 mArgsInfo.output_arg = new char;
439 //------------------------------------------------------------------------------
442 //------------------------------------------------------------------------------
443 void vvToolProfile::apply()
447 //------------------------------------------------------------------------------
450 //------------------------------------------------------------------------------
451 void vvToolProfile::SaveAs()
453 QStringList OutputListeFormat;
454 OutputListeFormat.clear();
455 OutputListeFormat.push_back(".txt");
457 QString Extensions = "AllFiles(*.*)";
458 for (int i = 0; i < OutputListeFormat.count(); i++) {
459 Extensions += ";;Text File ( *";
460 Extensions += OutputListeFormat[i];
463 QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions);
464 if (!fileName.isEmpty()) {
465 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
466 QString fileQFormat = fileformat.c_str();
467 if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) {
468 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
469 std::string action = "Saving";
470 vvProgressDialog progress("Saving "+fileName.toStdString());
471 qApp->processEvents();
473 if (!mCurrentSlicerManager || !isPointsSelected()) {
479 mTextFileName = fileName.toStdString();
480 if (fileQFormat.isEmpty())
481 mTextFileName += ".txt";
482 ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
485 cerr << "Error during saving" << endl;
486 QApplication::restoreOverrideCursor();
491 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
492 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
493 vtkSmartPointer<vtkFloatArray> coords = vtkSmartPointer<vtkFloatArray>::New();
494 arrX = mFilter->GetArrayX();
495 arrY = mFilter->GetArrayY();
496 coords = mFilter->GetCoord();
498 tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
500 fileOpen << "The Bresenham algorithm is used to travel along the line. Values represent the center of each crossed voxel (in voxel and mm)" << endl;
501 fileOpen << "Id" << "\t" << "Value" << "\t" ;
502 fileOpen << "x(vox)" << "\t" << "y(vox)" << "\t";
503 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
504 fileOpen << "z(vox)" << "\t";
505 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
506 fileOpen << "t" << "\t";
507 fileOpen << "x(mm)" << "\t" << "y(mm)" << "\t";
508 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
509 fileOpen << "z(mm)" << "\t";
510 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
511 fileOpen << "t" << "\t";
514 while (i<arrX->GetNumberOfTuples()) {
515 fileOpen << i << "\t" << arrY->GetTuple(i)[0] << "\t" ;
517 coords->GetTuple(i, tuple);
518 for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
519 fileOpen << tuple[j] << "\t" ;
522 while (j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && j<3) {
523 fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[j] << "\t" ;
526 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
527 fileOpen << tuple[3] << "\t" ;
536 QApplication::restoreOverrideCursor();
538 QString error = fileformat.c_str();
539 error += " format unknown !!!\n";
540 QMessageBox::information(this,tr("Saving Problem"),error);
545 //------------------------------------------------------------------------------
548 //------------------------------------------------------------------------------
549 void vvToolProfile::DeleteLine(int slicer)
551 if (!mPoint1Selected && !mPoint2Selected)
554 if(mCurrentSlicerManager) {
555 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
556 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]);
560 //------------------------------------------------------------------------------
563 //------------------------------------------------------------------------------
564 void vvToolProfile::DisplayLine(int slicer)
566 if (!mPoint1Selected && !mPoint2Selected)
569 if(mCurrentSlicerManager) {
570 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
571 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()) {
572 vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
574 for (int j=0; j<6; ++j) {
575 extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
577 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()]);
578 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()]);
579 clippingBox->SetBounds(extent);
581 vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
582 clipper->SetClipFunction(clippingBox);
583 #if VTK_MAJOR_VERSION <= 5
584 clipper->SetInput(mLinesPolyData);
586 clipper->SetInputData(mLinesPolyData);
588 clipper->InsideOutOff();
590 vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
591 #if VTK_MAJOR_VERSION <= 5
592 lineMapper->SetInput(clipper->GetOutput());
594 lineMapper->SetInputData(clipper->GetOutput());
597 mLineActors[slicer]->SetMapper(lineMapper);
598 mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
600 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
605 //------------------------------------------------------------------------------
608 //------------------------------------------------------------------------------
609 void vvToolProfile::InitializeLine()
611 if(mCurrentSlicerManager) {
613 mLinesPolyData = vtkSmartPointer<vtkPolyData>::New();
615 vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
617 pos[0] = pos[1] = pos[2] = pos[3] = 0;
618 pts->InsertNextPoint(pos);
619 pts->InsertNextPoint(pos);
620 mLinesPolyData->SetPoints(pts);
622 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
623 vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
624 line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts)
625 line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts)
626 lines->InsertNextCell(line);
627 mLinesPolyData->SetLines(lines);
629 unsigned char red[3] = { 255, 0, 0 };
630 vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
631 colors->SetNumberOfComponents(3);
632 colors->InsertNextTupleValue(red);
633 mLinesPolyData->GetCellData()->SetScalars(colors);
635 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
636 mLineActors.push_back(vtkSmartPointer<vtkActor>::New());
640 //------------------------------------------------------------------------------
643 //------------------------------------------------------------------------------
644 void vvToolProfile::SetPoints()
646 if (!mPoint1Selected && !mPoint2Selected)
649 if(mCurrentSlicerManager) {
650 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
652 pos = new double [4];
653 pos[0] = pos[1] = pos[2] = pos[3] = 0;
657 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
660 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
661 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
665 p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
666 p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
667 p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
670 p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0];
671 p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1];
672 p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2];
675 vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
681 //------------------------------------------------------------------------------