]> Creatis software - clitk.git/blobdiff - vv/vvSlicerManager.cxx
release memory when overlay and fusion images are closed
[clitk.git] / vv / vvSlicerManager.cxx
index c23c1207ba891e4848751ebdac85efa26a228c27..42982b7f99ffb6693afc4f04deb88f51ad629355 100644 (file)
@@ -112,7 +112,6 @@ void vvSlicerManager::SetFilename(std::string filename, int number)
   mFileName = filename;
   mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
   mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
-  //  DD(mBaseFileName);
   mBaseFileNameNumber = number;
 
   for(unsigned int i=0; i<mSlicers.size(); i++) {
@@ -146,7 +145,7 @@ void vvSlicerManager::ToggleContourSuperposition()
 
 
 //----------------------------------------------------------------------------
-bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n)
+bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n, unsigned int slice)
 {
   mType = type;
   if (mReader == NULL)
@@ -154,12 +153,12 @@ bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n
   std::vector<std::string> filenames;
   filenames.push_back(filename);
   mReader->SetInputFilenames(filenames);
+  mReader->SetSlice(slice); // Only used for SLICED type
   mReader->Update(type);
 
   SetFilename(filename, n);
   //  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
   //mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
-  //  DD(mBaseFileName);
   //mBaseFileNameNumber = n;
 
   if (mReader->GetLastError().size() == 0) {
@@ -167,14 +166,12 @@ bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n
     for ( unsigned int i = 0; i < mSlicers.size(); i++) {
       mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
       mSlicers[i]->SetImage(mReader->GetOutput());
-      //          DD(mSlicers[i]->GetFileName());
     }
   } else {
     mLastError = mReader->GetLastError();
     return false;
   }
   // if (n!=0) {
-  //   //    DD(mFileName);
   //   mFileName.append("_"+clitk::toString(n));
   // }
   return true;
@@ -213,7 +210,6 @@ bool vvSlicerManager::SetImages(std::vector<std::string> filenames,LoadedImageTy
   mReader->Update(type);
 
   mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
-  //  DD(mBaseFileName);
   mBaseFileNameNumber = n;
 
   if (mReader->GetLastError().size() == 0) {
@@ -227,9 +223,7 @@ bool vvSlicerManager::SetImages(std::vector<std::string> filenames,LoadedImageTy
     return false;
   }
   if (n!=0) {
-    //    DD(mFileName);
     mFileName.append("_"+clitk::toString(n));
-    //    DD(mFileName);
   }
   return true;
 }
@@ -319,10 +313,6 @@ bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)
     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;
@@ -342,35 +332,6 @@ bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)
 //----------------------------------------------------------------------------
 
 
-//----------------------------------------------------------------------------
-void vvSlicerManager::SetExtractedImage(std::string filename,vvImage::Pointer image, int slice)
-{
-  mFileName = filename;
-  mImage = vvImage::New();
-  if (image->GetNumberOfDimensions() == 4) {
-    mImage->AddImage(image->GetVTKImages()[slice]);
-    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-      mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
-      mSlicers[i]->SetImage(mImage);
-    }
-  } else {
-    vtkImageClip* clipper = vtkImageClip::New();
-    int extent[6];
-    image->GetVTKImages()[0]->GetWholeExtent(extent);
-    clipper->SetInput(image->GetVTKImages()[0]);
-    clipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],slice,slice);
-    clipper->Update();
-    mImage->AddImage(clipper->GetOutput());
-    for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-      mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
-      mSlicers[i]->SetImage(mImage);
-    }
-    clipper->Delete();
-  }
-}
-//----------------------------------------------------------------------------
-
-
 //----------------------------------------------------------------------------
 vvSlicer* vvSlicerManager::GetSlicer(int i)
 {
@@ -470,9 +431,6 @@ 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);
 }
 //----------------------------------------------------------------------------
@@ -496,6 +454,10 @@ void vvSlicerManager::ToggleInterpolation()
   bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());
   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
     mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);
+    if (mSlicers[i]->GetOverlayActor())
+      mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);
+    if (mSlicers[i]->GetFusionActor())
+      mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);
   }
 }
 //----------------------------------------------------------------------------
@@ -560,10 +522,6 @@ void vvSlicerManager::SetOpacity(int i, double factor)
 //----------------------------------------------------------------------------
 void vvSlicerManager::UpdateViews(int current,int slicer)
 {
-  // DD("UpdateViews");
-  //   DD(current);
-  //   DD(slicer);
-
   double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
     /mSlicers[slicer]->GetInput()->GetSpacing()[0];
   double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
@@ -641,8 +599,6 @@ void vvSlicerManager::UpdateViews(int current,int slicer)
             mSlicers[i]->SetSlice((int)floor(x));
           break;
         }
-        // DD("UpdateViews::");
-        // DD(i);
         UpdateSlice(i);
         UpdateTSlice(i);
       }
@@ -767,9 +723,7 @@ double vvSlicerManager::GetColorLevel()
 //----------------------------------------------------------------------------
 void vvSlicerManager::Render()
 {
-  // DD("vvSlicerManager::Render");
   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
-    //  DD(i);
     mSlicers[i]->Render();
   }
 }
@@ -837,6 +791,16 @@ void vvSlicerManager::ReloadVF()
 //----------------------------------------------------------------------------
 void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)
 {
+  if (actor_type =="overlay") {
+    delete mOverlayReader;
+    mOverlayReader = NULL;
+  }
+
+  if (actor_type =="fusion") {
+    delete mFusionReader;
+    mFusionReader = NULL;
+  }
+
   for (unsigned int i = 0; i < mSlicers.size(); i++) {
     mSlicers[i]->RemoveActor(actor_type,overlay_index);
   }
@@ -854,7 +818,10 @@ void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_ind
 //----------------------------------------------------------------------------
 void vvSlicerManager::RemoveActors()
 {
-  ///This method leaks a few objects. See RemoveActor for what a correct implementation would look like
+  ///This method leaks a few objects. See RemoveActor for what a
+  ///correct implementation would look like
+  //DS -> probably due to the reader (now released in the
+  //RemoveActor() function. (I hope)
   for ( unsigned int i = 0; i < mSlicers.size(); i++) {
     mSlicers[i]->SetDisplayMode(0);
     mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());
@@ -990,9 +957,6 @@ 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;
@@ -1007,10 +971,6 @@ void vvSlicerManager::UpdateSlice(int slicer)
 //----------------------------------------------------------------------------
 void vvSlicerManager::UpdateTSlice(int slicer)
 {
-  // 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 ***********");
@@ -1044,26 +1004,18 @@ void vvSlicerManager::SetPreset(int preset)
   std::string component_type=mImage->GetScalarTypeAsITKString();
   switch (preset) {
   case 0:
-    if (component_type == "unsigned_char") {
-      window = 255;
-      level = 127;
-    } else if (component_type == "short") {
-      window = 2000;
-      level = 0;
-    } else {
-      double range[2];
-      mImage->GetScalarRange(range);
-      window = range[1] - range[0];
-      level = (range[1] + range[0])* 0.5;
-    }
+    double range[2];
+    mImage->GetScalarRange(range);
+    window = range[1] - range[0];
+    level = (range[1] + range[0])* 0.5;
     break;
   case 1:
     window = 2000;
     level = 0;
     break;
   case 2:
-    window = 350;
-    level = 60;
+    window = 400;
+    level = 20;
     break;
   case 3:
     window = 1500;