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];
165 double posTransformed[3];
166 mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetConcatenatedTransform()->TransformPoint(pos, posTransformed);
168 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
169 pos[i] = posTransformed[i];
170 mPoint1[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i]);
171 pos[i] = mPoint1[i]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i]; //Ensure to be at the center of the voxel
172 position += QString::number(mPoint1[i],'f',0) + " ";
175 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
176 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
178 position += QString::number(mPoint1[3],'f',0) + " ";
180 mPoint1Selected = true;
181 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
182 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
183 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
184 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P1");
187 mPosPoint1Label->setText(position);
189 mCurrentSlicerManager->Render();
191 //------------------------------------------------------------------------------
194 //------------------------------------------------------------------------------
195 void vvToolProfile::selectPoint2()
197 QString position = "";
199 if(mCurrentSlicerManager) {
200 if (mPoint2Selected) {
201 ProfileWidget->hide();
202 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
203 chart->SetAutoSize(false);
204 chart->SetRenderEmpty(true);
205 mView->GetScene()->ClearItems();
206 mView->GetScene()->AddItem(chart);
207 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
208 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
209 ProfileWidget->show();
210 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
213 mPoint2Selected = false;
215 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
217 pos = new double [4];
218 pos[0] = pos[1] = pos[2] = pos[3] = 0;;
221 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
222 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
225 double posTransformed[3];
226 mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetConcatenatedTransform()->TransformPoint(pos, posTransformed);
228 while (i<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && i<3) {
229 pos[i] = posTransformed[i];
230 mPoint2[i] = round((pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i]);
231 pos[i] = mPoint2[i]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[i] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[i]; //Ensure to be at the center of the voxel
232 position += QString::number(mPoint2[i],'f',0) + " ";
235 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
236 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
238 position += QString::number(mPoint2[3],'f',0) + " ";
240 mPoint2Selected = true;
241 mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]);
242 mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1);
243 mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified();
244 mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2");
247 mPosPoint2Label->setText(position);
249 mCurrentSlicerManager->Render();
251 //------------------------------------------------------------------------------
253 //------------------------------------------------------------------------------
254 bool vvToolProfile::isPointsSelected()
256 if (mPoint1Selected && mPoint2Selected) {
257 mSaveProfileButton->setEnabled(true);
260 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
262 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
263 connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
265 mCurrentSlicerManager->Render();
268 mSaveProfileButton->setEnabled(false);
269 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
270 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int)));
271 disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int)));
272 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
276 return (mPoint1Selected && mPoint2Selected);
278 //------------------------------------------------------------------------------
281 //------------------------------------------------------------------------------
282 void vvToolProfile::computeProfile()
284 if (!mCurrentSlicerManager) close();
285 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
286 GetArgsInfoFromGUI();
287 ProfileWidget->hide();
290 mFilter->SetInputVVImage(mCurrentImage);
291 mFilter->SetArgsInfo(mArgsInfo);
294 //Creation of the XY chart
295 vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
296 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
297 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
298 arrX = mFilter->GetArrayX();
299 arrY = mFilter->GetArrayY();
300 arrX->SetName("Distance (mm)");
301 arrY->SetName("Intensity");
303 table->AddColumn(arrX);
304 table->AddColumn(arrY);
306 mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
308 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
309 chart->SetAutoSize(true);
310 mView->GetScene()->ClearItems();
311 mView->GetScene()->AddItem(chart);
312 vtkPlot *line = chart->AddPlot(vtkChart::LINE);
313 #if VTK_MAJOR_VERSION <= 5
314 line->SetInput(table, 0, 1);
316 line->SetInputData(table, 0, 1);
318 line->SetColor(0, 255, 0, 255);
320 chart->GetAxis(vtkAxis::LEFT)->SetTitle("Intensity");
321 chart->GetAxis(vtkAxis::BOTTOM)->SetTitle("Distance (mm)");
323 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
324 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
325 ProfileWidget->show();
327 QApplication::restoreOverrideCursor();
329 //------------------------------------------------------------------------------
332 //------------------------------------------------------------------------------
333 void vvToolProfile::cancelPoints()
336 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
338 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
339 ProfileWidget->hide();
340 vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
341 chart->SetAutoSize(false);
342 chart->SetRenderEmpty(true);
343 mView->GetScene()->ClearItems();
344 mView->GetScene()->AddItem(chart);
345 this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems();
346 this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer());
347 ProfileWidget->show();
349 QString position = "";
350 mPosPoint1Label->setText(position);
351 mPosPoint2Label->setText(position);
352 mPoint1Selected = false;
353 mPoint2Selected = false;
354 mSaveProfileButton->setEnabled(false);
356 mCurrentSlicerManager->Render();
358 //------------------------------------------------------------------------------
361 //------------------------------------------------------------------------------
362 void vvToolProfile::RemoveVTKObjects()
364 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
365 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
369 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
371 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
374 if (mCurrentSlicerManager)
375 mCurrentSlicerManager->Render();
377 //------------------------------------------------------------------------------
380 //------------------------------------------------------------------------------
381 bool vvToolProfile::close()
383 //RemoveVTKObjects();
385 connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
386 return vvToolWidgetBase::close();
388 //------------------------------------------------------------------------------
391 //------------------------------------------------------------------------------
392 void vvToolProfile::closeEvent(QCloseEvent *event)
397 //------------------------------------------------------------------------------
400 //------------------------------------------------------------------------------
401 void vvToolProfile::reject()
403 // DD("vvToolProfile::reject");
405 return vvToolWidgetBase::reject();
407 //------------------------------------------------------------------------------
410 //------------------------------------------------------------------------------
411 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
413 mCurrentSlicerManager = m;
415 mPoint1 = new double[4];
416 mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
417 mPoint2 = new double[4];
418 mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
420 mSaveProfileButton->setEnabled(false);
421 mTextFileName = "Profile.txt";
424 disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
426 //------------------------------------------------------------------------------
429 //------------------------------------------------------------------------------
430 void vvToolProfile::GetArgsInfoFromGUI()
433 /* //KEEP THIS FOR READING GGO FROM FILE
435 std::string a = "toto";
436 char * const* argv = new char*;
438 struct cmdline_parser_params p;
439 p.check_required = 0;
440 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
443 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
445 mArgsInfo.verbose_flag = false;
447 mArgsInfo.point1_arg = mPoint1;
448 mArgsInfo.point2_arg = mPoint2;
449 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
450 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
452 // Required (even if not used)
453 mArgsInfo.input_given = 0;
454 mArgsInfo.output_given = 0;
456 mArgsInfo.input_arg = new char;
457 mArgsInfo.output_arg = new char;
461 //------------------------------------------------------------------------------
464 //------------------------------------------------------------------------------
465 void vvToolProfile::apply()
469 //------------------------------------------------------------------------------
472 //------------------------------------------------------------------------------
473 void vvToolProfile::SaveAs()
475 QStringList OutputListeFormat;
476 OutputListeFormat.clear();
477 OutputListeFormat.push_back(".txt");
479 QString Extensions = "AllFiles(*.*)";
480 for (int i = 0; i < OutputListeFormat.count(); i++) {
481 Extensions += ";;Text File ( *";
482 Extensions += OutputListeFormat[i];
485 QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions);
486 if (!fileName.isEmpty()) {
487 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
488 QString fileQFormat = fileformat.c_str();
489 if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) {
490 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
491 std::string action = "Saving";
492 vvProgressDialog progress("Saving "+fileName.toStdString());
493 qApp->processEvents();
495 if (!mCurrentSlicerManager || !isPointsSelected()) {
501 mTextFileName = fileName.toStdString();
502 if (fileQFormat.isEmpty())
503 mTextFileName += ".txt";
504 ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
507 cerr << "Error during saving" << endl;
508 QApplication::restoreOverrideCursor();
513 vtkSmartPointer<vtkFloatArray> arrX = vtkSmartPointer<vtkFloatArray>::New();
514 vtkSmartPointer<vtkFloatArray> arrY = vtkSmartPointer<vtkFloatArray>::New();
515 vtkSmartPointer<vtkFloatArray> coords = vtkSmartPointer<vtkFloatArray>::New();
516 arrX = mFilter->GetArrayX();
517 arrY = mFilter->GetArrayY();
518 coords = mFilter->GetCoord();
520 tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()];
522 fileOpen << "The Bresenham algorithm is used to travel along the line. Values represent the center of each crossed voxel (in voxel and mm)" << endl;
523 fileOpen << "Id" << "\t" << "Value" << "\t" ;
524 fileOpen << "x(vox)" << "\t" << "y(vox)" << "\t";
525 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
526 fileOpen << "z(vox)" << "\t";
527 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
528 fileOpen << "t" << "\t";
529 fileOpen << "x(mm)" << "\t" << "y(mm)" << "\t";
530 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3)
531 fileOpen << "z(mm)" << "\t";
532 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=4)
533 fileOpen << "t" << "\t";
536 while (i<arrX->GetNumberOfTuples()) {
537 fileOpen << i << "\t" << arrY->GetTuple(i)[0] << "\t" ;
539 coords->GetTuple(i, tuple);
540 for (int j=0; j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() ; ++j) {
541 fileOpen << tuple[j] << "\t" ;
544 while (j<mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() && j<3) {
545 fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[j] << "\t" ;
548 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
549 fileOpen << tuple[3] << "\t" ;
558 QApplication::restoreOverrideCursor();
560 QString error = fileformat.c_str();
561 error += " format unknown !!!\n";
562 QMessageBox::information(this,tr("Saving Problem"),error);
567 //------------------------------------------------------------------------------
570 //------------------------------------------------------------------------------
571 void vvToolProfile::DeleteLine(int slicer)
573 if (!mPoint1Selected && !mPoint2Selected)
576 if(mCurrentSlicerManager) {
577 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
578 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]);
582 //------------------------------------------------------------------------------
585 //------------------------------------------------------------------------------
586 void vvToolProfile::DisplayLine(int slicer)
588 if (!mPoint1Selected && !mPoint2Selected)
591 if(mCurrentSlicerManager) {
592 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
593 double currentSlice = (mCurrentSlicerManager->GetSlicer(slicer)->GetSlice()*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] )/ mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()];
594 if (std::min(mPoint1[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()],mPoint2[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]) <= currentSlice && std::max(mPoint1[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()],mPoint2[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]) >= currentSlice) {
595 vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
597 for (int j=0; j<6; ++j) {
598 extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
600 extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()] = mCurrentSlicerManager->GetSlicer(slicer)->GetImageActor()->GetBounds()[ mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()*2 ]-fabs(mCurrentSlicerManager->GetSlicer(slicer)->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]);
601 extent[2*mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()+1] = mCurrentSlicerManager->GetSlicer(slicer)->GetImageActor()->GetBounds()[ mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()*2+1 ]+fabs(mCurrentSlicerManager->GetSlicer(slicer)->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[mCurrentSlicerManager->GetSlicer(slicer)->GetOrientation()]);
602 clippingBox->SetBounds(extent);
604 vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
605 clipper->SetClipFunction(clippingBox);
606 #if VTK_MAJOR_VERSION <= 5
607 clipper->SetInput(mLinesPolyData);
609 mLineTransform = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
610 mLineTransform->SetInputData(mLinesPolyData);
611 mLineTransform->SetTransform(mCurrentSlicerManager->GetSlicer(slicer)->GetConcatenatedTransform()->GetInverse());
612 clipper->SetInputConnection(mLineTransform->GetOutputPort());
614 clipper->InsideOutOff();
616 vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
617 #if VTK_MAJOR_VERSION <= 5
618 lineMapper->SetInput(clipper->GetOutput());
620 lineMapper->SetInputData(clipper->GetOutput());
623 mLineActors[slicer]->SetMapper(lineMapper);
624 mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
626 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
631 //------------------------------------------------------------------------------
634 //------------------------------------------------------------------------------
635 void vvToolProfile::InitializeLine()
637 if(mCurrentSlicerManager) {
639 mLinesPolyData = vtkSmartPointer<vtkPolyData>::New();
641 vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
643 pos[0] = pos[1] = pos[2] = pos[3] = 0;
644 pts->InsertNextPoint(pos);
645 pts->InsertNextPoint(pos);
646 mLinesPolyData->SetPoints(pts);
648 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
649 vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
650 line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts)
651 line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts)
652 lines->InsertNextCell(line);
653 mLinesPolyData->SetLines(lines);
655 unsigned char red[3] = { 255, 0, 0 };
656 vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
657 colors->SetNumberOfComponents(3);
658 colors->InsertNextTupleValue(red);
659 mLinesPolyData->GetCellData()->SetScalars(colors);
661 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
662 mLineActors.push_back(vtkSmartPointer<vtkActor>::New());
666 //------------------------------------------------------------------------------
669 //------------------------------------------------------------------------------
670 void vvToolProfile::SetPoints()
672 if (!mPoint1Selected && !mPoint2Selected)
675 if(mCurrentSlicerManager) {
676 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
678 pos = new double [4];
679 pos[0] = pos[1] = pos[2] = pos[3] = 0;
683 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
686 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
687 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
691 p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0];
692 p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1];
693 p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2];
696 p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0];
697 p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1];
698 p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2];
701 vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
707 //------------------------------------------------------------------------------