X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvSlicerManager.cxx;h=c23c1207ba891e4848751ebdac85efa26a228c27;hb=66c0b229be48fdbbe2d42bcb5fa461ab87461ae3;hp=53801929f8df7a51b7011483ee2f6b2f1f837b25;hpb=1df2c8867c511818511bbd2b0be560325a4944c5;p=clitk.git diff --git a/vv/vvSlicerManager.cxx b/vv/vvSlicerManager.cxx index 5380192..c23c120 100644 --- a/vv/vvSlicerManager.cxx +++ b/vv/vvSlicerManager.cxx @@ -1,7 +1,7 @@ /*========================================================================= Program: vv http://www.creatis.insa-lyon.fr/rio/vv - Authors belong to: + 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 @@ -26,19 +26,21 @@ #include "vvImageReader.h" #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 "vvBlendImageActor.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include #include #include #include +#include //---------------------------------------------------------------------------- vvSlicerManager::vvSlicerManager(int numberOfSlicers) @@ -69,11 +71,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); } //---------------------------------------------------------------------------- @@ -81,27 +84,22 @@ vvSlicerManager::vvSlicerManager(int numberOfSlicers) //---------------------------------------------------------------------------- vvSlicerManager::~vvSlicerManager() { - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - if (mSlicers[i] != NULL) - mSlicers[i]->Delete(); - } - if (mReader) - { - delete mReader; - } - if (mVectorReader) - { - delete mVectorReader; - } - if (mOverlayReader) - { - delete mOverlayReader; - } - if (mFusionReader) - { - delete mFusionReader; - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + if (mSlicers[i] != NULL) + mSlicers[i]->Delete(); + } + if (mReader) { + delete mReader; + } + if (mVectorReader) { + delete mVectorReader; + } + if (mOverlayReader) { + delete mOverlayReader; + } + if (mFusionReader) { + delete mFusionReader; + } if (mLandmarks) delete mLandmarks; } @@ -109,10 +107,20 @@ vvSlicerManager::~vvSlicerManager() //------------------------------------------------------------------------------ -void vvSlicerManager::SetFilename(std::string f) { - mFileName = f; +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; iSetFileName(f); + mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename)); + } + + if (number != 0) { + mFileName.append("_"+clitk::toString(number)); } } //------------------------------------------------------------------------------ @@ -121,10 +129,9 @@ void vvSlicerManager::SetFilename(std::string f) { //---------------------------------------------------------------------------- void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate) { - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->AddContour(contour,propagate); - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->AddContour(contour,propagate); + } } //---------------------------------------------------------------------------- @@ -141,7 +148,6 @@ void vvSlicerManager::ToggleContourSuperposition() //---------------------------------------------------------------------------- bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n) { - mFileName = filename; mType = type; if (mReader == NULL) mReader = new vvImageReader; @@ -150,30 +156,27 @@ bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n mReader->SetInputFilenames(filenames); mReader->Update(type); - mFileName = vtksys::SystemTools::GetFilenameName(mFileName); - mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName)); + 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) - { - mImage=mReader->GetOutput(); - 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; + //mBaseFileNameNumber = n; + + if (mReader->GetLastError().size() == 0) { + mImage=mReader->GetOutput(); + 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()); } - if (n!=0) { - // DD(mFileName); - mFileName.append("_"+clitk::toString(n)); + } else { + mLastError = mReader->GetLastError(); + return false; } + // if (n!=0) { + // // DD(mFileName); + // mFileName.append("_"+clitk::toString(n)); + // } return true; } //---------------------------------------------------------------------------- @@ -183,10 +186,9 @@ bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n void vvSlicerManager::SetImage(vvImage::Pointer image) { mImage=image; - for (unsigned int i = 0; i < mSlicers.size();i++) - { - mSlicers[i]->SetImage(image); - } + for (unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetImage(image); + } } //---------------------------------------------------------------------------- @@ -214,26 +216,22 @@ bool vvSlicerManager::SetImages(std::vector filenames,LoadedImageTy // DD(mBaseFileName); mBaseFileNameNumber = n; - if (mReader->GetLastError().size() == 0) - { - mImage=mReader->GetOutput(); - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetFileName(fileWithoutExtension); - mSlicers[i]->SetImage(mReader->GetOutput()); - } - } - else - { - mLastError = mReader->GetLastError(); - return false; + if (mReader->GetLastError().size() == 0) { + mImage=mReader->GetOutput(); + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetFileName(fileWithoutExtension); + mSlicers[i]->SetImage(mReader->GetOutput()); } + } else { + mLastError = mReader->GetLastError(); + return false; + } if (n!=0) { // DD(mFileName); mFileName.append("_"+clitk::toString(n)); // DD(mFileName); } - return true; + return true; } //---------------------------------------------------------------------------- @@ -243,29 +241,24 @@ bool vvSlicerManager::SetOverlay(std::string filename,int dim, std::string compo { mOverlayName = filename; mOverlayComponent = component; - if (dim > mImage->GetNumberOfDimensions()) - { - mLastError = " Overlay dimension cannot be greater then reference image!"; - return false; - } + if (dim > mImage->GetNumberOfDimensions()) { + mLastError = " Overlay dimension cannot be greater then reference image!"; + return false; + } if (mOverlayReader == NULL) mOverlayReader = new vvImageReader; std::vector filenames; filenames.push_back(filename); mOverlayReader->SetInputFilenames(filenames); mOverlayReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType); - if (mOverlayReader->GetLastError().size() == 0) - { - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetOverlay(mOverlayReader->GetOutput()); - } - } - else - { - mLastError = mOverlayReader->GetLastError(); - return false; + if (mOverlayReader->GetLastError().size() == 0) { + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetOverlay(mOverlayReader->GetOutput()); } + } else { + mLastError = mOverlayReader->GetLastError(); + return false; + } return true; } //---------------------------------------------------------------------------- @@ -276,29 +269,24 @@ bool vvSlicerManager::SetFusion(std::string filename,int dim, std::string compon { mFusionName = filename; mFusionComponent = component; - if (dim > mImage->GetNumberOfDimensions()) - { - mLastError = " Overlay dimension cannot be greater then reference image!"; - return false; - } + if (dim > mImage->GetNumberOfDimensions()) { + mLastError = " Overlay dimension cannot be greater then reference image!"; + return false; + } if (mFusionReader == NULL) mFusionReader = new vvImageReader; std::vector filenames; filenames.push_back(filename); mFusionReader->SetInputFilenames(filenames); mFusionReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType); - if (mFusionReader->GetLastError().size() == 0) - { - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetFusion(mFusionReader->GetOutput()); - } - } - else - { - mLastError = mFusionReader->GetLastError(); - return false; + if (mFusionReader->GetLastError().size() == 0) { + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetFusion(mFusionReader->GetOutput()); } + } else { + mLastError = mFusionReader->GetLastError(); + return false; + } double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange(); mFusionLevel = (fusRange[0]+fusRange[1])/2; mFusionWindow = fusRange[1]-fusRange[0]; @@ -314,12 +302,10 @@ bool vvSlicerManager::SetVF(std::string filename) mVectorReader = new vvImageReader; mVectorReader->SetInputFilename(filename); mVectorReader->Update(VECTORFIELD); - if (mVectorReader->GetLastError().size() != 0) - { - mLastError = mVectorReader->GetLastError(); - return false; - } - else + if (mVectorReader->GetLastError().size() != 0) { + mLastError = mVectorReader->GetLastError(); + return false; + } else return SetVF(mVectorReader->GetOutput(),filename); } //---------------------------------------------------------------------------- @@ -328,17 +314,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; } //---------------------------------------------------------------------------- @@ -349,31 +347,26 @@ void vvSlicerManager::SetExtractedImage(std::string filename,vvImage::Pointer im { 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); - } + 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(); + } 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(); + } } //---------------------------------------------------------------------------- @@ -431,11 +424,25 @@ 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); + mSlicers[i]->GetRenderWindow()->GetInteractor()-> + GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc); smc->Delete(); } //---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +void vvSlicerManager::LeftButtonReleaseEvent(int slicer) +{ + emit LeftButtonReleaseSignal(slicer); +} +//---------------------------------------------------------------------------- + + //---------------------------------------------------------------------------- void vvSlicerManager::SetTSlice(int slice) { @@ -445,12 +452,13 @@ void vvSlicerManager::SetTSlice(int slice) slice = mSlicers[0]->GetTMax(); if (mLandmarks) mLandmarks->SetTime(slice); - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + if (slice != mSlicers[i]->GetTSlice()) { mSlicers[i]->SetTSlice(slice); if (mSlicers[i]->GetImageActor()->GetVisibility()) - UpdateTSlice(i); + UpdateTSlice(i); } + } } //---------------------------------------------------------------------------- @@ -462,6 +470,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); } //---------------------------------------------------------------------------- @@ -483,10 +494,9 @@ void vvSlicerManager::SetPreviousTSlice(int originating_slicer) void vvSlicerManager::ToggleInterpolation() { bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate()); - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->GetImageActor()->SetInterpolate(interpolate); - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->GetImageActor()->SetInterpolate(interpolate); + } } //---------------------------------------------------------------------------- @@ -500,6 +510,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); @@ -510,10 +523,9 @@ void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer) //---------------------------------------------------------------------------- void vvSlicerManager::SetColorWindow(double s) { - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetColorWindow(s); - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetColorWindow(s); + } } //---------------------------------------------------------------------------- @@ -521,20 +533,18 @@ void vvSlicerManager::SetColorWindow(double s) //---------------------------------------------------------------------------- void vvSlicerManager::SetColorLevel(double s) { - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetColorLevel(s); - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetColorLevel(s); + } } //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- void vvSlicerManager::SetCursorVisibility(int s) { - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetCursorVisibility(s); - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetCursorVisibility(s); + } } //---------------------------------------------------------------------------- @@ -550,6 +560,10 @@ 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]) @@ -562,84 +576,78 @@ void vvSlicerManager::UpdateViews(int current,int slicer) y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] && y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] && z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] && - z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) - { - mSlicers[slicer]->UpdateCursorPosition(); - mSlicers[slicer]->SetCursorColor(10,212,255); + z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) { + mSlicers[slicer]->UpdateCursorPosition(); + mSlicers[slicer]->SetCursorColor(10,212,255); + + switch (mSlicers[slicer]->GetSliceOrientation()) { + case vtkImageViewer2::SLICE_ORIENTATION_XY: + if (mSlicers[slicer]->GetSlice() == (int)floor(z)) + mSlicers[slicer]->Render(); + else + mSlicers[slicer]->SetSlice((int)floor(z)); + break; + + case vtkImageViewer2::SLICE_ORIENTATION_XZ: + if (mSlicers[slicer]->GetSlice() == (int)floor(y)) + mSlicers[slicer]->Render(); + else + mSlicers[slicer]->SetSlice((int)floor(y)); + break; + + case vtkImageViewer2::SLICE_ORIENTATION_YZ: + if (mSlicers[slicer]->GetSlice() == (int)floor(x)) + mSlicers[slicer]->Render(); + else + mSlicers[slicer]->SetSlice((int)floor(x)); + break; + } - switch (mSlicers[slicer]->GetSliceOrientation()) - { + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + if (i != (unsigned int)slicer && mSlicers[i]->GetImageActor()->GetVisibility() + && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2 + && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) { + mSlicers[i]->SetCurrentPosition(mSlicers[slicer]->GetCurrentPosition()[0], + mSlicers[slicer]->GetCurrentPosition()[1], + mSlicers[slicer]->GetCurrentPosition()[2], + mSlicers[slicer]->GetTSlice()); + mSlicers[i]->UpdateCursorPosition(); + if (current) { //do not display corner annotation if image is the one picked + mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX, + -VTK_DOUBLE_MAX, mSlicers[slicer]->GetTSlice()); + mSlicers[i]->SetCursorColor(255,10,212); + } else { + mSlicers[i]->SetCursorColor(150,10,282); + } + switch (mSlicers[i]->GetSliceOrientation()) { case vtkImageViewer2::SLICE_ORIENTATION_XY: - if (mSlicers[slicer]->GetSlice() == (int)floor(z)) - mSlicers[slicer]->Render(); - else - mSlicers[slicer]->SetSlice((int)floor(z)); - break; + if (mSlicers[i]->GetSlice() == (int)floor(z)) + mSlicers[i]->Render(); + else + mSlicers[i]->SetSlice((int)floor(z)); + break; case vtkImageViewer2::SLICE_ORIENTATION_XZ: - if (mSlicers[slicer]->GetSlice() == (int)floor(y)) - mSlicers[slicer]->Render(); - else - mSlicers[slicer]->SetSlice((int)floor(y)); - break; + if (mSlicers[i]->GetSlice() == (int)floor(y)) + mSlicers[i]->Render(); + else + mSlicers[i]->SetSlice((int)floor(y)); + break; case vtkImageViewer2::SLICE_ORIENTATION_YZ: - if (mSlicers[slicer]->GetSlice() == (int)floor(x)) - mSlicers[slicer]->Render(); - else - mSlicers[slicer]->SetSlice((int)floor(x)); - break; - } - - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - if (i != (unsigned int)slicer && mSlicers[i]->GetImageActor()->GetVisibility() - && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2 - && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) - { - mSlicers[i]->SetCurrentPosition(mSlicers[slicer]->GetCurrentPosition()[0], - mSlicers[slicer]->GetCurrentPosition()[1], - mSlicers[slicer]->GetCurrentPosition()[2], - mSlicers[slicer]->GetTSlice()); - mSlicers[i]->UpdateCursorPosition(); - if (current) //do not display corner annotation if image is the one picked - { - mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX, - -VTK_DOUBLE_MAX, mSlicers[slicer]->GetTSlice()); - mSlicers[i]->SetCursorColor(255,10,212); - } - else - { - mSlicers[i]->SetCursorColor(150,10,282); - } - switch (mSlicers[i]->GetSliceOrientation()) - { - case vtkImageViewer2::SLICE_ORIENTATION_XY: - if (mSlicers[i]->GetSlice() == (int)floor(z)) - mSlicers[i]->Render(); - else - mSlicers[i]->SetSlice((int)floor(z)); - break; - - case vtkImageViewer2::SLICE_ORIENTATION_XZ: - if (mSlicers[i]->GetSlice() == (int)floor(y)) - mSlicers[i]->Render(); - else - mSlicers[i]->SetSlice((int)floor(y)); - break; - - case vtkImageViewer2::SLICE_ORIENTATION_YZ: - if (mSlicers[i]->GetSlice() == (int)floor(x)) - mSlicers[i]->Render(); - else - mSlicers[i]->SetSlice((int)floor(x)); - break; - } - UpdateSlice(i); - UpdateTSlice(i); - } + if (mSlicers[i]->GetSlice() == (int)floor(x)) + mSlicers[i]->Render(); + else + mSlicers[i]->SetSlice((int)floor(x)); + break; } + // DD("UpdateViews::"); + // DD(i); + UpdateSlice(i); + UpdateTSlice(i); + } } + } } //---------------------------------------------------------------------------- @@ -659,18 +667,82 @@ void vvSlicerManager::UpdateLinked(int slicer) y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] && y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] && z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] && - z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) - { - for (std::list::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) - { - emit UpdateLinkManager(*i, slicer,mSlicers[slicer]->GetCurrentPosition()[0], - mSlicers[slicer]->GetCurrentPosition()[1], - mSlicers[slicer]->GetCurrentPosition()[2],mSlicers[slicer]->GetTSlice()); - } + z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) { + for (std::list::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) { + emit UpdateLinkManager(*i, slicer,mSlicers[slicer]->GetCurrentPosition()[0], + mSlicers[slicer]->GetCurrentPosition()[1], + mSlicers[slicer]->GetCurrentPosition()[2],mSlicers[slicer]->GetTSlice()); } + } } //---------------------------------------------------------------------------- +//---------------------------------------------------------------------------- +void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *slicer, bool bPropagate) +{ + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + vtkCamera *camera = mSlicers[i] ->GetRenderer()->GetActiveCamera(); + vtkCamera *refCam = slicer->GetRenderer()->GetActiveCamera(); + camera->SetParallelScale(refCam->GetParallelScale()); + + double position[3], focal[3]; + camera->GetPosition(position); + camera->GetFocalPoint(focal); + + double refPosition[3], refFocal[3]; + refCam->GetPosition(refPosition); + refCam->GetFocalPoint(refFocal); + + if(slicer->GetSliceOrientation()==mSlicers[i]->GetSliceOrientation()) { + for(int i=0; i<3; i++) { + position[i] = refPosition[i]; + focal[i] = refFocal[i]; + } + } + + if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) { + if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) { + position[0] = refPosition[0]; + focal[0] = refFocal[0]; + } + if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) { + position[1] = refPosition[1]; + focal[1] = refFocal[1]; + } + } + + if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) { + if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) { + position[2] = refPosition[2]; + focal[2] = refFocal[2]; + } + if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) { + position[0] = refPosition[0]; + focal[0] = refFocal[0]; + } + } + + if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) { + if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) { + position[1] = refPosition[1]; + focal[1] = refFocal[1]; + } + if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) { + position[2] = refPosition[2]; + focal[2] = refFocal[2]; + } + } + + camera->SetFocalPoint(focal); + camera->SetPosition(position); + + if(bPropagate) + for (std::list::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) + emit UpdateLinkedNavigation(*i, this); + } + Render(); +} +//---------------------------------------------------------------------------- //---------------------------------------------------------------------------- double vvSlicerManager::GetColorWindow() @@ -695,10 +767,11 @@ double vvSlicerManager::GetColorLevel() //---------------------------------------------------------------------------- void vvSlicerManager::Render() { - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->Render(); - } + // DD("vvSlicerManager::Render"); + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + // DD(i); + mSlicers[i]->Render(); + } } //---------------------------------------------------------------------------- @@ -717,10 +790,9 @@ void vvSlicerManager::Reload() { mReader->Update(mType); mImage=mReader->GetOutput(); - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetImage(mImage); - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetImage(mImage); + } } //---------------------------------------------------------------------------- @@ -729,11 +801,10 @@ void vvSlicerManager::Reload() void vvSlicerManager::ReloadFusion() { mFusionReader->Update(); - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetFusion(mFusionReader->GetOutput()); - mSlicers[i]->Render(); - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetFusion(mFusionReader->GetOutput()); + mSlicers[i]->Render(); + } } //---------------------------------------------------------------------------- @@ -742,11 +813,10 @@ void vvSlicerManager::ReloadFusion() void vvSlicerManager::ReloadOverlay() { mOverlayReader->Update(); - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetOverlay(mOverlayReader->GetOutput()); - mSlicers[i]->Render(); - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetOverlay(mOverlayReader->GetOutput()); + mSlicers[i]->Render(); + } } //---------------------------------------------------------------------------- @@ -756,11 +826,10 @@ void vvSlicerManager::ReloadVF() { mVectorReader->Update(VECTORFIELD); //deletes the old images through the VF::Init() function mVF=mVectorReader->GetOutput(); - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetVF(mVF); - mSlicers[i]->Render(); - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetVF(mVF); + mSlicers[i]->Render(); + } } //---------------------------------------------------------------------------- @@ -768,18 +837,16 @@ void vvSlicerManager::ReloadVF() //---------------------------------------------------------------------------- void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index) { - for (unsigned int i = 0; i < mSlicers.size();i++) - { - mSlicers[i]->RemoveActor(actor_type,overlay_index); - } - if (actor_type=="vector") - { - mVF=NULL; - if (mVectorReader) { - delete mVectorReader; - mVectorReader=NULL; - } + for (unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->RemoveActor(actor_type,overlay_index); + } + if (actor_type=="vector") { + mVF=NULL; + if (mVectorReader) { + delete mVectorReader; + mVectorReader=NULL; } + } } //---------------------------------------------------------------------------- @@ -788,11 +855,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 - for ( unsigned int i = 0; i < mSlicers.size(); i++) - { - mSlicers[i]->SetDisplayMode(0); - mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor()); - } + for ( unsigned int i = 0; i < mSlicers.size(); i++) { + mSlicers[i]->SetDisplayMode(0); + mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor()); + } } //---------------------------------------------------------------------------- @@ -822,93 +888,85 @@ void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer) Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] && Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] && Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] && - Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) - { - value = mSlicers[slicer]->GetInput()->GetScalarComponentAsDouble( - (int)floor(X), - (int)floor(Y), - (int)floor(Z),0); - if (mSlicers[slicer]->GetVFActor() && mSlicers[slicer]->GetVFActor()->GetVisibility()) - { - displayVec = 1; - unsigned int currentTime = mSlicers[slicer]->GetTSlice(); - vtkImageData *vf = NULL; - - if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime) - vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime]; - else - vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0]; - - if (vf) - { - double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0]; - double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1]; - double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2]; - xVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),0); - yVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),1); - zVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),2); - valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec); - } - } - if (mSlicers[slicer]->GetOverlayActor() && mSlicers[slicer]->GetOverlayActor()->GetVisibility()) - { - displayOver = 1; - double Xover = (x - mSlicers[slicer]->GetOverlay()->GetOrigin()[0]) - /mSlicers[slicer]->GetOverlay()->GetSpacing()[0]; - double Yover = (y - mSlicers[slicer]->GetOverlay()->GetOrigin()[1]) - /mSlicers[slicer]->GetOverlay()->GetSpacing()[1]; - double Zover = (z - mSlicers[slicer]->GetOverlay()->GetOrigin()[2]) - /mSlicers[slicer]->GetOverlay()->GetSpacing()[2]; - if (Xover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[0] && - Xover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[1] && - Yover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[2] && - Yover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[3] && - Zover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[4] && - Zover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[5]) - { - valueOver = static_cast(mSlicers[slicer]->GetOverlayMapper()->GetInput())-> - GetScalarComponentAsDouble( - (int)floor(Xover), - (int)floor(Yover), - (int)floor(Zover),0); - } - } - if (mSlicers[slicer]->GetFusionActor() && mSlicers[slicer]->GetFusionActor()->GetVisibility()) - { - displayFus = 1; - double Xfus = (x - mSlicers[slicer]->GetFusion()->GetOrigin()[0]) - /mSlicers[slicer]->GetFusion()->GetSpacing()[0]; - double Yfus = (y - mSlicers[slicer]->GetFusion()->GetOrigin()[1]) - /mSlicers[slicer]->GetFusion()->GetSpacing()[1]; - double Zfus = (z - mSlicers[slicer]->GetFusion()->GetOrigin()[2]) - /mSlicers[slicer]->GetFusion()->GetSpacing()[2]; - if (Xfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[0] && - Xfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[1] && - Yfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[2] && - Yfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[3] && - Zfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[4] && - Zfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[5]) - { - valueFus = static_cast(mSlicers[slicer]->GetFusionMapper()->GetInput())-> - GetScalarComponentAsDouble( - (int)floor(Xfus), - (int)floor(Yfus), - (int)floor(Zfus),0); - } - } - emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(), - x,y,z,X,Y,Z,value); - emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec); - emit UpdateOverlay(displayOver,valueOver,value); - emit UpdateFusion(displayFus,valueFus); - for (unsigned int i = 0; i < mSlicers.size(); i++) - { - if (mSlicers[i]->GetImageActor()->GetVisibility() == 1) - emit UpdateWindows(i,mSlicers[i]->GetSliceOrientation(),mSlicers[i]->GetSlice()); - else - emit UpdateWindows(i,-1,-1); - } + Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) { + value = mSlicers[slicer]->GetInput()->GetScalarComponentAsDouble( + (int)floor(X), + (int)floor(Y), + (int)floor(Z),0); + if (mSlicers[slicer]->GetVFActor() && mSlicers[slicer]->GetVFActor()->GetVisibility()) { + displayVec = 1; + unsigned int currentTime = mSlicers[slicer]->GetTSlice(); + vtkImageData *vf = NULL; + + if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime) + vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime]; + else + vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0]; + + if (vf) { + double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0]; + double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1]; + double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2]; + xVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),0); + yVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),1); + zVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),2); + valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec); + } + } + if (mSlicers[slicer]->GetOverlayActor() && mSlicers[slicer]->GetOverlayActor()->GetVisibility()) { + displayOver = 1; + double Xover = (x - mSlicers[slicer]->GetOverlay()->GetOrigin()[0]) + /mSlicers[slicer]->GetOverlay()->GetSpacing()[0]; + double Yover = (y - mSlicers[slicer]->GetOverlay()->GetOrigin()[1]) + /mSlicers[slicer]->GetOverlay()->GetSpacing()[1]; + double Zover = (z - mSlicers[slicer]->GetOverlay()->GetOrigin()[2]) + /mSlicers[slicer]->GetOverlay()->GetSpacing()[2]; + if (Xover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[0] && + Xover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[1] && + Yover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[2] && + Yover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[3] && + Zover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[4] && + Zover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[5]) { + valueOver = static_cast(mSlicers[slicer]->GetOverlayMapper()->GetInput())-> + GetScalarComponentAsDouble( + (int)floor(Xover), + (int)floor(Yover), + (int)floor(Zover),0); + } + } + if (mSlicers[slicer]->GetFusionActor() && mSlicers[slicer]->GetFusionActor()->GetVisibility()) { + displayFus = 1; + double Xfus = (x - mSlicers[slicer]->GetFusion()->GetOrigin()[0]) + /mSlicers[slicer]->GetFusion()->GetSpacing()[0]; + double Yfus = (y - mSlicers[slicer]->GetFusion()->GetOrigin()[1]) + /mSlicers[slicer]->GetFusion()->GetSpacing()[1]; + double Zfus = (z - mSlicers[slicer]->GetFusion()->GetOrigin()[2]) + /mSlicers[slicer]->GetFusion()->GetSpacing()[2]; + if (Xfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[0] && + Xfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[1] && + Yfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[2] && + Yfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[3] && + Zfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[4] && + Zfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[5]) { + valueFus = static_cast(mSlicers[slicer]->GetFusionMapper()->GetInput())-> + GetScalarComponentAsDouble( + (int)floor(Xfus), + (int)floor(Yfus), + (int)floor(Zfus),0); + } + } + emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(), + x,y,z,X,Y,Z,value); + emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec); + emit UpdateOverlay(displayOver,valueOver,value); + emit UpdateFusion(displayFus,valueFus); + for (unsigned int i = 0; i < mSlicers.size(); i++) { + if (mSlicers[i]->GetImageActor()->GetVisibility() == 1) + emit UpdateWindows(i,mSlicers[i]->GetSliceOrientation(),mSlicers[i]->GetSlice()); + else + emit UpdateWindows(i,-1,-1); } + } } //---------------------------------------------------------------------------- @@ -932,7 +990,16 @@ 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()); + mSlicers[slicer]->Render(); // DS <-- I add this, this could/must be the only Render ... + mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice(); } //---------------------------------------------------------------------------- @@ -940,7 +1007,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()); } //---------------------------------------------------------------------------- @@ -949,8 +1028,8 @@ void vvSlicerManager::UpdateTSlice(int slicer) void vvSlicerManager::UpdateSliceRange(int slicer) { emit UpdateSliceRange(slicer, - mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1], - 0,mSlicers[slicer]->GetTMax()); + mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1], + 0,mSlicers[slicer]->GetTMax()); } //---------------------------------------------------------------------------- @@ -962,55 +1041,49 @@ void vvSlicerManager::SetPreset(int preset) double window = mSlicers[0]->GetColorWindow(); double level = mSlicers[0]->GetColorLevel(); - std::string component_type=mImage->GetScalarTypeAsString(); - 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; - } - break; - case 1: + 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; - break; - case 2: - window = 350; - level = 60; - break; - case 3: - window = 1500; - level = -500; - break; - case 4: - window = 1000; - level = 500; - break; - case 5: - window = 1; - level = 0.5; - break; - case 6: - break; - case 7: - window=1.; - level=0.; - break; + } else { + 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; + break; + case 3: + window = 1500; + level = -500; + break; + case 4: + window = 1000; + level = 500; + break; + case 5: + window = 1; + level = 0.5; + break; + case 6: + break; + case 7: + window=1.; + level=0.; + break; + } mPreset = preset; this->SetColorWindow(window); this->SetColorLevel(level); @@ -1030,6 +1103,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(); } //---------------------------------------------------------------------------- @@ -1054,68 +1128,65 @@ void vvSlicerManager::SetColorMap(int colormap) double level = mSlicers[0]->GetWindowLevel()->GetLevel(); vtkLookupTable* LUT = static_cast(mSlicers[0]->GetWindowLevel()->GetLookupTable()); - switch (colormap) - { - case -1: - break; - case 0: - LUT = NULL; - break; - case 1: - if (LUT == NULL) - LUT = vtkLookupTable::New(); - LUT->SetValueRange(0,1); - LUT->SetSaturationRange(1,1); - LUT->SetHueRange(0,0.18); - break; - case 2: - if (LUT == NULL) - LUT = vtkLookupTable::New(); - LUT->SetValueRange(0,1); - LUT->SetSaturationRange(1,1); - LUT->SetHueRange(0.4,0.80); - break; - case 3: - if (LUT == NULL) - LUT = vtkLookupTable::New(); - LUT->SetValueRange(0,1); - LUT->SetSaturationRange(1,1); - LUT->SetHueRange(0,1); - break; - case 5: - if (LUT == NULL) - LUT = vtkLookupTable::New(); - LUT->SetValueRange(0.,1); - LUT->SetSaturationRange(1,1); - LUT->SetHueRange(1,0.1); - //LUT->SetRampToLinear(); - break; - } - if (LUT) - { - LUT->SetTableRange(level-fabs(window)/4,level+fabs(window)/4); - LUT->Build(); - } + switch (colormap) { + case -1: + break; + case 0: + LUT = NULL; + break; + case 1: + if (LUT == NULL) + LUT = vtkLookupTable::New(); + LUT->SetValueRange(0,1); + LUT->SetSaturationRange(1,1); + LUT->SetHueRange(0,0.18); + break; + case 2: + if (LUT == NULL) + LUT = vtkLookupTable::New(); + LUT->SetValueRange(0,1); + LUT->SetSaturationRange(1,1); + LUT->SetHueRange(0.4,0.80); + break; + case 3: + if (LUT == NULL) + LUT = vtkLookupTable::New(); + LUT->SetValueRange(0,1); + LUT->SetSaturationRange(1,1); + LUT->SetHueRange(0,1); + break; + case 5: + if (LUT == NULL) + LUT = vtkLookupTable::New(); + LUT->SetValueRange(0.,1); + LUT->SetSaturationRange(1,1); + LUT->SetHueRange(1,0.1); + //LUT->SetRampToLinear(); + break; + } + if (LUT) { + LUT->SetTableRange(level-fabs(window)/4,level+fabs(window)/4); + LUT->Build(); + } vtkLookupTable* fusLUT = NULL; - if (mSlicers[0]->GetFusion()) - { - fusLUT = vtkLookupTable::New(); - double fusRange [2]; - fusRange[0] = mFusionLevel - mFusionWindow/2; - fusRange[1] = mFusionLevel + mFusionWindow/2; - fusLUT->SetTableRange(fusRange[0],fusRange[1]); - fusLUT->SetValueRange(1,1); - fusLUT->SetSaturationRange(1,1); - if (mFusionColorMap == 1) - fusLUT->SetHueRange(0,0.18); - else if (mFusionColorMap == 2) - fusLUT->SetHueRange(0.4,0.80); - else if (mFusionColorMap == 3) - fusLUT->SetHueRange(0,1); - fusLUT->Build(); - if (mFusionColorMap == 0) - fusLUT = NULL; - } + if (mSlicers[0]->GetFusion()) { + fusLUT = vtkLookupTable::New(); + double fusRange [2]; + fusRange[0] = mFusionLevel - mFusionWindow/2; + fusRange[1] = mFusionLevel + mFusionWindow/2; + fusLUT->SetTableRange(fusRange[0],fusRange[1]); + fusLUT->SetValueRange(1,1); + fusLUT->SetSaturationRange(1,1); + if (mFusionColorMap == 1) + fusLUT->SetHueRange(0,0.18); + else if (mFusionColorMap == 2) + fusLUT->SetHueRange(0.4,0.80); + else if (mFusionColorMap == 3) + fusLUT->SetHueRange(0,1); + fusLUT->Build(); + if (mFusionColorMap == 0) + fusLUT = NULL; + } for ( unsigned int i = 0; i < mSlicers.size(); i++) { if (mSlicers[i]->GetOverlay() && mSlicers[i]->GetOverlayActor()->GetVisibility()) { vtkLookupTable* supLUT = vtkLookupTable::New(); @@ -1131,27 +1202,24 @@ void vvSlicerManager::SetColorMap(int colormap) invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360); invLUT->Build(); dynamic_cast(mSlicers[i]->GetWindowLevel()) - ->SetWindowLevelMode(true); + ->SetWindowLevelMode(true); mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT); mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT); invLUT->Delete(); supLUT->Delete(); + } else if (mSlicers[i]->GetOverlay()) { + //dynamic_cast(mSlicers[i]->GetWindowLevel()) + //->SetWindowLevelMode(false); + mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT); + } else { + mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT); + } + if (mSlicers[i]->GetFusion() && mSlicers[i]->GetFusionActor()->GetVisibility()) { + mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100); + mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT); + mSlicers[i]->GetFusionMapper()->SetWindow(mFusionWindow); + mSlicers[i]->GetFusionMapper()->SetLevel(mFusionLevel); } - else if (mSlicers[i]->GetOverlay()) - { - //dynamic_cast(mSlicers[i]->GetWindowLevel()) - //->SetWindowLevelMode(false); - mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT); - } - else - { - mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT); - } - if (mSlicers[i]->GetFusion() && mSlicers[i]->GetFusionActor()->GetVisibility()) - { - mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100); - mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT); - } } if (fusLUT) fusLUT->Delete(); @@ -1164,12 +1232,11 @@ void vvSlicerManager::SetColorMap(int colormap) //---------------------------------------------------------------------------- vvLandmarks* vvSlicerManager::GetLandmarks() { - if (mLandmarks == NULL) - { - mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1); - for (unsigned int i = 0; i < mSlicers.size(); i++) - mSlicers[i]->SetLandmarks(mLandmarks); - } + if (mLandmarks == NULL) { + mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1); + for (unsigned int i = 0; i < mSlicers.size(); i++) + mSlicers[i]->SetLandmarks(mLandmarks); + } return mLandmarks; } //---------------------------------------------------------------------------- @@ -1181,11 +1248,42 @@ void vvSlicerManager::AddLandmark(float x,float y,float z,float t) double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0]; double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1]; double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2]; - double value = mSlicers[0]->GetInput()->GetScalarComponentAsDouble( - (int)x_index, - (int)y_index, - (int)z_index,0); - this->GetLandmarks()->AddLandmark(x,y,z,t,value); - emit LandmarkAdded(); + if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0] && + x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1] && + y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2] && + y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3] && + z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4] && + z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]) { + double value = mSlicers[0]->GetInput()->GetScalarComponentAsDouble( + (int)x_index, + (int)y_index, + (int)z_index,0); + this->GetLandmarks()->AddLandmark(x,y,z,t,value); + 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); +} + +//----------------------------------------------------------------------------