X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolProfile.cxx;h=e0ebdf1c14f283e7795a54e4adfbecaec5cf0ce8;hb=99b8973aa53da85bd951268f29495311a1e3471f;hp=f0fbf8c1fa2c1dcad1c19e54a958f8333578b1b2;hpb=b0f9ef265dbfc67374eaa989e606d2b00d634f76;p=clitk.git diff --git a/vv/vvToolProfile.cxx b/vv/vvToolProfile.cxx index f0fbf8c..e0ebdf1 100644 --- a/vv/vvToolProfile.cxx +++ b/vv/vvToolProfile.cxx @@ -17,6 +17,9 @@ ===========================================================================**/ #include +#include + +#include // vv #include "vvToolProfile.h" @@ -26,6 +29,7 @@ #include "vvToolInputSelectorWidget.h" // vtk +#include #include #include #include @@ -35,6 +39,18 @@ #include #include +#include +#include +#include +#include +#include +#include +#include + +#ifdef Q_OS_OSX +# include "vvOSXHelper.h" +#endif + //------------------------------------------------------------------------------ // Create the tool and automagically (I like this word) insert it in // the main window menu. @@ -62,6 +78,13 @@ vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f) { // GUI Initialization Ui_vvToolProfile::setupUi(mToolWidget); + + QShortcut *shortcutPoint1 = new QShortcut(QKeySequence("Ctrl+1"), parent); + shortcutPoint1->setContext(Qt::ApplicationShortcut); + QObject::connect(shortcutPoint1, SIGNAL(activated()), this, SLOT(selectPoint1())); + QShortcut *shortcutPoint2 = new QShortcut(QKeySequence("Ctrl+2"), parent); + shortcutPoint2->setContext(Qt::ApplicationShortcut); + QObject::connect(shortcutPoint2, SIGNAL(activated()), this, SLOT(selectPoint2())); // Connect signals & slots connect(mSelectPoint1Button, SIGNAL(clicked()), this, SLOT(selectPoint1())); @@ -86,6 +109,10 @@ vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f) this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer()); ProfileWidget->show(); +#ifdef Q_OS_OSX + disableGLHiDPI(ProfileWidget->winId()); +#endif + // Main filter mFilter = clitk::ProfileImageGenericFilter::New(); @@ -98,7 +125,8 @@ vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f) //------------------------------------------------------------------------------ vvToolProfile::~vvToolProfile() { - connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float))); + delete [] mPoint1; + delete [] mPoint2; } //------------------------------------------------------------------------------ @@ -108,6 +136,7 @@ void vvToolProfile::selectPoint1() { QString position = ""; + if(mCurrentSlicerManager) { if (mPoint1Selected) { ProfileWidget->hide(); vtkSmartPointer chart = vtkSmartPointer::New(); @@ -119,37 +148,41 @@ void vvToolProfile::selectPoint1() this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer()); ProfileWidget->show(); mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]); - } + } - mPoint1Selected = false; - if(mCurrentSlicerManager) { - if(mCurrentSlicerManager->GetSelectedSlicer() != -1) { - double *pos; - int *index; - pos = new double [4]; - pos[0] = pos[1] = pos[2] = pos[3] = 0; - index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()]; + mPoint1Selected = false; + + if(mCurrentSlicerManager->GetSelectedSlicer() != -1) { + double *pos; + pos = new double [4]; + pos[0] = pos[1] = pos[2] = pos[3] = 0; - int i(0); - while (iGetImage()->GetNumberOfDimensions() && i<3) { - pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i]; - index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i]; - position += QString::number(pos[i],'f',1) + " "; - mPoint1[i] = index[i]; - ++i; - } - if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) { - pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice(); - index[3] = (int)pos[3]; - position += QString::number(pos[3],'f',1) + " "; - mPoint1[3] = index[3]; - } - mPoint1Selected = true; - mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]); - mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1); - mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified(); - mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P1"); + int i(0); + while (iGetImage()->GetNumberOfDimensions() && i<3) { + pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i]; + ++i; + } + double posTransformed[3]; + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetConcatenatedTransform()->TransformPoint(pos, posTransformed); + i = 0; + while (iGetImage()->GetNumberOfDimensions() && i<3) { + pos[i] = posTransformed[i]; + 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]); + 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 + position += QString::number(mPoint1[i],'f',0) + " "; + ++i; + } + if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) { + pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice(); + mPoint1[3] = pos[3]; + position += QString::number(mPoint1[3],'f',0) + " "; } + mPoint1Selected = true; + mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]); + mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1); + mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified(); + mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P1"); + } } mPosPoint1Label->setText(position); isPointsSelected(); @@ -163,7 +196,8 @@ void vvToolProfile::selectPoint2() { QString position = ""; - if (mPoint2Selected) { + if(mCurrentSlicerManager) { + if (mPoint2Selected) { ProfileWidget->hide(); vtkSmartPointer chart = vtkSmartPointer::New(); chart->SetAutoSize(false); @@ -174,37 +208,41 @@ void vvToolProfile::selectPoint2() this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer()); ProfileWidget->show(); mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]); - } + } - mPoint2Selected = false; - if(mCurrentSlicerManager) { - if(mCurrentSlicerManager->GetSelectedSlicer() != -1) { - double *pos; - int *index; - pos = new double [4]; - pos[0] = pos[1] = pos[2] = pos[3] = 0;; - index = new int [mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()]; + mPoint2Selected = false; + + if(mCurrentSlicerManager->GetSelectedSlicer() != -1) { + double *pos; + pos = new double [4]; + pos[0] = pos[1] = pos[2] = pos[3] = 0;; - int i(0); - while (iGetImage()->GetNumberOfDimensions() &&i<3) { - pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i]; - index[i] = (int) (pos[i] - mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[i])/mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[i]; - position += QString::number(pos[i],'f',1) + " "; - mPoint2[i] = index[i]; - ++i; - } - if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) { - pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice(); - index[3] = (int)pos[3]; - position += QString::number(pos[3],'f',1) + " "; - mPoint2[3] = index[3]; - } - mPoint2Selected = true; - mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]); - mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1); - mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified(); - mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2"); + int i(0); + while (iGetImage()->GetNumberOfDimensions() && i<3) { + pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i]; + ++i; + } + double posTransformed[3]; + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetConcatenatedTransform()->TransformPoint(pos, posTransformed); + i = 0; + while (iGetImage()->GetNumberOfDimensions() && i<3) { + pos[i] = posTransformed[i]; + 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]); + 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 + position += QString::number(mPoint2[i],'f',0) + " "; + ++i; } + if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) { + pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice(); + mPoint2[3] = pos[3]; + position += QString::number(mPoint2[3],'f',0) + " "; + } + mPoint2Selected = true; + mCurrentSlicerManager->AddLandmarkProfile(pos[0], pos[1], pos[2], pos[3]); + mCurrentSlicerManager->GetLandmarks()->GetLabels()->SetNumberOfValues(mCurrentSlicerManager->GetLandmarks()->GetLabels()->GetNumberOfValues()-1); + mCurrentSlicerManager->GetLandmarks()->GetLabels()->Modified(); + mCurrentSlicerManager->GetLandmarks()->GetLabels()->InsertNextValue("P2"); + } } mPosPoint2Label->setText(position); isPointsSelected(); @@ -218,11 +256,23 @@ bool vvToolProfile::isPointsSelected() if (mPoint1Selected && mPoint2Selected) { mSaveProfileButton->setEnabled(true); computeProfile(); - //DisplayLine(); + SetPoints(); + for(int i=0;iGetNumberOfSlicers(); i++) { + DisplayLine(i); + connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int))); + connect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int))); + } + mCurrentSlicerManager->Render(); } - else + else { mSaveProfileButton->setEnabled(false); - + for(int i=0;iGetNumberOfSlicers(); i++) { + disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentBegin(int)), this, SLOT(DeleteLine(int))); + disconnect(mCurrentSlicerManager->GetSlicer(i), SIGNAL(UpdateDisplayExtentEnd(int)), this, SLOT(DisplayLine(int))); + mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]); + } + + } return (mPoint1Selected && mPoint2Selected); } //------------------------------------------------------------------------------ @@ -232,24 +282,24 @@ bool vvToolProfile::isPointsSelected() void vvToolProfile::computeProfile() { if (!mCurrentSlicerManager) close(); - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); GetArgsInfoFromGUI(); ProfileWidget->hide(); - + // Main filter mFilter->SetInputVVImage(mCurrentImage); mFilter->SetArgsInfo(mArgsInfo); mFilter->Update(); - //mImageLine = mFilter->GetOutputVVImage(); + //Creation of the XY chart vtkSmartPointer table = vtkSmartPointer::New(); vtkSmartPointer arrX = vtkSmartPointer::New(); vtkSmartPointer arrY = vtkSmartPointer::New(); arrX = mFilter->GetArrayX(); arrY = mFilter->GetArrayY(); - arrX->SetName("Voxel"); + arrX->SetName("Distance (mm)"); arrY->SetName("Intensity"); + table->AddColumn(arrX); table->AddColumn(arrY); @@ -267,6 +317,8 @@ void vvToolProfile::computeProfile() #endif line->SetColor(0, 255, 0, 255); line->SetWidth(1.0); + chart->GetAxis(vtkAxis::LEFT)->SetTitle("Intensity"); + chart->GetAxis(vtkAxis::BOTTOM)->SetTitle("Distance (mm)"); this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems(); this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer()); @@ -309,17 +361,21 @@ void vvToolProfile::cancelPoints() //------------------------------------------------------------------------------ void vvToolProfile::RemoveVTKObjects() { - if (mPoint1Selected) - mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]); - if (mPoint2Selected) - mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]); - - if (mCurrentSlicerManager) + { + connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float))); + + for(int i=0;iGetNumberOfSlicers(); i++) { + mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->RemoveActor(mLineActors[i]); + } + + if (mPoint1Selected) + mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]); + if (mPoint2Selected) + mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]); + mCurrentSlicerManager->Render(); - - delete [] mPoint1; - delete [] mPoint2; + } } //------------------------------------------------------------------------------ @@ -328,6 +384,7 @@ void vvToolProfile::RemoveVTKObjects() bool vvToolProfile::close() { //RemoveVTKObjects(); + return vvToolWidgetBase::close(); } //------------------------------------------------------------------------------ @@ -357,14 +414,14 @@ void vvToolProfile::InputIsSelected(vvSlicerManager * m) { mCurrentSlicerManager = m; - mPoint1 = new int[4]; + mPoint1 = new double[4]; mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0; - mPoint2 = new int[4]; + mPoint2 = new double[4]; mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0; mSaveProfileButton->setEnabled(false); mTextFileName = "Profile.txt"; - mImageLine = vvImage::New(); + InitializeLine(); disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float))); } @@ -400,6 +457,8 @@ void vvToolProfile::GetArgsInfoFromGUI() mArgsInfo.input_arg = new char; mArgsInfo.output_arg = new char; + + } //------------------------------------------------------------------------------ @@ -407,7 +466,7 @@ void vvToolProfile::GetArgsInfoFromGUI() //------------------------------------------------------------------------------ void vvToolProfile::apply() { - reject(); + close(); } //------------------------------------------------------------------------------ @@ -462,7 +521,7 @@ void vvToolProfile::SaveAs() double *tuple; tuple = new double[mCurrentSlicerManager->GetImage()->GetNumberOfDimensions()]; int i(0); - + fileOpen << "The Bresenham algorithm is used to travel along the line. Values represent the center of each crossed voxel (in voxel and mm)" << endl; fileOpen << "Id" << "\t" << "Value" << "\t" ; fileOpen << "x(vox)" << "\t" << "y(vox)" << "\t"; if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() >=3) @@ -477,7 +536,7 @@ void vvToolProfile::SaveAs() fileOpen << endl; while (iGetNumberOfTuples()) { - fileOpen << arrX->GetTuple(i)[0] << "\t" << arrY->GetTuple(i)[0] << "\t" ; + fileOpen << i << "\t" << arrY->GetTuple(i)[0] << "\t" ; coords->GetTuple(i, tuple); for (int j=0; jGetImage()->GetNumberOfDimensions() ; ++j) { @@ -485,7 +544,7 @@ void vvToolProfile::SaveAs() } int j(0); while (jGetImage()->GetNumberOfDimensions() && j<3) { - fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[j] << "\t" ; + fileOpen << tuple[j]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[j]+mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[j] << "\t" ; ++j; } if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) { @@ -511,14 +570,113 @@ void vvToolProfile::SaveAs() //------------------------------------------------------------------------------ -void vvToolProfile::DisplayLine() +void vvToolProfile::DeleteLine(int slicer) +{ + if (!mPoint1Selected && !mPoint2Selected) + return; + + if(mCurrentSlicerManager) { + if(mCurrentSlicerManager->GetSelectedSlicer() != -1) { + mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->RemoveActor(mLineActors[slicer]); + } + } +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolProfile::DisplayLine(int slicer) { if (!mPoint1Selected && !mPoint2Selected) return; if(mCurrentSlicerManager) { if(mCurrentSlicerManager->GetSelectedSlicer() != -1) { - double *pos; + 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()]; + 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) { + vtkSmartPointer clippingBox = vtkSmartPointer::New(); + double extent[6]; + for (int j=0; j<6; ++j) { + extent[j] = mCurrentSlicerManager->GetSlicer(slicer)->GetExtent()[j]; + } + 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()]); + 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()]); + clippingBox->SetBounds(extent); + + vtkSmartPointer clipper = vtkSmartPointer::New(); + clipper->SetClipFunction(clippingBox); +#if VTK_MAJOR_VERSION <= 5 + clipper->SetInput(mLinesPolyData); +#else + mLineTransform = vtkSmartPointer::New(); + mLineTransform->SetInputData(mLinesPolyData); + mLineTransform->SetTransform(mCurrentSlicerManager->GetSlicer(slicer)->GetConcatenatedTransform()->GetInverse()); + clipper->SetInputConnection(mLineTransform->GetOutputPort()); +#endif + clipper->InsideOutOff(); + clipper->Update(); + vtkSmartPointer lineMapper = vtkSmartPointer::New(); +#if VTK_MAJOR_VERSION <= 5 + lineMapper->SetInput(clipper->GetOutput()); +#else + lineMapper->SetInputData(clipper->GetOutput()); +#endif + + mLineActors[slicer]->SetMapper(lineMapper); + mLineActors[slicer]->GetProperty()->SetOpacity(0.995); + + mCurrentSlicerManager->GetSlicer(slicer)->GetRenderer()->AddActor(mLineActors[slicer]); + } + } + } +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolProfile::InitializeLine() +{ + if(mCurrentSlicerManager) { + + mLinesPolyData = vtkSmartPointer::New(); + + vtkSmartPointer pts = vtkSmartPointer::New(); + double pos[4]; + pos[0] = pos[1] = pos[2] = pos[3] = 0; + pts->InsertNextPoint(pos); + pts->InsertNextPoint(pos); + mLinesPolyData->SetPoints(pts); + + vtkSmartPointer lines = vtkSmartPointer::New(); + vtkSmartPointer line = vtkSmartPointer::New(); + line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the 1st point in mLinesPolyData's points (pts) + line->GetPointIds()->SetId(1, 1); // the second 1 is the index of the 2nd point in mLinesPolyData's points (pts) + lines->InsertNextCell(line); + mLinesPolyData->SetLines(lines); + + unsigned char red[3] = { 255, 0, 0 }; + vtkSmartPointer colors = vtkSmartPointer::New(); + colors->SetNumberOfComponents(3); + colors->InsertNextTupleValue(red); + mLinesPolyData->GetCellData()->SetScalars(colors); + + for(int i=0;iGetNumberOfSlicers(); i++) { + mLineActors.push_back(vtkSmartPointer::New()); + } + } +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolProfile::SetPoints() +{ + if (!mPoint1Selected && !mPoint2Selected) + return; + + if(mCurrentSlicerManager) { + if(mCurrentSlicerManager->GetSelectedSlicer() != -1) { + /*double *pos; pos = new double [4]; pos[0] = pos[1] = pos[2] = pos[3] = 0; @@ -529,75 +687,25 @@ void vvToolProfile::DisplayLine() } if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) { pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice(); - } - - /*double p0[4]; - if (mPoint1Selected) { - p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0]; - p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1]; - p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2]; - p0[3] = mPoint1[3]; - } - else { - p0[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[0]; - p0[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[1]; - p0[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetInput()->GetOrigin()[2]; - p0[3] = mPoint2[3]; - } - vtkSmartPointer pts = vtkSmartPointer::New(); - pts->InsertNextPoint(p0); - pts->InsertNextPoint(pos); - - vtkSmartPointer linesPolyData = vtkSmartPointer::New(); - linesPolyData->SetPoints(pts); - - vtkSmartPointer line = vtkSmartPointer::New(); - line->GetPointIds()->SetId(0, 0); // the second 0 is the index of the Origin in linesPolyData's points - line->GetPointIds()->SetId(1, 1); // the second 1 is the index of P0 in linesPolyData's points - - vtkSmartPointer lines = vtkSmartPointer::New(); - lines->InsertNextCell(line); - - linesPolyData->SetLines(lines); - - unsigned char red[3] = { 255, 0, 0 }; - - vtkSmartPointer colors = vtkSmartPointer::New(); - colors->SetNumberOfComponents(3); - colors->InsertNextTupleValue(red); - - linesPolyData->GetCellData()->SetScalars(colors); - - - vtkSmartPointer lineMapper = vtkSmartPointer::New(); -#if VTK_MAJOR_VERSION <= 5 - lineMapper->SetInput(linesPolyData); -#else - lineMapper->SetInputData(linesPolyData); -#endif - vtkSmartPointer lineActor = vtkSmartPointer::New(); - lineActor->SetMapper(lineMapper); - lineActor->GetProperty()->SetOpacity(0.995); - - for(int i=0;iGetNumberOfSlicers(); i++) { - mCurrentSlicerManager->GetSlicer(i)->GetRenderer()->AddActor(lineActor); - }*/ + } */ - mOverlayActors.clear(); - for(int i=0;iGetNumberOfSlicers(); i++) { - mOverlayActors.push_back(vvBinaryImageOverlayActor::New()); - mOverlayActors[i]->SetImage(mImageLine, 0); - mOverlayActors[i]->SetColor(1,0,0); - mOverlayActors[i]->SetOpacity(0.995); - mOverlayActors[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i)); - mOverlayActors[i]->Initialize(true); - mOverlayActors[i]->SetDepth(1); - mOverlayActors[i]->ShowActors(); - mOverlayActors[i]->UpdateSlice(i, mCurrentSlicerManager->GetSlicer(i)->GetSlice(), false); - } - } + double p0[4], p1[4]; + p0[0] = mPoint1[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0]; + p0[1] = mPoint1[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1]; + p0[2] = mPoint1[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2]; + p0[3] = mPoint1[3]; + + p1[0] = mPoint2[0]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[0] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[0]; + p1[1] = mPoint2[1]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[1] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[1]; + p1[2] = mPoint2[2]*mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetSpacing()[2] + mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetImage()->GetVTKImages()[mCurrentSlicerManager->GetTSlice()]->GetOrigin()[2]; + p1[3] = mPoint2[3]; + + vtkSmartPointer pts = mLinesPolyData->GetPoints(); + pts->SetPoint(0,p0); + pts->SetPoint(1,p1); + } } - mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ +