]> Creatis software - clitk.git/blobdiff - vv/vvSlicerManager.cxx
- small correction about Render (a bit less unuseful Render)
[clitk.git] / vv / vvSlicerManager.cxx
index e8bf86462dd928e88f9caeb76198b1d5b6a35717..344fa73b7e8008e709fbde8beea1cb06056b61c5 100644 (file)
@@ -1,4 +1,4 @@
-/*=========================================================================
+  /*=========================================================================
   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
 
   Authors belong to: 
 #include "vvMesh.h"
 #include "vvImageMapToWLColors.h"
 
-#include "vtkImageActor.h"
-#include "vtkImageData.h"
-#include "vtkRenderWindow.h"
-#include "vtkRendererCollection.h"
-#include "vtkRenderWindowInteractor.h"
-#include "vtkImageMapToWindowLevelColors.h"
-#include "vtkWindowLevelLookupTable.h"
-#include "vtkColorTransferFunction.h"
-#include "vtkImageClip.h"
+#include <vtkImageActor.h>
+#include <vtkImageData.h>
+#include <vtkRenderWindow.h>
+#include <vtkRendererCollection.h>
+#include <vtkRenderWindowInteractor.h>
+#include <vtkImageMapToWindowLevelColors.h>
+#include <vtkWindowLevelLookupTable.h>
+#include <vtkColorTransferFunction.h>
+#include <vtkImageClip.h>
 #include <vtkLODActor.h>
 #include <vtkPointData.h>
 #include <vtksys/SystemTools.hxx>
@@ -69,11 +69,12 @@ vvSlicerManager::vvSlicerManager(int numberOfSlicers)
   mLandmarks = NULL;
   mLinkedId.resize(0);
 
-  for ( int i = 0; i < numberOfSlicers; i++)
-    {
-      vvSlicer *slicer = vvSlicer::New();
-      mSlicers.push_back(slicer);
-    }
+  for ( int i = 0; i < numberOfSlicers; i++) {
+    vvSlicer *slicer = vvSlicer::New();
+    mSlicers.push_back(slicer);
+  }
+  mPreviousSlice.resize(numberOfSlicers);
+  mPreviousTSlice.resize(numberOfSlicers);
 }
 //----------------------------------------------------------------------------
 
@@ -139,7 +140,7 @@ void vvSlicerManager::ToggleContourSuperposition()
 
 
 //----------------------------------------------------------------------------
-bool vvSlicerManager::SetImage(std::string filename,LoadedImageType type)
+bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n)
 {
   mFileName = filename;
   mType = type;
@@ -149,6 +150,12 @@ bool vvSlicerManager::SetImage(std::string filename,LoadedImageType type)
   filenames.push_back(filename);
   mReader->SetInputFilenames(filenames);
   mReader->Update(type);
+
+  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
+  mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
+  //  DD(mBaseFileName);
+  mBaseFileNameNumber = n;
+
   if (mReader->GetLastError().size() == 0)
     {
       mImage=mReader->GetOutput();
@@ -156,6 +163,7 @@ bool vvSlicerManager::SetImage(std::string filename,LoadedImageType type)
         {
          mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
          mSlicers[i]->SetImage(mReader->GetOutput());
+          //          DD(mSlicers[i]->GetFileName());
         }
     }
   else
@@ -163,6 +171,10 @@ bool vvSlicerManager::SetImage(std::string filename,LoadedImageType type)
       mLastError = mReader->GetLastError();
       return false;
     }
+  if (n!=0) {
+    //    DD(mFileName);
+    mFileName.append("_"+clitk::toString(n));
+  }
   return true;
 }
 //----------------------------------------------------------------------------
@@ -181,7 +193,7 @@ void vvSlicerManager::SetImage(vvImage::Pointer image)
 
 
 //----------------------------------------------------------------------------
-bool vvSlicerManager::SetImages(std::vector<std::string> filenames,LoadedImageType type)
+bool vvSlicerManager::SetImages(std::vector<std::string> filenames,LoadedImageType type, int n)
 {
   mType = type;
   std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);
@@ -192,12 +204,16 @@ bool vvSlicerManager::SetImages(std::vector<std::string> filenames,LoadedImageTy
   else if (type == MERGEDWITHTIME)
     fileWithoutExtension += "_merged_wt";
 
+  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
   mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);
   if (mReader == NULL)
     mReader = new vvImageReader;
   mReader->SetInputFilenames(filenames);
   mReader->Update(type);
 
+  mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
+  //  DD(mBaseFileName);
+  mBaseFileNameNumber = n;
 
   if (mReader->GetLastError().size() == 0)
     {
@@ -213,6 +229,11 @@ bool vvSlicerManager::SetImages(std::vector<std::string> filenames,LoadedImageTy
       mLastError = mReader->GetLastError();
       return false;
     }
+  if (n!=0) {
+    //    DD(mFileName);
+    mFileName.append("_"+clitk::toString(n));
+    //    DD(mFileName);
+  }
   return true;
 }
 //----------------------------------------------------------------------------
@@ -308,17 +329,29 @@ bool vvSlicerManager::SetVF(std::string filename)
 //----------------------------------------------------------------------------
 bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)
 {
-  if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions())
-    {
-      mLastError = " Vector field dimension cannot be greater then reference image!";
+  if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions()) {
+    mLastError = "Sorry, vector field dimension cannot be greater then reference image.";
+    return false;
+  }
+  if (vf->GetNumberOfDimensions() == 4) {
+    // DD(vf->GetSpacing()[3]);
+    //     DD(mImage->GetSpacing()[3]);
+    //     DD(vf->GetOrigin()[3]);
+    //     DD(mImage->GetOrigin()[3]);    
+    if (vf->GetSpacing()[3] != mImage->GetSpacing()[3]) {
+      mLastError = "Sorry, vector field time spacing cannot be different from time spacing of the reference image.";
       return false;
     }
+    if (vf->GetOrigin()[3] != mImage->GetOrigin()[3]) {
+      mLastError = "Sorry, vector field time origin cannot be different from time origin of the reference image.";
+      return false;
+    }
+  }
   mVF=vf;
   mVFName = filename;
-  for ( unsigned int i = 0; i < mSlicers.size(); i++)
-    {
-      mSlicers[i]->SetVF(vf);
-    }
+  for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+    mSlicers[i]->SetVF(vf);
+  }
   return true;
 }
 //----------------------------------------------------------------------------
@@ -411,11 +444,22 @@ void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* sty
     GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);
   mSlicers[i]->GetRenderWindow()->GetInteractor()->
     GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);
+  // mSlicers[i]->GetRenderWindow()->GetInteractor()->
+  //   GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);
+  mSlicers[i]->GetRenderWindow()->GetInteractor()->
+     GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);
   smc->Delete();
 }
 //----------------------------------------------------------------------------
 
 
+//----------------------------------------------------------------------------
+void vvSlicerManager::LeftButtonReleaseEvent(int slicer) {
+  emit LeftButtonReleaseSignal(slicer);
+}
+//----------------------------------------------------------------------------
+
+
 //----------------------------------------------------------------------------
 void vvSlicerManager::SetTSlice(int slice)
 {
@@ -427,9 +471,11 @@ void vvSlicerManager::SetTSlice(int slice)
     mLandmarks->SetTime(slice);
   for ( unsigned int i = 0; i < mSlicers.size(); i++)
     {
-      mSlicers[i]->SetTSlice(slice);
-      if (mSlicers[i]->GetImageActor()->GetVisibility())
-       UpdateTSlice(i);
+      if (slice != mSlicers[i]->GetTSlice()) {
+        mSlicers[i]->SetTSlice(slice);
+        if (mSlicers[i]->GetImageActor()->GetVisibility())
+          UpdateTSlice(i);
+      }
     }
 }
 //----------------------------------------------------------------------------
@@ -442,6 +488,9 @@ void vvSlicerManager::SetNextTSlice(int originating_slicer)
   t++;
   if (t > mSlicers[0]->GetTMax())
     t = 0;
+  // DD("SetNextTSlice");
+//   DD(originating_slicer);
+//   DD(t);
   emit UpdateTSlice(originating_slicer,t);
 }
 //----------------------------------------------------------------------------
@@ -480,6 +529,9 @@ void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)
     tslice = mSlicers[slicer]->GetTMax();
   if (mLandmarks)
     mLandmarks->SetTime(tslice);
+
+  if (mSlicers[slicer]->GetTSlice() == tslice) return;
+
   mSlicers[slicer]->SetTSlice(tslice);
   if (mSlicers[slicer]->GetImageActor()->GetVisibility())
     UpdateTSlice(slicer);
@@ -615,6 +667,8 @@ void vvSlicerManager::UpdateViews(int current,int slicer)
                    mSlicers[i]->SetSlice((int)floor(x));
                  break;
                 }
+              // DD("UpdateViews::");
+              // DD(i);
              UpdateSlice(i);
              UpdateTSlice(i);
             }
@@ -912,7 +966,15 @@ void vvSlicerManager::UpdateWindowLevel()
 //----------------------------------------------------------------------------
 void vvSlicerManager::UpdateSlice(int slicer)
 {
+  // DD("vvSlicerManager::UpdateSlice emit UpdateSlice");
+//   DD(slicer);
+//   DD(mSlicers[slicer]->GetSlice());
+  if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {
+    //DD("============= NOTHING");
+    return;
+  }
   emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());
+  mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();
 }
 //----------------------------------------------------------------------------
 
@@ -920,7 +982,19 @@ void vvSlicerManager::UpdateSlice(int slicer)
 //----------------------------------------------------------------------------
 void vvSlicerManager::UpdateTSlice(int slicer)
 {
-  emit UpdateTSlice(slicer,mSlicers[0]->GetTSlice());
+  // DD("vvSlicerManager::UpdateTSlice emit UpdateTSlice");
+//   DD(slicer);
+//   DD(mSlicers[slicer]->GetTSlice());
+//   DD(mSlicers[slicer]->GetSlice());
+  if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {
+    if (mPreviousTSlice[slicer] == mSlicers[slicer]->GetTSlice()) {
+      //      DD("************** NOTHING ***********");
+      return;
+    }
+  }
+  mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();
+  mPreviousTSlice[slicer] = mSlicers[slicer]->GetTSlice();
+  emit UpdateTSlice(slicer,mSlicers[slicer]->GetTSlice());  
 }
 //----------------------------------------------------------------------------
 
@@ -1010,6 +1084,7 @@ void vvSlicerManager::SetLocalColorWindowing(const int slicer)
   this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max);
   this->SetColorWindow(max-min);
   this->SetColorLevel(0.5*(min+max));
+  this->UpdateWindowLevel();
   this->Render();
 }
 //----------------------------------------------------------------------------
@@ -1169,3 +1244,26 @@ void vvSlicerManager::AddLandmark(float x,float y,float z,float t)
   emit LandmarkAdded();
 }
 //----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::PrevImage(int slicer)
+{
+  emit ChangeImageWithIndexOffset(this, slicer, -1);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::NextImage(int slicer)
+{
+  emit ChangeImageWithIndexOffset(this, slicer,  1);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice) {
+  emit AVerticalSliderHasChanged(slicer, slice);
+}
+    
+//----------------------------------------------------------------------------