X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvSlicer.cxx;h=03ecaaaff126bcf49f27ddb5643c3b4b6d470e0a;hb=89480b23b6f4f748dc29f0241ddc015fb092f365;hp=60ff1e4ebf594bfb7edae79d88ce2cb210abdcff;hpb=98bdb72d057c122863776f8c3fb74659e8c87beb;p=clitk.git diff --git a/vv/vvSlicer.cxx b/vv/vvSlicer.cxx index 60ff1e4..03ecaaa 100644 --- a/vv/vvSlicer.cxx +++ b/vv/vvSlicer.cxx @@ -68,8 +68,8 @@ #include #include #include -#include #include +#include vtkCxxRevisionMacro(vvSlicer, "DummyRevision"); vtkStandardNewMacro(vvSlicer); @@ -98,6 +98,7 @@ vvSlicer::vvSlicer() text += "F5 = horizontal flip; F6 = vertical flip\n\n"; text += "0,1,2,3,4,5 : preset windowing\n"; text += "6,7,8,9 : preset colormap\n"; + text += "z : local windowing\n"; text += "r : reset view\n"; text += "l : reload image\n"; text += "f : fly to mouse position\n"; @@ -1140,6 +1141,56 @@ void vvSlicer::SetColorLevel(double level) } //---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +// Returns the min an the max value in a 41x41 region around the mouse pointer +void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max) +{ + //Get mouse pointer position in view coordinates + double fLocalExtents[6]; + for(int i=0; i<3; i++) + { + fLocalExtents[i*2 ] = mCurrent[i]; + fLocalExtents[i*2+1] = mCurrent[i]; + } + this->Renderer->WorldToView(fLocalExtents[0], fLocalExtents[2], fLocalExtents[4]); + this->Renderer->WorldToView(fLocalExtents[1], fLocalExtents[3], fLocalExtents[5]); + for(int i=0; i<3; i++) + { + if (i!=SliceOrientation) //SR: assumes that SliceOrientation is valid in ViewCoordinates (???) + { + fLocalExtents[i*2 ] -= 0.2; + fLocalExtents[i*2+1] += 0.2; + } + } + this->Renderer->ViewToWorld(fLocalExtents[0], fLocalExtents[2], fLocalExtents[4]); + this->Renderer->ViewToWorld(fLocalExtents[1], fLocalExtents[3], fLocalExtents[5]); + + //Convert to image pixel coordinates (rounded) + int iLocalExtents[6]; + for(int i=0; i<3; i++) + { + fLocalExtents[i*2 ] = (fLocalExtents[i*2 ] - this->GetInput()->GetOrigin()[i])/this->GetInput()->GetSpacing()[i]; + fLocalExtents[i*2+1] = (fLocalExtents[i*2+1] - this->GetInput()->GetOrigin()[i])/this->GetInput()->GetSpacing()[i]; + + iLocalExtents[i*2 ] = lrint(fLocalExtents[i*2 ]); + iLocalExtents[i*2+1] = lrint(fLocalExtents[i*2+1]); + + if(iLocalExtents[i*2 ]>iLocalExtents[i*2+1]) + std::swap(iLocalExtents[i*2], iLocalExtents[i*2+1]); + } + + vtkSmartPointer voiFilter = vtkExtractVOI::New(); + voiFilter->SetInput(this->GetInput()); + voiFilter->SetVOI(iLocalExtents); + + vtkSmartPointer accFilter = vtkImageAccumulate::New(); + accFilter->SetInput(voiFilter->GetOutput()); + accFilter->Update(); + + min = *(accFilter->GetMin()); + max = *(accFilter->GetMax()); +} +//---------------------------------------------------------------------------- //---------------------------------------------------------------------------- void vvSlicer::Render()