]> Creatis software - clitk.git/blobdiff - vv/vvSlicer.cxx
- convert tool
[clitk.git] / vv / vvSlicer.cxx
index 60ff1e4ebf594bfb7edae79d88ce2cb210abdcff..a5c2641bd1a8f24c249bcf8fda6376441c5bc961 100644 (file)
@@ -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 <http://www.gnu.org/licenses/>.
-
-  =========================================================================*/
 #include "vvSlicer.h"
-
 #include "vvImage.h"
 #include "vvSlicerManagerCommand.h"
 #include "vvGlyphSource.h"
@@ -68,8 +62,8 @@
 #include <vtkExtractVOI.h>
 #include <vtkSphereSource.h>
 #include <vtkCutter.h>
-#include <vtkPlane.h>
 #include <vtkAssignAttribute.h>
+#include <vtkImageAccumulate.h>
 
 vtkCxxRevisionMacro(vvSlicer, "DummyRevision");
 vtkStandardNewMacro(vvSlicer);
@@ -98,6 +92,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 +1135,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<vtkExtractVOI> voiFilter = vtkExtractVOI::New();
+  voiFilter->SetInput(this->GetInput());
+  voiFilter->SetVOI(iLocalExtents);
+
+  vtkSmartPointer<vtkImageAccumulate> accFilter = vtkImageAccumulate::New();
+  accFilter->SetInput(voiFilter->GetOutput());
+  accFilter->Update();
+   
+  min = *(accFilter->GetMin());
+  max = *(accFilter->GetMax());
+}
+//----------------------------------------------------------------------------
 
 //----------------------------------------------------------------------------
 void vvSlicer::Render()