]> Creatis software - clitk.git/blobdiff - vv/vvSlicer.cxx
Add EPID conversion (2^16 - value)/alpha
[clitk.git] / vv / vvSlicer.cxx
index c070d60bb4b6c11d491a764bc2a7157a4d2598f1..d05ae4fe69513879de10543932ff89db2fde18b0 100644 (file)
@@ -91,6 +91,9 @@ vvSlicer::vvSlicer()
   mScale = 1;
   mVFLog = 0;
   mVFWidth = 1;
+  mVFColor[0] = 0;
+  mVFColor[1] = 1;
+  mVFColor[2] = 0;
 
   std::string text = "F1 = sagital; F2 = coronal; F3 = axial\n";
   text += "F5 = horizontal flip; F6 = vertical flip\n\n";
@@ -264,6 +267,22 @@ bool vvSlicer::GetCursorVisibility()
 //------------------------------------------------------------------------------
 
 
+//------------------------------------------------------------------------------
+void vvSlicer::SetCornerAnnotationVisibility(bool s)
+{
+  ca->SetVisibility(s);
+}
+//------------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+bool vvSlicer::GetCornerAnnotationVisibility()
+{
+  return ca->GetVisibility();
+}
+//------------------------------------------------------------------------------
+
+
 //------------------------------------------------------------------------------
 vvSlicer::~vvSlicer()
 {
@@ -428,11 +447,20 @@ void vvSlicer::SetVF(vvImage::Pointer vf)
     mGlyphFilter->SetVectorModeToUseVector();
     mGlyphFilter->SetColorModeToColorByVector();
 
+    if (!mVFColorLUT)
+      mVFColorLUT = vtkSmartPointer<vtkLookupTable>::New();
+
+    double mVFColorHSV[3];
+    vtkMath::RGBToHSV(mVFColor, mVFColorHSV);
+    mVFColorLUT->SetHueRange(mVFColorHSV[0], mVFColorHSV[0]);
+    mVFColorLUT->SetSaturationRange(mVFColorHSV[1],mVFColorHSV[1]);
+    mVFColorLUT->SetValueRange(mVFColorHSV[2], mVFColorHSV[2]);
+
     if (!mVFMapper)
       mVFMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
-    //mVFMapper->SetInputConnection(mGlyphFilter->GetOutputPort());
     mVFMapper->SetInput(mGlyphFilter->GetOutput());
     mVFMapper->ImmediateModeRenderingOn();
+    mVFMapper->SetLookupTable(mVFColorLUT);
 
     if (!mVFActor)
       mVFActor = vtkSmartPointer<vtkActor>::New();
@@ -743,8 +771,6 @@ void vvSlicer::UpdateDisplayExtent()
         mClipBox->SetBounds(bounds);
         UpdateLandmarks();
       }
