X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvSlicer.cxx;h=415d4a8f95398c8cdcd083fcbabe46f98146ce49;hb=9eb424ad85e739c6b1a519ff9f23eefa682a331a;hp=d50a422f3d928e0da48b969c7b5decd85f81b36a;hpb=e896ba3b14844f2769652b8b3230b73914acd5ee;p=clitk.git
diff --git a/vv/vvSlicer.cxx b/vv/vvSlicer.cxx
index d50a422..415d4a8 100644
--- a/vv/vvSlicer.cxx
+++ b/vv/vvSlicer.cxx
@@ -1,28 +1,22 @@
/*=========================================================================
+ Program: vv http://www.creatis.insa-lyon.fr/rio/vv
- Program: vv
- Language: C++
- Author : Pierre Seroul (pierre.seroul@gmail.com)
+ Authors belong to:
+ - University of LYON http://www.universite-lyon.fr/
+ - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
+ - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
- Copyright (C) 2008
- Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
- CREATIS-LRMN http://www.creatis.insa-lyon.fr
+ This software is distributed WITHOUT ANY WARRANTY; without even
+ the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+ PURPOSE. See the copyright notices for more information.
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, version 3 of the License.
+ It is distributed under dual licence
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ - BSD See included LICENSE.txt file
+ - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ ======================================================================-====*/
- You should have received a copy of the GNU General Public License
- along with this program. If not, see .
-
- =========================================================================*/
#include "vvSlicer.h"
-
#include "vvImage.h"
#include "vvSlicerManagerCommand.h"
#include "vvGlyphSource.h"
@@ -70,6 +64,7 @@
#include
#include
#include
+#include
vtkCxxRevisionMacro(vvSlicer, "DummyRevision");
vtkStandardNewMacro(vvSlicer);
@@ -146,6 +141,7 @@ vvSlicer::vvSlicer()
this->WindowLevel->Delete();
this->WindowLevel = vvImageMapToWLColors::New();
this->InstallPipeline();
+
}
//------------------------------------------------------------------------------
@@ -572,6 +568,9 @@ void vvSlicer::SetTSlice(int t)
t = 0;
else if ((unsigned int)t >= mImage->GetVTKImages().size())
t = mImage->GetVTKImages().size() -1;
+
+ if (mCurrentTSlice == t) return;
+
mCurrentTSlice = t;
this->SetInput(mImage->GetVTKImages()[t]);
if (mVF && mVFActor->GetVisibility())
@@ -641,6 +640,27 @@ void vvSlicer::SetSliceOrientation(int orientation)
SetContourSlice();
}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+int * vvSlicer::GetExtent() {
+ int *w_ext;
+ if (mUseReducedExtent) {
+ w_ext = mReducedExtent;
+ }
+ else w_ext = GetInput()->GetWholeExtent();
+ return w_ext;
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+int vvSlicer::GetOrientation() {
+ return this->SliceOrientation;
+}
+//----------------------------------------------------------------------------
+
//----------------------------------------------------------------------------
void vvSlicer::UpdateDisplayExtent()
@@ -1145,49 +1165,65 @@ 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)
{
- double fLocalExtents[6];
- int iLocalExtents[6];
- for(int i=0; i<3; i++)
+ //Get mouse pointer position in view coordinates
+ double fLocalExtents[6];
+ for(int i=0; i<3; i++)
{
- //Define corners of an area on the screen
- if(SliceOrientation != i)
- {
- fLocalExtents[i*2 ] = mCurrent[i]-20;
- fLocalExtents[i*2+1] = mCurrent[i]+20;
- }
- else
- {
- fLocalExtents[i*2 ] = mCurrent[i];
- fLocalExtents[i*2+1] = mCurrent[i];
- }
-
- //Convert to image pixel coordinates
- 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];
-
- //Round
- iLocalExtents[i*2 ] = lrint(fLocalExtents[i*2 ]);
- iLocalExtents[i*2+1] = lrint(fLocalExtents[i*2+1]);
+ 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];
- ClipDisplayedExtent(iLocalExtents, this->GetInput()->GetExtent());
-
- vtkSmartPointer voiFilter = vtkExtractVOI::New();
- voiFilter->SetInput(this->GetInput());
- voiFilter->SetVOI(iLocalExtents);
+ iLocalExtents[i*2 ] = lrint(fLocalExtents[i*2 ]);
+ iLocalExtents[i*2+1] = lrint(fLocalExtents[i*2+1]);
- vtkSmartPointer accFilter = vtkImageAccumulate::New();
- accFilter->SetInput(voiFilter->GetOutput());
- accFilter->Update();
-
- min = *(accFilter->GetMin());
- max = *(accFilter->GetMax());
+ 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);
+ voiFilter->Update();
+ if (!voiFilter->GetOutput()->GetNumberOfPoints())
+ {
+ min = 0;
+ max = 0;
+ return;
+ }
+
+ vtkSmartPointer accFilter = vtkImageAccumulate::New();
+ accFilter->SetInput(voiFilter->GetOutput());
+ accFilter->Update();
+
+ min = *(accFilter->GetMin());
+ max = *(accFilter->GetMax());
}
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
void vvSlicer::Render()
{
+ // DD("Render");
+ //DD(SliceOrientation);
if (this->GetWindowLevel()->GetLookupTable() && !this->mOverlay && !this->mFusion)
{
legend->SetLookupTable(this->GetWindowLevel()->GetLookupTable());
@@ -1252,10 +1288,9 @@ void vvSlicer::Render()
pixel2 << (int)Y;
pixel3 << (int)Z;
temps << mCurrentTSlice;
- double value = this->GetInput()->GetScalarComponentAsDouble(
- (int)X,
- (int)Y,
- (int)Z,0);
+ double value = this->GetInput()->GetScalarComponentAsDouble(lrint(X),
+ lrint(Y),
+ lrint(Z),0);
std::stringstream val;
val << value;
@@ -1340,6 +1375,9 @@ void vvSlicer::SetSlice(int slice)
SetContourSlice();
this->Modified();
this->UpdateDisplayExtent();
+
+ // DD("SetSlice de slicer = Render");
+
this->Render();
}
//----------------------------------------------------------------------------
@@ -1379,3 +1417,10 @@ void vvSlicer::PrintSelf(ostream& os, vtkIndent indent)
this->Superclass::PrintSelf(os, indent);
}
//----------------------------------------------------------------------------
+
+
+
+
+
+
+