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 if (mCurrentSlicerManager)
366 connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
368 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
369 mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]);
373 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]);
375 mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]);
377 mCurrentSlicerManager->Render();
380 //------------------------------------------------------------------------------
383 //------------------------------------------------------------------------------
384 bool vvToolProfile::close()
386 //RemoveVTKObjects();
388 return vvToolWidgetBase::close();
390 //------------------------------------------------------------------------------
393 //------------------------------------------------------------------------------
394 void vvToolProfile::closeEvent(QCloseEvent *event)
399 //------------------------------------------------------------------------------
402 //------------------------------------------------------------------------------
403 void vvToolProfile::reject()
405 // DD("vvToolProfile::reject");
407 return vvToolWidgetBase::reject();
409 //------------------------------------------------------------------------------
412 //------------------------------------------------------------------------------
413 void vvToolProfile::InputIsSelected(vvSlicerManager * m)
415 mCurrentSlicerManager = m;
417 mPoint1 = new double[4];
418 mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0;
419 mPoint2 = new double[4];
420 mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0;
422 mSaveProfileButton->setEnabled(false);
423 mTextFileName = "Profile.txt";
426 disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float)));
428 //------------------------------------------------------------------------------
431 //------------------------------------------------------------------------------
432 void vvToolProfile::GetArgsInfoFromGUI()
435 /* //KEEP THIS FOR READING GGO FROM FILE
437 std::string a = "toto";
438 char * const* argv = new char*;
440 struct cmdline_parser_params p;
441 p.check_required = 0;
442 int good = cmdline_parser_ext(argc, argv, &args_info, &p);
445 cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default
447 mArgsInfo.verbose_flag = false;
449 mArgsInfo.point1_arg = mPoint1;
450 mArgsInfo.point2_arg = mPoint2;
451 mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
452 mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions();
454 // Required (even if not used)
455 mArgsInfo.input_given = 0;
456 mArgsInfo.output_given = 0;
458 mArgsInfo.input_arg = new char;
459 mArgsInfo.output_arg = new char;
463 //------------------------------------------------------------------------------
466 //------------------------------------------------------------------------------
467 void vvToolProfile::apply()
471 //------------------------------------------------------------------------------
474 //------------------------------------------------------------------------------
475 void vvToolProfile::SaveAs()
477 QStringList OutputListeFormat;
478 OutputListeFormat.clear();
479 OutputListeFormat.push_back(".txt");
481 QString Extensions = "AllFiles(*.*)";
482 for (int i = 0; i < OutputListeFormat.count(); i++) {
483 Extensions += ";;Text File ( *";
484 Extensions += OutputListeFormat[i];
487 QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions);
488 if (!fileName.isEmpty()) {
489 std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString());
490 QString fileQFormat = fileformat.c_str();
491 if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) {
492 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
493 std::string action = "Saving";
494 vvProgressDialog progress("Saving "+fileName.toStdString());
495 qApp->processEvents();
497 if (!mCurrentSlicerManager || !isPointsSelected()) {
503 mTextFileName = fileName.toStdString();
504 if (fileQFormat.isEmpty())
505 mTextFileName += ".txt";
506 ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc);
509 cerr << "Error during saving" << endl;
510 QApplication::restoreOverrideCursor();
515 mFilter->WriteOutput(mTextFileName.c_str());
518 QApplication::restoreOverrideCursor();
520 QString error = fileformat.c_str();
521 error += " format unknown !!!\n";
522 QMessageBox::information(this,tr("Saving Problem"),error);
527 //------------------------------------------------------------------------------
530 //------------------------------------------------------------------------------
531 void vvToolProfile::DeleteLine(int slicer)
533 if (!mPoint1Selected && !mPoint2Selected)
536 if(mCurrentSlicerManager) {
537 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
538 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]);
542 //------------------------------------------------------------------------------
545 //------------------------------------------------------------------------------
546 void vvToolProfile::DisplayLine(int slicer)
548 if (!mPoint1Selected && !mPoint2Selected)
551 if(mCurrentSlicerManager) {
552 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
553 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()];
554 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) {
555 vtkSmartPointer<vtkBox> clippingBox = vtkSmartPointer<vtkBox>::New();
557 for (int j=0; j<6; ++j) {
558 extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j];
560 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()]);
561 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()]);
562 clippingBox->SetBounds(extent);
564 vtkSmartPointer<vtkClipPolyData> clipper = vtkSmartPointer<vtkClipPolyData>::New();
565 clipper->SetClipFunction(clippingBox);
566 #if VTK_MAJOR_VERSION <= 5
567 clipper->SetInput(mLinesPolyData);
569 mLineTransform = vtkSmartPointer<vtkTransformPolyDataFilter>::New();
570 mLineTransform->SetInputData(mLinesPolyData);
571 mLineTransform->SetTransform(mCurrentSlicerManager->GetSlicer(slicer)->GetConcatenatedTransform()->GetInverse());
572 clipper->SetInputConnection(mLineTransform->GetOutputPort());
574 clipper->InsideOutOff();
576 vtkSmartPointer<vtkPolyDataMapper> lineMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
577 #if VTK_MAJOR_VERSION <= 5
578 lineMapper->SetInput(clipper->GetOutput());
580 lineMapper->SetInputData(clipper->GetOutput());
583 mLineActors[slicer]->SetMapper(lineMapper);
584 mLineActors[slicer]->GetProperty()->SetOpacity(0.995);
586 mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]);
591 //------------------------------------------------------------------------------
594 //------------------------------------------------------------------------------
595 void vvToolProfile::InitializeLine()
597 if(mCurrentSlicerManager) {
599 mLinesPolyData = vtkSmartPointer<vtkPolyData>::New();
601 vtkSmartPointer<vtkPoints> pts = vtkSmartPointer<vtkPoints>::New();
603 pos[0] = pos[1] = pos[2] = pos[3] = 0;
604 pts->InsertNextPoint(pos);
605 pts->InsertNextPoint(pos);
606 mLinesPolyData->SetPoints(pts);
608 vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
609 vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
610 line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts)
611 line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts)
612 lines->InsertNextCell(line);
613 mLinesPolyData->SetLines(lines);
615 unsigned char red[3] = { 255, 0, 0 };
616 vtkSmartPointer<vtkUnsignedCharArray> colors = vtkSmartPointer<vtkUnsignedCharArray>::New();
617 colors->SetNumberOfComponents(3);
618 #if VTK_MAJOR_VERSION >= 7 && VTK_MINOR_VERSION >= 1
619 colors->InsertNextTypedTuple(red);
621 colors->InsertNextTupleValue(red);
623 mLinesPolyData->GetCellData()->SetScalars(colors);
625 for(int i=0;i<mCurrentSlicerManager->GetNumberOfSlicers(); i++) {
626 mLineActors.push_back(vtkSmartPointer<vtkActor>::New());
630 //------------------------------------------------------------------------------
633 //------------------------------------------------------------------------------
634 void vvToolProfile::SetPoints()
636 if (!mPoint1Selected && !mPoint2Selected)
639 if(mCurrentSlicerManager) {
640 if(mCurrentSlicerManager->GetSelectedSlicer() != -1) {
642 pos = new double [4];
643 pos[0] = pos[1] = pos[2] = pos[3] = 0;
647 pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i];
650 if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) {
651 pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice();
655 p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0];
656 p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1];
657 p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2];
660 p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0];
661 p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1];
662 p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2];
665 vtkSmartPointer<vtkPoints> pts = mLinesPolyData->GetPoints();
671 //------------------------------------------------------------------------------