-      // DD(mLandActor->GetPosition()[2]);
-      // DD(Renderer->GetActiveCamera()->GetPosition()[2]);
       mLandActor->SetPosition(0,0,-1.5);
       /*
       if (Renderer->GetActiveCamera()->GetPosition()[2] > this->Slice)
@@ -800,8 +826,6 @@ void vvSlicer::UpdateDisplayExtent()
         mClipBox->SetBounds(bounds);
         UpdateLandmarks();
       }
-      //      DD(mLandActor->GetPosition()[1]);
-      //DD(Renderer->GetActiveCamera()->GetPosition()[1]);
       if (Renderer->GetActiveCamera()->GetPosition()[1] > this->Slice)
         mLandActor->SetPosition(0,1.5,0);
       else
@@ -854,8 +878,6 @@ void vvSlicer::UpdateDisplayExtent()
         mClipBox->SetBounds(bounds);
         UpdateLandmarks();
       }
-      //      DD(mLandActor->GetPosition()[1]);
-      //      DD(Renderer->GetActiveCamera()->GetPosition()[1]);
       if (Renderer->GetActiveCamera()->GetPosition()[0] > this->Slice)
         mLandActor->SetPosition(1.5,0,0);
       else
@@ -893,19 +915,19 @@ void vvSlicer::UpdateDisplayExtent()
 //----------------------------------------------------------------------------
 void vvSlicer::ComputeVFDisplayedExtent(int x1,int x2,int y1,int y2,int z1,int z2,int vfExtent[6])
 {
-  vtkImageData* image=this->GetInput();
-  vfExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mVF->GetOrigin()[0]) /
-    mVF->GetSpacing()[0];
-  vfExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mVF->GetOrigin()[0]) /
-    mVF->GetSpacing()[0];
-  vfExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mVF->GetOrigin()[1]) /
-    mVF->GetSpacing()[1];
-  vfExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mVF->GetOrigin()[1]) /
-    mVF->GetSpacing()[1];
-  vfExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mVF->GetOrigin()[2]) /
-    mVF->GetSpacing()[2];
-  vfExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mVF->GetOrigin()[2]) /
-    mVF->GetSpacing()[2];
+  double dVfExtent[6];
+  vtkImageData* image = this->GetInput();
+  dVfExtent[0] = image->GetOrigin()[0] + x1*image->GetSpacing()[0];
+  dVfExtent[1] = image->GetOrigin()[0] + x2*image->GetSpacing()[0];
+  dVfExtent[2] = image->GetOrigin()[1] + y1*image->GetSpacing()[1];
+  dVfExtent[3] = image->GetOrigin()[1] + y2*image->GetSpacing()[1];
+  dVfExtent[4] = image->GetOrigin()[2] + z1*image->GetSpacing()[2];
+  dVfExtent[5] = image->GetOrigin()[2] + z2*image->GetSpacing()[2];
+  
+  vtkImageData* vf = mVF->GetTransformedVTKImages()[0];
+  vf->UpdateInformation();
+  for(unsigned int i=0; i<6; i++)
+    vfExtent[i] = itk::Math::Round((dVfExtent[i]- vf->GetOrigin()[i/2]) / vf->GetSpacing()[i/2]);
 
   ClipDisplayedExtent(vfExtent,mVOIFilter->GetInput()->GetWholeExtent());
 }
@@ -915,19 +937,20 @@ void vvSlicer::ComputeVFDisplayedExtent(int x1,int x2,int y1,int y2,int z1,int z
 //----------------------------------------------------------------------------
 void vvSlicer::ComputeOverlayDisplayedExtent(int x1,int x2,int y1,int y2,int z1,int z2,int overExtent[6])
 {
-  vtkImageData* image=this->GetInput();
-  overExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mOverlay->GetOrigin()[0]) /
-    mOverlay->GetSpacing()[0];
-  overExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mOverlay->GetOrigin()[0]) /
-    mOverlay->GetSpacing()[0];
-  overExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mOverlay->GetOrigin()[1]) /
-    mOverlay->GetSpacing()[1];
-  overExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mOverlay->GetOrigin()[1]) /
-    mOverlay->GetSpacing()[1];
-  overExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mOverlay->GetOrigin()[2]) /
-    mOverlay->GetSpacing()[2];
-  overExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mOverlay->GetOrigin()[2]) /
-    mOverlay->GetSpacing()[2];
+  double dOverExtent[6];
+  vtkImageData* image = this->GetInput();
+  dOverExtent[0] = image->GetOrigin()[0] + x1*image->GetSpacing()[0];
+  dOverExtent[1] = image->GetOrigin()[0] + x2*image->GetSpacing()[0];
+  dOverExtent[2] = image->GetOrigin()[1] + y1*image->GetSpacing()[1];
+  dOverExtent[3] = image->GetOrigin()[1] + y2*image->GetSpacing()[1];
+  dOverExtent[4] = image->GetOrigin()[2] + z1*image->GetSpacing()[2];
+  dOverExtent[5] = image->GetOrigin()[2] + z2*image->GetSpacing()[2];
+  
+  vtkImageData* overlay = mOverlay->GetTransformedVTKImages()[0];
+  overlay->UpdateInformation();
+  for(unsigned int i=0; i<6; i++)
+    overExtent[i] = itk::Math::Round((dOverExtent[i]- overlay->GetOrigin()[i/2]) / overlay->GetSpacing()[i/2]);
+
   ClipDisplayedExtent(overExtent, mOverlayMapper->GetInput()->GetWholeExtent());
 }
 //----------------------------------------------------------------------------
@@ -936,19 +959,20 @@ void vvSlicer::ComputeOverlayDisplayedExtent(int x1,int x2,int y1,int y2,int z1,
 //----------------------------------------------------------------------------
 void vvSlicer::ComputeFusionDisplayedExtent(int x1,int x2,int y1,int y2,int z1,int z2,int fusExtent[6])
 {
-  vtkImageData* image=this->GetInput();
-  fusExtent[0] = (( image->GetOrigin()[0] + x1*image->GetSpacing()[0] ) - mFusion->GetOrigin()[0]) /
-    mFusion->GetSpacing()[0];
-  fusExtent[1] = (( image->GetOrigin()[0] + x2*image->GetSpacing()[0] ) - mFusion->GetOrigin()[0]) /
-    mFusion->GetSpacing()[0];
-  fusExtent[2] = (( image->GetOrigin()[1] + y1*image->GetSpacing()[1] ) - mFusion->GetOrigin()[1]) /
-    mFusion->GetSpacing()[1];
-  fusExtent[3] = (( image->GetOrigin()[1] + y2*image->GetSpacing()[1] ) - mFusion->GetOrigin()[1]) /
-    mFusion->GetSpacing()[1];
-  fusExtent[4] = (( image->GetOrigin()[2] + z1*image->GetSpacing()[2] ) - mFusion->GetOrigin()[2]) /
-    mFusion->GetSpacing()[2];
-  fusExtent[5] = (( image->GetOrigin()[2] + z2*image->GetSpacing()[2] ) - mFusion->GetOrigin()[2]) /
-    mFusion->GetSpacing()[2];
+  double dFusExtent[6];
+  vtkImageData* image = this->GetInput();
+  dFusExtent[0] = image->GetOrigin()[0] + x1*image->GetSpacing()[0];
+  dFusExtent[1] = image->GetOrigin()[0] + x2*image->GetSpacing()[0];
+  dFusExtent[2] = image->GetOrigin()[1] + y1*image->GetSpacing()[1];
+  dFusExtent[3] = image->GetOrigin()[1] + y2*image->GetSpacing()[1];
+  dFusExtent[4] = image->GetOrigin()[2] + z1*image->GetSpacing()[2];
+  dFusExtent[5] = image->GetOrigin()[2] + z2*image->GetSpacing()[2];
+  
+  vtkImageData* fusion = mFusion->GetTransformedVTKImages()[0];
+  fusion->UpdateInformation();
+  for(unsigned int i=0; i<6; i++)
+    fusExtent[i] = itk::Math::Round((dFusExtent[i]- fusion->GetOrigin()[i/2]) / fusion->GetSpacing()[i/2]);
+
   ClipDisplayedExtent(fusExtent, mFusionMapper->GetInput()->GetWholeExtent());
 }
 //----------------------------------------------------------------------------
@@ -1062,14 +1086,7 @@ void vvSlicer::SetRenderWindow(int orientation, vtkRenderWindow * rw)
 //----------------------------------------------------------------------------
 void vvSlicer::ResetCamera()
 {
-  if (this->GetInput()) {
-    double* input_bounds=this->GetInput()->GetBounds();
-    double bmax=input_bounds[1]-input_bounds[0];
-    if (bmax < input_bounds[3]-input_bounds[2]) bmax=input_bounds[3]-input_bounds[2];
-    if (bmax < input_bounds[5]-input_bounds[4]) bmax=input_bounds[5]-input_bounds[4];
-    this->GetRenderer()->ResetCamera();
-    this->GetRenderer()->GetActiveCamera()->SetParallelScale(bmax/2);
-  }
+  this->GetRenderer()->ResetCamera();
 }
 //----------------------------------------------------------------------------
 
@@ -1209,6 +1226,26 @@ void vvSlicer::GetExtremasAroundMousePointer(double & min, double & max)
 }
 //----------------------------------------------------------------------------
 
+//----------------------------------------------------------------------------
+double vvSlicer::GetScalarComponentAsDouble(vtkImageData *image, int X, double Y, double Z, int &ix, int &iy, int &iz, int component)
+{
+  ix = lrint(X);
+  iy = lrint(Y);
+  iz = lrint(Z);
+  if (ix < image->GetWholeExtent()[0] ||
+      ix > image->GetWholeExtent()[1] ||
+      iy < image->GetWholeExtent()[2] ||
+      iy > image->GetWholeExtent()[3] ||
+      iz < image->GetWholeExtent()[4] ||
+      iz > image->GetWholeExtent()[5] )
+    return sqrt(-1.);
+
+  image->SetUpdateExtent(ix, ix, iy, iy, iz, iz);
+  image->Update();
+  return image->GetScalarComponentAsDouble(ix, iy, iz, component);
+}
+//----------------------------------------------------------------------------
+
 //----------------------------------------------------------------------------
 void vvSlicer::Render()
 {
@@ -1261,9 +1298,9 @@ void vvSlicer::Render()
         Y <= this->GetInput()->GetWholeExtent()[3] &&
         Z >= this->GetInput()->GetWholeExtent()[4] &&
         Z <= this->GetInput()->GetWholeExtent()[5]) {
-      int ix = lrint(X);
-      int iy = lrint(Y);
-      int iz = lrint(Z);
+      int ix, iy, iz;
+      double value = this->GetScalarComponentAsDouble(this->GetInput(), X, Y, Z, ix, iy, iz);
+
       std::stringstream pixel1;
       std::stringstream pixel2;
       std::stringstream pixel3;
@@ -1272,9 +1309,6 @@ void vvSlicer::Render()
       pixel2 << iy;
       pixel3 << iz;
       temps << mCurrentTSlice;
-      this->GetInput()->SetUpdateExtent(ix, ix, iy, iy, iz, iz);
-      this->GetInput()->Update();
-      double value = this->GetInput()->GetScalarComponentAsDouble(ix, iy, iz, 0);
 
       std::stringstream val;
       val << value;
@@ -1395,9 +1429,19 @@ void vvSlicer::PrintSelf(ostream& os, vtkIndent indent)
 }
 //----------------------------------------------------------------------------
 
-
-
-
-
-
+//----------------------------------------------------------------------------
+void vvSlicer::SetVFColor(double r, double g, double b)
+{
+  double mVFColorHSV[3];
+  mVFColor[0] = r;
+  mVFColor[1] = g;
+  mVFColor[2] = b;
+
+  vtkMath::RGBToHSV(mVFColor, mVFColorHSV);
+  mVFColorLUT->SetHueRange(mVFColorHSV[0], mVFColorHSV[0]);
+  mVFColorLUT->SetSaturationRange(mVFColorHSV[1],mVFColorHSV[1]);
+  mVFColorLUT->SetValueRange(mVFColorHSV[2], mVFColorHSV[2]);
+
+  this->Render();
+}