X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolProfile.cxx;h=baf34f86bc35daa0e393d35388bd50633aa11ba8;hb=HEAD;hp=54eafd8d04ec6664da1c15509afc95b5269cf8cf;hpb=c3f5fb33ede3fc84e36a9f97d530f93f5fe49e44;p=clitk.git diff --git a/vv/vvToolProfile.cxx b/vv/vvToolProfile.cxx index 54eafd8..baf34f8 100644 --- a/vv/vvToolProfile.cxx +++ b/vv/vvToolProfile.cxx @@ -16,21 +16,40 @@ - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html ===========================================================================**/ +#include +#include + +#include + // vv #include "vvToolProfile.h" +#include "vvProgressDialog.h" #include "vvSlicerManager.h" #include "vvSlicer.h" #include "vvToolInputSelectorWidget.h" -// clitk -#include "clitkProfileImageGenericFilter.h" - // vtk +#include #include #include #include #include +#include +#include +#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 @@ -59,21 +78,40 @@ vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f) { // GUI Initialization Ui_vvToolProfile::setupUi(mToolWidget); - //mInteractiveDisplayIsEnabled = mCheckBoxInteractiveDisplay->isChecked(); + + 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())); connect(mSelectPoint2Button, SIGNAL(clicked()), this, SLOT(selectPoint2())); - connect(mCancelPoints, SIGNAL(clicked()), this, SLOT(cancelPoints())); + connect(mCancelPointsButton, SIGNAL(clicked()), this, SLOT(cancelPoints())); + connect(mSaveProfileButton, SIGNAL(clicked()), this, SLOT(SaveAs())); // Initialize some widget - //mThresholdSlider1->SetText(""); - //mThresholdSlider2->SetText(""); - //mFGSlider->SetText("Foreground value"); - //mBGSlider->SetText("Background value"); - + ProfileWidget->hide(); mPoint1 = NULL; mPoint2 = NULL; + + mPoint1Selected = false; + mPoint2Selected = false; + + mView = vtkSmartPointer::New(); + vtkSmartPointer chart = vtkSmartPointer::New(); + chart->SetAutoSize(false); + chart->SetRenderEmpty(true); + mView->GetScene()->AddItem(chart); + this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems(); + this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer()); + ProfileWidget->show(); + +#ifdef Q_OS_OSX + disableGLHiDPI(ProfileWidget->winId()); +#endif // Main filter mFilter = clitk::ProfileImageGenericFilter::New(); @@ -87,6 +125,8 @@ vvToolProfile::vvToolProfile(vvMainWindowBase * parent, Qt::WindowFlags f) //------------------------------------------------------------------------------ vvToolProfile::~vvToolProfile() { + delete [] mPoint1; + delete [] mPoint2; } //------------------------------------------------------------------------------ @@ -95,25 +135,58 @@ vvToolProfile::~vvToolProfile() void vvToolProfile::selectPoint1() { QString position = ""; - point1Selected = false; + if(mCurrentSlicerManager) { - if(mCurrentSlicerManager->GetSelectedSlicer() != -1) { - double x = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[0]; - double y = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[1]; - double z = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[2]; - position += QString::number(x,'f',1) + " "; - position += QString::number(y,'f',1) + " "; - position += QString::number(z,'f',1) + " "; - - mPoint1[0] = x; - mPoint1[1] = y; - mPoint1[2] = z; - - point1Selected = true; + if (mPoint1Selected) { + ProfileWidget->hide(); + vtkSmartPointer chart = vtkSmartPointer::New(); + chart->SetAutoSize(false); + chart->SetRenderEmpty(true); + mView->GetScene()->ClearItems(); + mView->GetScene()->AddItem(chart); + this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems(); + this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer()); + ProfileWidget->show(); + mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]); + } + + 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]; + ++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(); + mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ @@ -122,36 +195,136 @@ void vvToolProfile::selectPoint1() void vvToolProfile::selectPoint2() { QString position = ""; - point2Selected = false; + if(mCurrentSlicerManager) { - if(mCurrentSlicerManager->GetSelectedSlicer() != -1) { - double x = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[0]; - double y = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[1]; - double z = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[2]; - position += QString::number(x,'f',1) + " "; - position += QString::number(y,'f',1) + " "; - position += QString::number(z,'f',1) + " "; - - mPoint2[0] = x; - mPoint2[1] = y; - mPoint2[2] = z; - - point2Selected = true; + if (mPoint2Selected) { + ProfileWidget->hide(); + vtkSmartPointer chart = vtkSmartPointer::New(); + chart->SetAutoSize(false); + chart->SetRenderEmpty(true); + mView->GetScene()->ClearItems(); + mView->GetScene()->AddItem(chart); + this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems(); + this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer()); + ProfileWidget->show(); + mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]); + } + + 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]; + ++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(); + mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ bool vvToolProfile::isPointsSelected() { - if (point1Selected && point2Selected) { - //Lancer le calcule du profil + if (mPoint1Selected && mPoint2Selected) { + mSaveProfileButton->setEnabled(true); + computeProfile(); + 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(); } - - return (point1Selected && point2Selected); + 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); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolProfile::computeProfile() +{ + if (!mCurrentSlicerManager) close(); + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + GetArgsInfoFromGUI(); + ProfileWidget->hide(); + + // Main filter + mFilter->SetInputVVImage(mCurrentImage); + mFilter->SetArgsInfo(mArgsInfo); + mFilter->Update(); + + //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("Distance (mm)"); + arrY->SetName("Intensity"); + + table->AddColumn(arrX); + table->AddColumn(arrY); + + mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0); + + vtkSmartPointer chart = vtkSmartPointer::New(); + chart->SetAutoSize(true); + mView->GetScene()->ClearItems(); + mView->GetScene()->AddItem(chart); + vtkPlot *line = chart->AddPlot(vtkChart::LINE); +#if VTK_MAJOR_VERSION <= 5 + line->SetInput(table, 0, 1); +#else + line->SetInputData(table, 0, 1); +#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()); + ProfileWidget->show(); + + QApplication::restoreOverrideCursor(); } //------------------------------------------------------------------------------ @@ -159,44 +332,50 @@ bool vvToolProfile::isPointsSelected() //------------------------------------------------------------------------------ void vvToolProfile::cancelPoints() { + if (mPoint1Selected) + mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]); + if (mPoint2Selected) + mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]); + ProfileWidget->hide(); + vtkSmartPointer chart = vtkSmartPointer::New(); + chart->SetAutoSize(false); + chart->SetRenderEmpty(true); + mView->GetScene()->ClearItems(); + mView->GetScene()->AddItem(chart); + this->ProfileWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems(); + this->ProfileWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer()); + ProfileWidget->show(); + QString position = ""; mPosPoint1Label->setText(position); mPosPoint2Label->setText(position); - point1Selected = false; - point2Selected = false; + mPoint1Selected = false; + mPoint2Selected = false; + mSaveProfileButton->setEnabled(false); isPointsSelected(); + mCurrentSlicerManager->Render(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolProfile::InteractiveDisplayToggled(bool b) +void vvToolProfile::RemoveVTKObjects() { - /*mInteractiveDisplayIsEnabled = b; - if (!mInteractiveDisplayIsEnabled) { - RemoveVTKObjects(); - } else { - for(unsigned int i=0; iShowActors(); - if (mRadioButtonLowerThan->isChecked()) - mImageContourLower[i]->ShowActors(); + 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 (mCurrentSlicerManager) - mCurrentSlicerManager->Render(); - }*/ -} -//------------------------------------------------------------------------------ + if (mPoint1Selected) + mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P1", mPoint1[3]); + if (mPoint2Selected) + mCurrentSlicerManager->GetLandmarks()->RemoveLandmarkWithLabel("P2", mPoint2[3]); -//------------------------------------------------------------------------------ -void vvToolProfile::RemoveVTKObjects() -{ - for(unsigned int i=0; iHideActors(); - mImageContourLower[i]->HideActors(); - } - if (mCurrentSlicerManager) mCurrentSlicerManager->Render(); + } } //------------------------------------------------------------------------------ @@ -204,7 +383,8 @@ void vvToolProfile::RemoveVTKObjects() //------------------------------------------------------------------------------ bool vvToolProfile::close() { - // RemoveVTKObjects(); + //RemoveVTKObjects(); + return vvToolWidgetBase::close(); } //------------------------------------------------------------------------------ @@ -224,143 +404,29 @@ void vvToolProfile::reject() { // DD("vvToolProfile::reject"); RemoveVTKObjects(); - delete [] mPoint1; - delete [] mPoint2; return vvToolWidgetBase::reject(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolProfile::enableLowerThan(bool b) -{ - /*if (!b) { - mThresholdSlider1->resetMaximum(); - for(unsigned int i=0; iHideActors(); - } - mCurrentSlicerManager->Render(); - } else { - valueChangedT1(mThresholdSlider1->GetValue()); - valueChangedT2(mThresholdSlider2->GetValue()); - for(unsigned int i=0; iShowActors(); - } - mCurrentSlicerManager->Render(); - }*/ -} -//------------------------------------------------------------------------------ - - -//------------------------------------------------------------------------------ -void vvToolProfile::useFGBGtoggled(bool) -{ - if (!mCheckBoxUseBG->isChecked() && !mCheckBoxUseFG->isChecked()) - mCheckBoxUseBG->toggle(); -} -//------------------------------------------------------------------------------ - - -//------------------------------------------------------------------------------ -// void vvToolProfile::InputIsSelected(std::vector & m) { -// DD("vvToolProfile::InputIsSelected vector in Profile"); -// DD(m.size()); -// } void vvToolProfile::InputIsSelected(vvSlicerManager * m) { mCurrentSlicerManager = m; - mPoint1 = new double[3]; - mPoint2 = new double[3]; - //mPoint1 = new double[m->GetImage()->GetNumberOfSpatialDimensions()]; - //mPoint2 = new double[m->GetImage()->GetNumberOfSpatialDimensions()]; - - // Specific for this gui - //mThresholdSlider1->SetValue(0); - //mThresholdSlider2->SetValue(0); - //mThresholdSlider1->SetImage(mCurrentImage); - //mThresholdSlider2->SetImage(mCurrentImage); - //mFGSlider->SetImage(mCurrentImage); - //mBGSlider->SetImage(mCurrentImage); - // DD(mCurrentSlicerManager->GetFileName().c_str()); - // mFGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax()); - // mFGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin()); - // mBGSlider->SetMaximum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMax()); - // mBGSlider->SetMinimum(mCurrentImage->GetFirstVTKImageData()->GetScalarTypeMin()); - - // Output is uchar ... - /*mFGSlider->SetMaximum(255); - mFGSlider->SetMinimum(0); - mBGSlider->SetMaximum(255); - mBGSlider->SetMinimum(0); - - mFGSlider->SetValue(1); - mBGSlider->SetValue(0); - mFGSlider->SetSingleStep(1); - mBGSlider->SetSingleStep(1); -*/ - // VTK objects for interactive display - for(int i=0; iGetNumberOfSlicers(); i++) { - mImageContour.push_back(vvImageContour::New()); - mImageContour[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i)); - mImageContour[i]->SetColor(1.0, 0.0, 0.0); - mImageContour[i]->SetDepth(0); // to be in front of (whe used with ROI tool) - mImageContourLower.push_back(vvImageContour::New()); - mImageContourLower[i]->SetSlicer(mCurrentSlicerManager->GetSlicer(i)); - mImageContourLower[i]->SetColor(0.0, 0.0, 1.0); - mImageContourLower[i]->SetDepth(100); // to be in front of (whe used with ROI tool) - } - //valueChangedT1(mThresholdSlider1->GetValue()); - - //connect(mThresholdSlider1, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT1(double))); - //connect(mThresholdSlider2, SIGNAL(valueChanged(double)), this, SLOT(valueChangedT2(double))); - - //connect(mCurrentSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int))); - //connect(mCurrentSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int))); + mPoint1 = new double[4]; + mPoint1[0] = mPoint1[1] = mPoint1[2] = mPoint1[3] = 0; + mPoint2 = new double[4]; + mPoint2[0] = mPoint2[1] = mPoint2[2] = mPoint2[3] = 0; - //connect(mCurrentSlicerManager,SIGNAL(UpdateOrientation(int,int)),this,SLOT(UpdateOrientation(int, int))); - - // connect(mCurrentSlicerManager, SIGNAL(LeftButtonReleaseSignal(int)), SLOT(LeftButtonReleaseEvent(int))); - InteractiveDisplayToggled(mInteractiveDisplayIsEnabled); -} -//------------------------------------------------------------------------------ - - -//------------------------------------------------------------------------------ -// void vvToolProfile::LeftButtonReleaseEvent(int slicer) { -// DD("LeftButtonReleaseEvent"); -// for(int i=0; iGetNumberOfSlicers(); i++) { -// if (i == slicer); -// mCurrentSlicerManager->GetSlicer(i)->GetRenderWindow()->Render(); -// } -// } -//------------------------------------------------------------------------------ - - -//------------------------------------------------------------------------------ -void vvToolProfile::UpdateOrientation(int slicer,int orientation) -{ - Update(slicer); + mSaveProfileButton->setEnabled(false); + mTextFileName = "Profile.txt"; + InitializeLine(); + + disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float))); } //------------------------------------------------------------------------------ -//------------------------------------------------------------------------------ -void vvToolProfile::UpdateSlice(int slicer,int slices) -{ - Update(slicer); -} -//------------------------------------------------------------------------------ - -//------------------------------------------------------------------------------ -void vvToolProfile::Update(int slicer) -{ - if (!mInteractiveDisplayIsEnabled) return; - if (!mCurrentSlicerManager) close(); - //mImageContour[slicer]->Update(mThresholdSlider1->GetValue()); - //if (mRadioButtonLowerThan->isChecked()) - // mImageContourLower[slicer]->Update(mThresholdSlider2->GetValue()); -} -//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ void vvToolProfile::GetArgsInfoFromGUI() @@ -377,42 +443,22 @@ void vvToolProfile::GetArgsInfoFromGUI() DD(good); */ cmdline_parser_clitkProfileImage_init(&mArgsInfo); // Initialisation to default - bool inverseBGandFG = false; - - mArgsInfo.lower_given = 1; - /*mArgsInfo.lower_arg = mThresholdSlider1->GetValue(); - if (mRadioButtonLowerThan->isChecked()) { - mArgsInfo.upper_given = 1; - mArgsInfo.upper_arg = mThresholdSlider2->GetValue(); - if (mArgsInfo.upper_argGetValue(); - mArgsInfo.bg_arg = mBGSlider->GetValue(); - if (inverseBGandFG) { - mArgsInfo.fg_arg = mFGSlider->GetValue(); - mArgsInfo.bg_arg = mBGSlider->GetValue(); - } - mArgsInfo.fg_given = 1; - mArgsInfo.bg_given = 1; - - if (mCheckBoxUseBG->isChecked()) { - if (mCheckBoxUseFG->isChecked()) mArgsInfo.mode_arg = (char*)"both"; - else mArgsInfo.mode_arg = (char*)"BG"; - } else mArgsInfo.mode_arg = (char*)"FG"; -*/ mArgsInfo.verbose_flag = false; + + mArgsInfo.point1_arg = mPoint1; + mArgsInfo.point2_arg = mPoint2; + mArgsInfo.point1_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions(); + mArgsInfo.point2_given = mCurrentSlicerManager->GetImage()->GetNumberOfDimensions(); + + // Required (even if not used) + mArgsInfo.input_given = 0; + mArgsInfo.output_given = 0; - // // Required (even if not used) - // mArgsInfo.input_given = 0; - // mArgsInfo.output_given = 0; + mArgsInfo.input_arg = new char; + mArgsInfo.output_arg = new char; + - // mArgsInfo.input_arg = new char; - // mArgsInfo.output_arg = new char; } //------------------------------------------------------------------------------ @@ -420,56 +466,208 @@ void vvToolProfile::GetArgsInfoFromGUI() //------------------------------------------------------------------------------ void vvToolProfile::apply() { - if (!mCurrentSlicerManager) close(); - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - GetArgsInfoFromGUI(); - - // Main filter - clitk::ProfileImageGenericFilter::Pointer filter = - clitk::ProfileImageGenericFilter::New(); - filter->SetInputVVImage(mCurrentImage); - filter->SetArgsInfo(mArgsInfo); - filter->Update(); - - - // Output - vvImage::Pointer output = filter->GetOutputVVImage(); - std::ostringstream osstream; - osstream << "Profiled_" << mCurrentSlicerManager->GetSlicer(0)->GetFileName() << ".mhd"; - AddImage(output,osstream.str()); - QApplication::restoreOverrideCursor(); close(); } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolProfile::valueChangedT2(double v) +void vvToolProfile::SaveAs() { - /*// DD("valueChangedT2"); - if (mRadioButtonLowerThan->isChecked()) { - mThresholdSlider1->SetMaximum(v); - if (!mInteractiveDisplayIsEnabled) return; - for(int i=0;iGetNumberOfSlicers(); i++) { - mImageContourLower[i]->Update(v); + QStringList OutputListeFormat; + OutputListeFormat.clear(); + OutputListeFormat.push_back(".txt"); + + QString Extensions = "AllFiles(*.*)"; + for (int i = 0; i < OutputListeFormat.count(); i++) { + Extensions += ";;Text File ( *"; + Extensions += OutputListeFormat[i]; + Extensions += ")"; + } + QString fileName = QFileDialog::getSaveFileName(this, tr("Save As"), mTextFileName.c_str(), Extensions); + if (!fileName.isEmpty()) { + std::string fileformat = itksys::SystemTools::GetFilenameLastExtension(fileName.toStdString()); + QString fileQFormat = fileformat.c_str(); + if (OutputListeFormat.contains(fileformat.c_str()) || fileQFormat.isEmpty()) { + QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); + std::string action = "Saving"; + vvProgressDialog progress("Saving "+fileName.toStdString()); + qApp->processEvents(); + + if (!mCurrentSlicerManager || !isPointsSelected()) { + close(); + return; + } + + // Output + mTextFileName = fileName.toStdString(); + if (fileQFormat.isEmpty()) + mTextFileName += ".txt"; + ofstream fileOpen(mTextFileName.c_str(), std::ofstream::trunc); + + if(!fileOpen) { + cerr << "Error during saving" << endl; + QApplication::restoreOverrideCursor(); + close(); + return; + } + + mFilter->WriteOutput(mTextFileName.c_str()); + + fileOpen.close(); + QApplication::restoreOverrideCursor(); + } else { + QString error = fileformat.c_str(); + error += " format unknown !!!\n"; + QMessageBox::information(this,tr("Saving Problem"),error); + SaveAs(); } - mCurrentSlicerManager->Render(); - }*/ + } } //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ -void vvToolProfile::valueChangedT1(double v) +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 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); +#if VTK_MAJOR_VERSION >= 8 || (VTK_MAJOR_VERSION == 7 && VTK_MINOR_VERSION >= 1) + colors->InsertNextTypedTuple(red); +#else + colors->InsertNextTupleValue(red); +#endif + mLinesPolyData->GetCellData()->SetScalars(colors); + + for(int i=0;iGetNumberOfSlicers(); i++) { + mLineActors.push_back(vtkSmartPointer::New()); + } + } +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolProfile::SetPoints() { - /*// DD("valueChangedT1"); - if (!mCurrentSlicerManager) close(); - mThresholdSlider2->SetMinimum(v); - // int m1 = (int)lrint(v); - if (!mInteractiveDisplayIsEnabled) return; - for(int i=0;iGetNumberOfSlicers(); i++) { - mImageContour[i]->Update(v); + 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; + + int i(0); + while (i<3) { + pos[i] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetCursorPosition()[i]; + ++i; + } + if (mCurrentSlicerManager->GetImage()->GetNumberOfDimensions() == 4) { + pos[3] = mCurrentSlicerManager->GetSlicer(mCurrentSlicerManager->GetSelectedSlicer())->GetTSlice(); + } */ + + 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();*/ } //------------------------------------------------------------------------------ + +