X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvToolHistogram.cxx;h=5461bcc39a466222141be2a0d9db6f2581a75f66;hb=HEAD;hp=e9418c47b5b1638f05f2830e76b5e0e6a6f38919;hpb=dcb3446e7d4a04cdaac655b3181109d4463252b9;p=clitk.git diff --git a/vv/vvToolHistogram.cxx b/vv/vvToolHistogram.cxx index e9418c4..5461bcc 100644 --- a/vv/vvToolHistogram.cxx +++ b/vv/vvToolHistogram.cxx @@ -27,6 +27,7 @@ #include "vvSlicerManager.h" #include "vvSlicer.h" #include "vvToolInputSelectorWidget.h" +#include "vvToolHistogramCommand.h" // vtk #include @@ -79,17 +80,20 @@ vvToolHistogram::vvToolHistogram(vvMainWindowBase * parent, Qt::WindowFlags f) // GUI Initialization Ui_vvToolHistogram::setupUi(mToolWidget); + mModificationsDone = false; + // Connect signals & slots connect(mSaveHistogramButton, SIGNAL(clicked()), this, SLOT(SaveAs())); // Initialize some widget HistogramWidget->hide(); - + mView = vtkSmartPointer::New(); vtkSmartPointer chart = vtkSmartPointer::New(); chart->SetAutoSize(false); chart->SetRenderEmpty(true); mView->GetScene()->AddItem(chart); + mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0); this->HistogramWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems(); this->HistogramWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer()); HistogramWidget->show(); @@ -121,59 +125,121 @@ void vvToolHistogram::computeHistogram() QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); GetArgsInfoFromGUI(); HistogramWidget->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("Intensity"); arrY->SetName("#Voxels"); - - table->AddColumn(arrX); - table->AddColumn(arrY); - - mView->GetRenderer()->SetBackground(1.0, 1.0, 1.0); - + mTable->AddColumn(arrX); + mTable->AddColumn(arrY); + + //Upper and Lower lines for window/level + vtkSmartPointer arrXUpperWindowLevel = vtkSmartPointer::New(); + vtkSmartPointer arrXLowerWindowLevel = vtkSmartPointer::New(); + vtkSmartPointer arrYWindowLevel = vtkSmartPointer::New(); + arrXUpperWindowLevel->InsertNextTuple1(mMaxWindowLevel); + arrXUpperWindowLevel->InsertNextTuple1(mMaxWindowLevel); + arrXLowerWindowLevel->InsertNextTuple1(mMinWindowLevel); + arrXLowerWindowLevel->InsertNextTuple1(mMinWindowLevel); + arrYWindowLevel->InsertNextTuple1(0.0); + arrYWindowLevel->InsertNextTuple1(arrY->GetMaxNorm()); + arrXUpperWindowLevel->SetName("IntensityUp"); + arrXLowerWindowLevel->SetName("IntensityLow"); + arrYWindowLevel->SetName("#Voxels"); + mTableWindowLevel->AddColumn(arrXUpperWindowLevel); + mTableWindowLevel->AddColumn(arrXLowerWindowLevel); + mTableWindowLevel->AddColumn(arrYWindowLevel); + + displayHistogram(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolHistogram::displayHistogram() +{ + if (!mCurrentSlicerManager) close(); + HistogramWidget->hide(); + + 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); + line->SetInput(mTable, 0, 1); #else - line->SetInputData(table, 0, 1); + line->SetInputData(mTable, 0, 1); #endif line->SetColor(0, 255, 0, 255); line->SetWidth(1.0); + + + vtkPlot *upperWindowLine = chart->AddPlot(vtkChart::LINE); + vtkPlot *lowerWindowLine = chart->AddPlot(vtkChart::LINE); +#if VTK_MAJOR_VERSION <= 5 + upperWindowLine->SetInput(mTableWindowLevel, 0, 2); + lowerWindowLine->SetInput(mTableWindowLevel, 1, 2); +#else + upperWindowLine->SetInputData(mTableWindowLevel, 0, 2); + lowerWindowLine->SetInputData(mTableWindowLevel, 1, 2); +#endif + upperWindowLine->SetColor(255, 0, 0, 255); + lowerWindowLine->SetColor(255, 0, 0, 255); + upperWindowLine->SetWidth(1.0); + lowerWindowLine->SetWidth(1.0); + chart->GetAxis(vtkAxis::LEFT)->SetTitle("#Voxels"); chart->GetAxis(vtkAxis::BOTTOM)->SetTitle("Intensity"); - + this->HistogramWidget->GetRenderWindow()->GetRenderers()->RemoveAllItems(); this->HistogramWidget->GetRenderWindow()->AddRenderer(mView->GetRenderer()); HistogramWidget->show(); - + QApplication::restoreOverrideCursor(); } //------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ +void vvToolHistogram::changeWindowLevel() +{ + vtkFloatArray* upperArray = vtkFloatArray::New(); + upperArray = static_cast(mTableWindowLevel->GetColumn(0)); + upperArray->SetTuple1(0, mMaxWindowLevel); + upperArray->SetTuple1(1, mMaxWindowLevel); + vtkFloatArray* lowerArray = vtkFloatArray::New(); + lowerArray = static_cast(mTableWindowLevel->GetColumn(1)); + lowerArray->SetTuple1(0, mMinWindowLevel); + lowerArray->SetTuple1(1, mMinWindowLevel); + displayHistogram(); + mCurrentSlicerManager->UpdateWindowLevel(); + mCurrentSlicerManager->Render(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolHistogram::windowLevelChanged() +{ + computeMinMax(); + changeWindowLevel(); +} +//------------------------------------------------------------------------------ + + //------------------------------------------------------------------------------ void vvToolHistogram::RemoveVTKObjects() { - if (mCurrentSlicerManager) - { - connect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float))); - - mCurrentSlicerManager->Render(); - } } //------------------------------------------------------------------------------ @@ -181,8 +247,13 @@ void vvToolHistogram::RemoveVTKObjects() //------------------------------------------------------------------------------ bool vvToolHistogram::close() { - //RemoveVTKObjects(); - + if (!mModificationsDone) + { + mCurrentSlicerManager->SetColorLevel(originalLevel); + mCurrentSlicerManager->SetColorWindow(originalWindow); + mCurrentSlicerManager->UpdateWindowLevel(); + mCurrentSlicerManager->Render(); + } return vvToolWidgetBase::close(); } //------------------------------------------------------------------------------ @@ -215,9 +286,86 @@ void vvToolHistogram::InputIsSelected(vvSlicerManager * m) mSaveHistogramButton->setEnabled(true); mTextFileName = "Histogram.txt"; + mTableWindowLevel = vtkSmartPointer::New(); + mTable = vtkSmartPointer::New(); + + originalWindow = mCurrentSlicerManager->GetColorWindow(); + originalLevel = mCurrentSlicerManager->GetColorLevel(); + + //Compute Min & Max for Window/Level + computeMinMax(); + computeHistogram(); - disconnect(mCurrentSlicerManager, SIGNAL(callAddLandmark(float,float,float,float)), mCurrentSlicerManager, SLOT(AddLandmark(float,float,float,float))); + // Connect signals & slots + vvToolHistogramCommand *smc = vvToolHistogramCommand::New(); + smc->mHist = this; + HistogramWidget->GetRenderWindow()->GetInteractor()->GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonPressEvent, smc); + HistogramWidget->GetRenderWindow()->GetInteractor()->GetInteractorStyle()->AddObserver(vtkCommand::MouseMoveEvent, smc); + HistogramWidget->GetRenderWindow()->GetInteractor()->GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc); + HistogramWidget->GetRenderWindow()->GetInteractor()->GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc); + smc->Delete(); + +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +#if (VTK_MAJOR_VERSION == 8 && VTK_MINOR_VERSION >= 2) || VTK_MAJOR_VERSION >= 9 +QVTKOpenGLNativeWidget* vvToolHistogram::GetHistogramWidget() +#else +QVTKWidget* vvToolHistogram::GetHistogramWidget() +#endif +{ + return(HistogramWidget); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolHistogram::computeMinMax() +{ + mMinWindowLevel = mCurrentSlicerManager->GetColorLevel() - mCurrentSlicerManager->GetColorWindow()/2.0; + mMaxWindowLevel = mCurrentSlicerManager->GetColorLevel() + mCurrentSlicerManager->GetColorWindow()/2.0; +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolHistogram::computeWindowLevel() +{ + double window = mMaxWindowLevel - mMinWindowLevel; + double level = (mMaxWindowLevel + mMinWindowLevel)/2.0; +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolHistogram::expandWindow() +{ + mCurrentSlicerManager->SetColorWindow(mCurrentSlicerManager->GetColorWindow()+10.0); + computeMinMax(); + changeWindowLevel(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolHistogram::reduceWindow() +{ + mCurrentSlicerManager->SetColorWindow(mCurrentSlicerManager->GetColorWindow()-10.0); + computeMinMax(); + changeWindowLevel(); +} +//------------------------------------------------------------------------------ + + +//------------------------------------------------------------------------------ +void vvToolHistogram::translateWindow(double x) +{ + mCurrentSlicerManager->SetColorLevel(mCurrentSlicerManager->GetColorLevel()+10.0*x); + computeMinMax(); + changeWindowLevel(); } //------------------------------------------------------------------------------ @@ -253,7 +401,8 @@ void vvToolHistogram::GetArgsInfoFromGUI() //------------------------------------------------------------------------------ void vvToolHistogram::apply() -{ +{ + mModificationsDone = true; close(); } //------------------------------------------------------------------------------ @@ -302,7 +451,6 @@ void vvToolHistogram::SaveAs() vtkSmartPointer arrX = vtkSmartPointer::New(); vtkSmartPointer arrY = vtkSmartPointer::New(); - vtkSmartPointer coords = vtkSmartPointer::New(); arrX = mFilter->GetArrayX(); arrY = mFilter->GetArrayY(); int i(0);