-/*=========================================================================\r
- Program: vv http://www.creatis.insa-lyon.fr/rio/vv\r
-\r
- Authors belong to:\r
- - University of LYON http://www.universite-lyon.fr/\r
- - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr\r
- - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr\r
-\r
- This software is distributed WITHOUT ANY WARRANTY; without even\r
- the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r
- PURPOSE. See the copyright notices for more information.\r
-\r
- It is distributed under dual licence\r
-\r
- - BSD See included LICENSE.txt file\r
- - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html\r
- ======================================================================-====*/\r
-\r
-#include "vvSlicerManager.h"\r
-#include "vvSlicer.h"\r
-#include "vvImage.h"\r
-#include "vvSlicerManagerCommand.h"\r
-#include "vvInteractorStyleNavigator.h"\r
-#include "vvLandmarks.h"\r
-#include "vvMesh.h"\r
-#include "vvBlendImageActor.h"\r
-\r
-#include <vtkVersion.h>\r
-#include <vtkStreamingDemandDrivenPipeline.h>\r
-#include <vtkInformation.h>\r
-#include <vtkImageActor.h>\r
-#include <vtkImageData.h>\r
-#include <vtkRenderWindow.h>\r
-#include <vtkRendererCollection.h>\r
-#include <vtkRenderWindowInteractor.h>\r
-#include <vtkImageMapToWindowLevelColors.h>\r
-#include <vtkWindowLevelLookupTable.h>\r
-#include <vtkColorTransferFunction.h>\r
-#include <vtkImageClip.h>\r
-#include <vtkLODActor.h>\r
-#include <vtkPointData.h>\r
-#include <vtksys/SystemTools.hxx>\r
-#include <vtkCamera.h>\r
-\r
-#include <qfileinfo.h>\r
-#include <QMessageBox>\r
-//----------------------------------------------------------------------------\r
-vvSlicerManager::vvSlicerManager(int numberOfSlicers)\r
-{ \r
-\r
- connect(this, SIGNAL(callAddLandmark(float,float,float,float)), this, SLOT(AddLandmark(float,float,float,float)));\r
-\r
- mFileName = "";\r
- mId = "";\r
- mVFName = "";\r
- mOverlayName = "";\r
- mFusionName = "";\r
- mVFId = "";\r
- mLastError = "";\r
- mType = vvImageReader::UNDEFINEDIMAGETYPE;\r
- mColorMap = 0;\r
- mPreset = 0;\r
- mOverlayColor = 130;\r
-\r
- mFusionOpacity = 30;\r
- mFusionThresOpacity = 1;\r
- mFusionColorMap = 3;\r
- mFusionWindow = 1000;\r
- mFusionLevel = 1000;\r
- mFusionShowLegend = true;\r
- \r
- mFusionSequenceInvolvementCode = -1;\r
- mFusionSequenceIndexLinkedManager = -1;\r
- mFusionSequenceFrameIndex = -1;\r
- mFusionSequenceNbFrames = 0;\r
- mFusionSequenceSpatialSyncFlag = false;\r
- mFusionSequenceTemporalSyncFlag = false;\r
-\r
- mLandmarks = NULL;\r
- mLinkedId.resize(0);\r
-\r
- for ( int i = 0; i < numberOfSlicers; i++) {\r
- mSlicers.push_back(vtkSmartPointer<vvSlicer>::New());\r
- mSlicers[i]->SetSlicerNumber(i);\r
- }\r
- mSelectedSlicer = -1;\r
- \r
- mPreviousSlice.resize(numberOfSlicers, 0);\r
- mPreviousTSlice.resize(numberOfSlicers, 0);\r
- mSlicingPreset = WORLD_SLICING;\r
-\r
- \r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-vvSlicerManager::~vvSlicerManager()\r
-{ \r
- if (mLandmarks)\r
- delete mLandmarks;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//------------------------------------------------------------------------------\r
-void vvSlicerManager::SetFilename(std::string filename, int number)\r
-{ \r
- mFileName = filename;\r
- mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
- mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
- mBaseFileNameNumber = number;\r
-\r
- mFileName = mBaseFileName;\r
- if (number != 0) {\r
- mFileName.append("_"+clitk::toString(number));\r
- }\r
- mFileName.append(vtksys::SystemTools::GetFilenameLastExtension(filename));\r
-\r
- for(unsigned int i=0; i<mSlicers.size(); i++) {\r
- mSlicers[i]->SetFileName(mFileName);//vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));\r
- }\r
- \r
-}\r
-//------------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)\r
-{ \r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->AddContour(contour,propagate);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::ToggleContourSuperposition()\r
-{ \r
- for ( unsigned int i = 0; i < mSlicers.size(); i++)\r
- mSlicers[i]->ToggleContourSuperposition();\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-std::string vvSlicerManager::GetListOfAbsoluteFilePathInOneString(const std::string &actorType)\r
-{ \r
- vvImageReader *reader = NULL;\r
-\r
- if(actorType=="image")\r
- reader = mReader;\r
- else if(actorType=="overlay")\r
- reader = mOverlayReader;\r
- else if(actorType=="fusion")\r
- reader = mFusionReader;\r
- else if(actorType=="vector")\r
- reader = mVectorReader;\r
- else if(actorType=="fusionSequence")\r
- reader = mFusionSequenceReader;\r
-\r
- if(!reader)\r
- return "";\r
-\r
- std::string list;\r
- for(unsigned int i=0; i<reader->GetInputFilenames().size(); i++){\r
- QFileInfo fileinfo(reader->GetInputFilenames()[i].c_str()); //Do not show the path\r
- if(i)\r
- list += '\n';\r
- list += fileinfo.absoluteFilePath().toStdString();\r
- }\r
- return list;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-bool vvSlicerManager::SetImage(std::string filename, vvImageReader::LoadedImageType type, int n, unsigned int slice)\r
-{ \r
- mType = type;\r
- if (mReader.IsNull())\r
- mReader = vvImageReader::New();\r
- std::vector<std::string> filenames;\r
- filenames.push_back(filename);\r
- mReader->SetInputFilenames(filenames);\r
- mReader->SetSlice(slice); // Only used for SLICED type\r
- mReader->Update(type);\r
-\r
- SetFilename(filename, n);\r
- // mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
- //mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
- //mBaseFileNameNumber = n;\r
-\r
- if (mReader->GetLastError().size() == 0) {\r
- mImage=mReader->GetOutput();\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));\r
- mSlicers[i]->SetImage(mReader->GetOutput());\r
- }\r
- } else {\r
- mLastError = mReader->GetLastError();\r
- return false;\r
- }\r
- // if (n!=0) {\r
- // mFileName.append("_"+clitk::toString(n));\r
- // }\r
- return true;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetImage(vvImage::Pointer image)\r
-{ \r
- mImage=image;\r
- for (unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetImage(image);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-bool vvSlicerManager::SetImages(std::vector<std::string> filenames, vvImageReader::LoadedImageType type, int n)\r
-{ \r
- mType = type;\r
- std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);\r
- if (type == vvImageReader::DICOM)\r
- fileWithoutExtension += "_dicom";\r
- else if (type == vvImageReader::MERGED)\r
- fileWithoutExtension += "_merged";\r
- else if (type == vvImageReader::MERGEDWITHTIME)\r
- fileWithoutExtension += "_merged_wt";\r
-\r
- mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
- mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);\r
- if (mReader.IsNull())\r
- mReader = vvImageReader::New();\r
- mReader->SetInputFilenames(filenames);\r
- mReader->Update(type);\r
-\r
- mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
- mBaseFileNameNumber = n;\r
-\r
- if (mReader->GetLastError().size() == 0) {\r
- mImage=mReader->GetOutput();\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetFileName(fileWithoutExtension);\r
- mSlicers[i]->SetImage(mReader->GetOutput());\r
- }\r
- } else {\r
- mLastError = mReader->GetLastError();\r
- return false;\r
- }\r
- if (n!=0) {\r
- mFileName.append("_"+clitk::toString(n));\r
- }\r
- return true;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-bool vvSlicerManager::SetOverlay(std::vector<std::string> filenames,int dim, std::string component, vvImageReader::LoadedImageType type)\r
-{ \r
- mOverlayName = filenames[0];\r
- mOverlayComponent = component;\r
- if (dim > mImage->GetNumberOfDimensions()) {\r
- mLastError = " Overlay dimension cannot be greater than reference image!";\r
- return false;\r
- }\r
- if (mOverlayReader.IsNull())\r
- mOverlayReader = vvImageReader::New();\r
- mOverlayReader->SetInputFilenames(filenames);\r
- mOverlayReader->Update(type);\r
- if (mOverlayReader->GetLastError().size() == 0) {\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());\r
- }\r
- } else {\r
- mLastError = mOverlayReader->GetLastError();\r
- return false;\r
- }\r
- return true;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-bool vvSlicerManager::SetFusion(std::vector<std::string> filenames,int dim, std::string component, vvImageReader::LoadedImageType type)\r
-{ \r
- mFusionName = filenames[0];\r
- mFusionComponent = component;\r
- if (dim > mImage->GetNumberOfDimensions()) {\r
- mLastError = " Fusion dimension cannot be greater than reference image!";\r
- return false;\r
- }\r
- if (mFusionReader.IsNull())\r
- mFusionReader = vvImageReader::New();\r
- mFusionReader->SetInputFilenames(filenames);\r
- mFusionReader->Update(type);\r
- if (mFusionReader->GetLastError().size() == 0) {\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetFusion(mFusionReader->GetOutput());\r
- }\r
- } else {\r
- mLastError = mFusionReader->GetLastError();\r
- return false;\r
- }\r
- double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
- mFusionLevel = (fusRange[0]+fusRange[1])/2;\r
- mFusionWindow = fusRange[1]-fusRange[0];\r
-\r
- return true;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-//this function is called by vvMainWindow::AddFusionSequence for the primary sequence (CT), while the given files constitute the secondary sequence.\r
-bool vvSlicerManager::SetFusionSequence(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type)\r
-{ \r
- mFusionSequenceInvolvementCode = 0;\r
-\r
- mFusionName = filenames[0];\r
- mFusionComponent = component;\r
-\r
- if (dim > mImage->GetNumberOfDimensions()) {\r
- mLastError = " Fusion Sequence dimension cannot be greater than reference image!";\r
- return false;\r
- }\r
-\r
- if (mFusionSequenceReader.IsNull())\r
- mFusionSequenceReader = vvImageReader::New();\r
-\r
- mFusionSequenceReader->SetInputFilenames(filenames);\r
- mFusionSequenceReader->Update(type);\r
-\r
-\r
- if (mFusionSequenceReader->GetLastError().size() == 0) {\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetFusion(mFusionSequenceReader->GetOutput(), mFusionSequenceInvolvementCode);\r
- }\r
- } else {\r
- mLastError = mFusionSequenceReader->GetLastError();\r
- return false;\r
- }\r
- double *fusRange = mFusionSequenceReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
- mFusionLevel = (fusRange[0]+fusRange[1])/2;\r
- mFusionWindow = fusRange[1]-fusRange[0];\r
-\r
- //store the initial transform matrices of each frame, and reset them to identity\r
- mFusionSequenceListInitialTransformMatrices.clear();\r
- for (unsigned i=0 ; i<mFusionSequenceReader->GetOutput()->GetTransform().size() ; i++) {\r
- AddFusionSequenceInitialTransformMatrices( mFusionSequenceReader->GetOutput()->GetTransform()[i]->GetMatrix() );\r
- mFusionSequenceReader->GetOutput()->GetTransform()[i]->Identity();\r
- mFusionSequenceReader->GetOutput()->GetTransform()[i]->Update();\r
- }\r
-\r
- //adjust the time slider in the overlay panel\r
- mFusionSequenceNbFrames = mFusionSequenceReader->GetOutput()->GetTransform().size(); \r
- mFusionSequenceFrameIndex = std::max<int>( 0, std::min<int>(mFusionSequenceFrameIndex, mFusionSequenceNbFrames));\r
-\r
- return true;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-bool vvSlicerManager::SetVF(std::string filename)\r
-{ \r
- if (mVectorReader.IsNull())\r
- mVectorReader = vvImageReader::New();\r
- mVectorReader->SetInputFilename(filename);\r
- \r
- if (mType == vvImageReader::IMAGEWITHTIME)\r
- mVectorReader->Update(vvImageReader::VECTORFIELDWITHTIME);\r
- else\r
- mVectorReader->Update(vvImageReader::VECTORFIELD);\r
- if (mVectorReader->GetLastError().size() != 0) {\r
- mLastError = mVectorReader->GetLastError();\r
- return false;\r
- } else\r
- return SetVF(mVectorReader->GetOutput(),filename);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)\r
-{ \r
- if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions()) {\r
- mLastError = "Sorry, vector field dimension cannot be greater then reference image.";\r
- return false;\r
- }\r
- if (vf->GetNumberOfDimensions() == 4) {\r
- if (vf->GetSpacing()[3] != mImage->GetSpacing()[3]) {\r
- mLastError = "Sorry, vector field time spacing cannot be different from time spacing of the reference image.";\r
- return false;\r
- }\r
- if (vf->GetOrigin()[3] != mImage->GetOrigin()[3]) {\r
- mLastError = "Sorry, vector field time origin cannot be different from time origin of the reference image.";\r
- return false;\r
- }\r
- }\r
- mVF=vf;\r
- mVFName = filename;\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetVF(vf);\r
- }\r
- return true;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-vvSlicer* vvSlicerManager::GetSlicer(int i)\r
-{ \r
- return mSlicers[i];\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::UpdateSlicer(int num, bool state)\r
-{ \r
- if (mSlicers[num]->GetImage()) {\r
- mSlicers[num]->SetDisplayMode(state);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetSlicerWindow(int i, vtkRenderWindow* RW)\r
-{ \r
- mSlicers[i]->SetRenderWindow(i,RW);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* style)\r
-{ \r
- vvSlicerManagerCommand *smc = vvSlicerManagerCommand::New();\r
- smc->SM = this;\r
- smc->SetSlicerNumber(i);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);\r
-\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);\r
- // mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- // GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);\r
- mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
- GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc);\r
- smc->Delete();\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::LeftButtonReleaseEvent(int slicer)\r
-{ \r
- emit LeftButtonReleaseSignal(slicer);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::EmitMousePositionUpdated(int slicer)\r
-{ \r
- emit MousePositionUpdatedSignal(slicer);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::EmitKeyPressed(std::string KeyPress)\r
-{ \r
- emit KeyPressedSignal(KeyPress);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetSliceOrientation(int slicer, int orientation)\r
-{ \r
- mSlicers[slicer]->SetSliceOrientation(orientation);\r
- emit UpdateOrientation(slicer, orientation);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-int vvSlicerManager::GetTSlice()\r
-{ \r
- return mSlicers[0]->GetTSlice();\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetTSlice(int slice, bool updateLinkedImages)\r
-{ \r
- if (!updateLinkedImages) { //for fusionSequence, TMax / MaxCurrentTSlice are irrelevant.\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetTSlice(slice, updateLinkedImages);\r
- UpdateTSlice(i);\r
- }\r
- return;\r
- }\r
-\r
- if (slice < 0)\r
- slice = 0;\r
- else if (slice > mSlicers[0]->GetTMax())\r
- slice = mSlicers[0]->GetTMax();\r
- if (mLandmarks)\r
- mLandmarks->SetTime(slice);\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- if (slice != mSlicers[i]->GetMaxCurrentTSlice()) {\r
- mSlicers[i]->SetTSlice(slice, updateLinkedImages);\r
- UpdateTSlice(i);\r
- }\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetFusionSequenceTSlice(int slice)\r
-{ \r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetFusionSequenceTSlice(slice);\r
- UpdateTSlice(i);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetNextTSlice(int originating_slicer)\r
-{ \r
- int t = mSlicers[0]->GetMaxCurrentTSlice();\r
- t++;\r
- if (t > mSlicers[0]->GetTMax())\r
- t = 0;\r
- emit UpdateTSlice(originating_slicer,t, mFusionSequenceInvolvementCode);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetPreviousTSlice(int originating_slicer)\r
-{ \r
- int t = mSlicers[0]->GetMaxCurrentTSlice();\r
- t--;\r
- if (t < 0)\r
- t = mSlicers[0]->GetTMax();\r
- emit UpdateTSlice(originating_slicer,t, mFusionSequenceInvolvementCode);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::ToggleInterpolation()\r
-{ \r
- bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);\r
- if (mSlicers[i]->GetOverlayActor())\r
- mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);\r
- if (mSlicers[i]->GetFusionActor())\r
- mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)\r
-{ \r
- if (tslice < 0)\r
- tslice = 0;\r
- else if (tslice > mSlicers[slicer]->GetTMax())\r
- tslice = mSlicers[slicer]->GetTMax();\r
- if (mLandmarks)\r
- mLandmarks->SetTime(tslice);\r
-\r
- if (mSlicers[slicer]->GetMaxCurrentTSlice() == tslice) return;\r
-\r
- mSlicers[slicer]->SetTSlice(tslice);\r
-\r
- if(mSlicingPreset==VOXELS_SLICING) {\r
- vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();\r
- mImage->GetTransform()[mSlicers[slicer]->GetTSlice()]->GetInverse(imageTransformInverse);\r
- this->GetSlicer(slicer)->GetSlicingTransform()->SetMatrix(imageTransformInverse);\r
- imageTransformInverse->Delete();\r
- }\r
-\r
- UpdateTSlice(slicer);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetColorWindow(double s)\r
-{ \r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetColorWindow(s);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetColorLevel(double s)\r
-{ \r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetColorLevel(s);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetOverlayColorWindow(double s)\r
-{ \r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetOverlayColorWindow(s);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetOverlayColorLevel(double s)\r
-{ \r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetOverlayColorLevel(s);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetLinkOverlayWindowLevel(bool b)\r
-{ \r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetLinkOverlayWindowLevel(b);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetCursorAndCornerAnnotationVisibility(int s)\r
-{ \r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetCursorVisibility(s);\r
- mSlicers[i]->SetCornerAnnotationVisibility(s);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetOpacity(int i, double factor)\r
-{ \r
- mSlicers[i]->SetOpacity(1/factor);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::UpdateViews(int current,int slicer)\r
-{ \r
- double p[3], pt[3];\r
- p[0] = mSlicers[slicer]->GetCurrentPosition()[0];\r
- p[1] = mSlicers[slicer]->GetCurrentPosition()[1];\r
- p[2] = mSlicers[slicer]->GetCurrentPosition()[2];\r
- mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);\r
-\r
- double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])\r
- /mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
- double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])\r
- /mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
- double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])\r
- /mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
-#if VTK_MAJOR_VERSION <= 5\r
- if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
- x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
- y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
- y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
- z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
- z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5)\r
-#else\r
-int extentImageReslice[6];\r
-mSlicers[slicer]->GetRegisterExtent(extentImageReslice);\r
- if (x >= extentImageReslice[0]-0.5 &&\r
- x <= extentImageReslice[1]+0.5 &&\r
- y >= extentImageReslice[2]-0.5 &&\r
- y <= extentImageReslice[3]+0.5 &&\r
- z >= extentImageReslice[4]-0.5 &&\r
- z <= extentImageReslice[5]+0.5)\r
-#endif\r
- {\r
- mSlicers[slicer]->UpdateCursorPosition();\r
- mSlicers[slicer]->SetCursorColor(10,212,255);\r
- mSelectedSlicer = slicer;\r
-\r
- switch (mSlicers[slicer]->GetSliceOrientation()) {\r
- case vtkImageViewer2::SLICE_ORIENTATION_XY:\r
- if (mSlicers[slicer]->GetSlice() != (int)lrint(z))\r
- mSlicers[slicer]->SetSlice((int)lrint(z));\r
- break;\r
-\r
- case vtkImageViewer2::SLICE_ORIENTATION_XZ:\r
- if (mSlicers[slicer]->GetSlice() != (int)lrint(y))\r
- mSlicers[slicer]->SetSlice((int)lrint(y));\r
- break;\r
-\r
- case vtkImageViewer2::SLICE_ORIENTATION_YZ:\r
- if (mSlicers[slicer]->GetSlice() != (int)lrint(x))\r
- mSlicers[slicer]->SetSlice((int)lrint(x));\r
- break;\r
- }\r
- mSlicers[slicer]->Render();\r
-\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- if (i != (unsigned int)slicer\r
- && mSlicers[i]->GetRenderer()->GetDraw()\r
- && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2\r
- && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {\r
- mSlicers[i]->SetCurrentPosition(p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());\r
- mSlicers[i]->UpdateCursorPosition();\r
- if (current) { //do not display corner annotation if image is the one picked\r
- mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,\r
- -VTK_DOUBLE_MAX, mSlicers[slicer]->GetMaxCurrentTSlice());\r
- mSlicers[i]->SetCursorColor(255,10,212);\r
- } else {\r
- mSlicers[i]->SetCursorColor(150,10,282);\r
- }\r
- switch (mSlicers[i]->GetSliceOrientation()) {\r
- case vtkImageViewer2::SLICE_ORIENTATION_XY:\r
- if (mSlicers[i]->GetSlice() != (int)lrint(z))\r
- mSlicers[i]->SetSlice((int)lrint(z));\r
- break;\r
-\r
- case vtkImageViewer2::SLICE_ORIENTATION_XZ:\r
- if (mSlicers[i]->GetSlice() != (int)lrint(y))\r
- mSlicers[i]->SetSlice((int)lrint(y));\r
- break;\r
-\r
- case vtkImageViewer2::SLICE_ORIENTATION_YZ:\r
- if (mSlicers[i]->GetSlice() != (int)lrint(x))\r
- mSlicers[i]->SetSlice((int)lrint(x));\r
- break;\r
- }\r
- \r
- mSlicers[i]->Render();\r
- \r
- UpdateSlice(i);\r
- UpdateTSlice(i);\r
- }\r
- }\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::UpdateLinked(int slicer)\r
-{ \r
- double p[3], pt[3];\r
- p[0] = mSlicers[slicer]->GetCurrentPosition()[0];\r
- p[1] = mSlicers[slicer]->GetCurrentPosition()[1];\r
- p[2] = mSlicers[slicer]->GetCurrentPosition()[2];\r
- mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);\r
- double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0]) / mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
- double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1]) / mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
- double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2]) / mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
-#if VTK_MAJOR_VERSION <= 5\r
- if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
- x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
- y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
- y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
- z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
- z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5)\r
-#else\r
-int extentImageReslice[6];\r
-mSlicers[slicer]->GetRegisterExtent(extentImageReslice);\r
- if (x >= extentImageReslice[0]-0.5 &&\r
- x <= extentImageReslice[1]+0.5 &&\r
- y >= extentImageReslice[2]-0.5 &&\r
- y <= extentImageReslice[3]+0.5 &&\r
- z >= extentImageReslice[4]-0.5 &&\r
- z <= extentImageReslice[5]+0.5)\r
-#endif\r
- {\r
- for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {\r
- if (this->IsInvolvedInFusionSequence()) {\r
- //this SlicerManager is involved in fusionSequence => do not synchronize the times\r
- emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], -1);\r
- }\r
- else {\r
- emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());\r
- }\r
- }\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagate)\r
-{ \r
- vtkCamera *refCam = refSlicer->GetRenderer()->GetActiveCamera();\r
-\r
- double refPosition[3];\r
- refCam->GetPosition(refPosition);\r
- refPosition[refSlicer->GetSliceOrientation()] = refSlicer->GetSlice() *\r
- refSlicer->GetInput()->GetSpacing()[refSlicer->GetSliceOrientation()] +\r
- refSlicer->GetInput()->GetOrigin()[refSlicer->GetSliceOrientation()];\r
-\r
- refSlicer->GetSlicingTransform()->TransformPoint(refPosition, refPosition);\r
- mSlicers[0]->GetSlicingTransform()->GetInverse()->TransformPoint(refPosition, refPosition);\r
-\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- vtkCamera *camera = mSlicers[i]->GetRenderer()->GetActiveCamera();\r
- camera->SetParallelScale(refCam->GetParallelScale());\r
-\r
- double position[3], focal[3];\r
- camera->GetPosition(position);\r
- camera->GetFocalPoint(focal);\r
-\r
- for(int j=0; j<3; j++) {\r
- if(j!=mSlicers[i]->GetSliceOrientation()) {\r
- position[j] = refPosition[j];\r
- focal[j] = refPosition[j];\r
- }\r
- }\r
-\r
- camera->SetFocalPoint(focal);\r
- camera->SetPosition(position);\r
-\r
- //Fix for bug #243\r
- mSlicers[i]->ForceUpdateDisplayExtent();\r
- }\r
- \r
- Render();\r
- if(bPropagate)\r
- for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)\r
- emit UpdateLinkedNavigation(*i, this, refSlicer);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-double vvSlicerManager::GetColorWindow() const\r
-{ \r
- if (mSlicers.size())\r
- return mSlicers[0]->GetColorWindow();\r
- return -1;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-double vvSlicerManager::GetColorLevel() const\r
-{ \r
- if (mSlicers.size())\r
- return mSlicers[0]->GetColorLevel();\r
- return -1;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-double vvSlicerManager::GetOverlayColorWindow() const\r
-{ \r
- if (mSlicers.size())\r
- return mSlicers[0]->GetOverlayColorWindow();\r
- return -1;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-double vvSlicerManager::GetOverlayColorLevel() const\r
-{ \r
- if (mSlicers.size())\r
- return mSlicers[0]->GetOverlayColorLevel();\r
- return -1;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-bool vvSlicerManager::GetLinkOverlayWindowLevel() const\r
-{ \r
- if (mSlicers.size())\r
- return mSlicers[0]->GetLinkOverlayWindowLevel();\r
- return -1;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//------------------------------------------------------------------------------\r
-void vvSlicerManager::ResetTransformationToIdentity(const std::string actorType)\r
-{ \r
- if(actorType == "image")\r
- for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
- this->GetImage()->GetTransform()[i]->Identity();\r
- else if(actorType == "overlay")\r
- for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
- this->GetSlicer(0)->GetOverlay()->GetTransform()[i]->Identity();\r
- else if(actorType == "fusion")\r
- for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
- this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();\r
- else if(actorType == "fusionSequence") //TODO: Check what should really be done here\r
- for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
- this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();\r
- else if(actorType == "vf")\r
- for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
- this->GetVF()->GetTransform()[i]->Identity();\r
- else\r
- return;\r
-\r
- for(int i=0; i< this->GetNumberOfSlicers(); i++){\r
- this->GetSlicer(i)->ForceUpdateDisplayExtent();\r
- this->GetSlicer(i)->ResetCamera();\r
- this->GetSlicer(i)->Render();\r
- }\r
-}\r
-//------------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::Render()\r
-{ \r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->Render();\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::GenerateDefaultLookupTable()\r
-{ \r
- SetPreset(mPreset);\r
- SetColorMap(mColorMap);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::Reload()\r
-{ \r
- mReader->Update(mType);\r
- mImage=mReader->GetOutput();\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetImage(mImage);\r
- }\r
- \r
- //if this image is the primary sequence of a fusion sequence, then the main transform matrix should be updated.\r
- if (this->IsMainSequenceOfFusionSequence()) {\r
- SetFusionSequenceMainTransformMatrix( mImage->GetTransform()[0]->GetMatrix() );\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::ReloadFusion()\r
-{ \r
- mFusionReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),mType);\r
-\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetFusion(mFusionReader->GetOutput());\r
- mSlicers[i]->Render();\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-//the secondary sequence is being reloaded.\r
-void vvSlicerManager::ReloadFusionSequence()\r
-{ \r
- // this is to keep the slice thickness, which needs to be artificially increased for visualization\r
- double sp_x, sp_y, sp_z;\r
- this->GetImage()->GetVTKImages()[0]->GetSpacing(sp_x, sp_y, sp_z);\r
-\r
- mFusionSequenceReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),vvImageReader::MERGEDWITHTIME);\r
-\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetFusion(mFusionSequenceReader->GetOutput(), 1);\r
- mSlicers[i]->Render();\r
- }\r
-\r
- //Update the slider\r
- mFusionSequenceNbFrames = mFusionSequenceReader->GetOutput()->GetTransform().size();\r
- if (mFusionSequenceFrameIndex>=mFusionSequenceNbFrames) {\r
- mFusionSequenceFrameIndex=0;\r
- }\r
-\r
- //Update the list of initial transforms\r
- mFusionSequenceListInitialTransformMatrices.clear();\r
- for (unsigned i=0 ; i<mFusionSequenceNbFrames ; i++) {\r
- this->AddFusionSequenceInitialTransformMatrices( mFusionSequenceReader->GetOutput()->GetTransform()[i]->GetMatrix() );\r
- }\r
-\r
- // also update the slice thickness\r
- for (unsigned i=0 ; i<this->GetImage()->GetTransform().size() ; i++) {\r
- sp_x = this->GetImage()->GetVTKImages()[i]->GetSpacing()[0];\r
- sp_y = this->GetImage()->GetVTKImages()[i]->GetSpacing()[1];\r
- this->GetImage()->GetVTKImages()[i]->SetSpacing( sp_x, sp_y, sp_z);\r
- }\r
-\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::ReloadOverlay()\r
-{ \r
- mOverlayReader->Update(mImage->GetNumberOfDimensions(),mOverlayComponent.c_str(),mType);\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());\r
- mSlicers[i]->Render();\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::ReloadVF()\r
-{ \r
- mVectorReader->Update(vvImageReader::VECTORFIELD); //deletes the old images through the VF::Init() function\r
- mVF=mVectorReader->GetOutput();\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetVF(mVF);\r
- mSlicers[i]->Render();\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)\r
-{ \r
- if (actor_type =="overlay")\r
- mOverlayReader = NULL;\r
-\r
- if (actor_type =="fusion")\r
- mFusionReader = NULL;\r
-\r
- if (actor_type =="fusionSequence") {\r
- mFusionSequenceReader = NULL;\r
- }\r
-\r
- for (unsigned int i = 0; i < mSlicers.size(); i++)\r
- mSlicers[i]->RemoveActor(actor_type,overlay_index);\r
-\r
- if (actor_type=="vector") {\r
- mVF=NULL;\r
- mVectorReader=NULL;\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::RemoveActors()\r
-{ \r
- ///This method leaks a few objects. See RemoveActor for what a\r
- ///correct implementation would look like\r
- //DS -> probably due to the reader (now released in the\r
- //RemoveActor() function. (I hope)\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
- mSlicers[i]->SetDisplayMode(0);\r
- mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)\r
-{ \r
- // int view = mSlicers[slicer]->GetSliceOrientation();\r
- // int slice = mSlicers[slicer]->GetSlice();\r
- double x = mSlicers[slicer]->GetCurrentPosition()[0];\r
- double y = mSlicers[slicer]->GetCurrentPosition()[1];\r
- double z = mSlicers[slicer]->GetCurrentPosition()[2];\r
- double xyz[3], xyzTransform[3];\r
- xyz[0] = x;\r
- xyz[1] = y;\r
- xyz[2] = z;\r
- mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(xyz, xyzTransform);\r
- double X = (xyzTransform[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])/mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
- double Y = (xyzTransform[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])/mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
- double Z = (xyzTransform[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])/mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
- double value = -VTK_DOUBLE_MAX;\r
- int displayVec = 0;\r
- double xVec=0, yVec=0, zVec=0, valueVec=0;\r
- int displayOver = 0;\r
- int displayFus = 0;\r
- double valueOver=0, valueFus=0;\r
-#if VTK_MAJOR_VERSION <= 5\r
- if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] -0.5 &&\r
- X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] +0.5 &&\r
- Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] -0.5 &&\r
- Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] +0.5 &&\r
- Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] -0.5 &&\r
- Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5] +0.5)\r
-#else\r
-int extentImageReslice[6];\r
-mSlicers[slicer]->GetRegisterExtent(extentImageReslice);\r
- if (X >= extentImageReslice[0] -0.5 &&\r
- X <= extentImageReslice[1] +0.5 &&\r
- Y >= extentImageReslice[2] -0.5 &&\r
- Y <= extentImageReslice[3] +0.5 &&\r
- Z >= extentImageReslice[4] -0.5 &&\r
- Z <= extentImageReslice[5] +0.5)\r
-#endif\r
- {\r
- value = this->GetScalarComponentAsDouble(mSlicers[slicer]->GetInput(), X, Y, Z);\r
-\r
- if (mSlicers[slicer]->GetVFActor() ) {\r
- displayVec = 1;\r
- unsigned int currentTime = mSlicers[slicer]->GetMaxCurrentTSlice();\r
- vtkImageData *vf = NULL;\r
-\r
- if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)\r
- vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];\r
- else\r
- vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];\r
-\r
- if (vf) {\r
- double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];\r
- double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];\r
- double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];\r
- xVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 0);\r
- yVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 1);\r
- zVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 2);\r
- valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);\r
- }\r
- }\r
- if (mSlicers[slicer]->GetOverlayActor() ) {\r
- displayOver = 1;\r
- vtkImageData *overlay = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput());\r
- double Xover = (x - overlay->GetOrigin()[0]) / overlay->GetSpacing()[0];\r
- double Yover = (y - overlay->GetOrigin()[1]) / overlay->GetSpacing()[1];\r
- double Zover = (z - overlay->GetOrigin()[2]) / overlay->GetSpacing()[2];\r
- valueOver = this->GetScalarComponentAsDouble(overlay, Xover, Yover, Zover);\r
- }\r
-\r
- if ( mSlicers[slicer]->GetFusionActor() ) {\r
- displayFus = 1;\r
- vtkImageData *fusion = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput());\r
- double Xover = (x - fusion->GetOrigin()[0]) / fusion->GetSpacing()[0];\r
- double Yover = (y - fusion->GetOrigin()[1]) / fusion->GetSpacing()[1];\r
- double Zover = (z - fusion->GetOrigin()[2]) / fusion->GetSpacing()[2];\r
- valueFus = this->GetScalarComponentAsDouble(fusion, Xover, Yover, Zover);\r
- }\r
- else if (this->IsInvolvedInFusionSequence()) { \r
- //if the cursor moves over the 'independent' version of the secondary sequence\r
- //do not update the panel, just keep it as it is.\r
- displayFus = 1;\r
- valueFus = std::numeric_limits<double>::quiet_NaN();\r
- }\r
-\r
- emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),\r
- x,y,z,X,Y,Z,value);\r
- emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);\r
- emit UpdateOverlay(displayOver,valueOver,value);\r
- emit UpdateFusion(displayFus,valueFus);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::Activated()\r
-{ \r
- emit currentImageChanged(mId);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::Picked()\r
-{ \r
- emit currentPickedImageChanged(mId);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::UpdateWindowLevel()\r
-{ \r
- emit WindowLevelChanged();\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::UpdateSlice(int slicer)\r
-{ \r
- if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {\r
- //DD("============= NOTHING");\r
- return;\r
- }\r
- emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());\r
- mSlicers[slicer]->Render(); // DS <-- I add this, this could/must be the only Render ...\r
- mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::UpdateTSlice(int slicer)\r
-{ \r
- int slice = mSlicers[slicer]->GetSlice();\r
-\r
- int tslice = mSlicers[slicer]->GetMaxCurrentTSlice();\r
- //if (this->IsInvolvedInFusionSequence()) tslice = mSlicers[slicer]->GetTSlice(); //actually, this is handled by the Slicer\r
-\r
- if (mPreviousSlice[slicer] == slice) {\r
- if (mPreviousTSlice[slicer] == tslice) {\r
- // DD("************** NOTHING ***********");\r
- return;\r
- }\r
- }\r
- mPreviousSlice[slicer] = slice;\r
- mPreviousTSlice[slicer] = tslice;\r
-\r
- emit UpdateTSlice(slicer, tslice, mFusionSequenceInvolvementCode);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::UpdateSliceRange(int slicer)\r
-{ \r
- emit UpdateSliceRange(slicer,\r
- mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],\r
- 0,mSlicers[slicer]->GetTMax());\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetSlicingPreset(SlicingPresetType preset)\r
-{ \r
- if(mSlicingPreset==preset)\r
- return;\r
-\r
- vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();\r
- mImage->GetTransform()[this->GetTSlice()]->GetInverse(imageTransformInverse);\r
-\r
- for(int i=0; i< this->GetNumberOfSlicers(); i++){\r
- vvSlicer *s = this->GetSlicer(i);\r
- switch(preset)\r
- {\r
- case WORLD_SLICING:\r
- s->GetSlicingTransform()->Identity();\r
- break;\r
- case VOXELS_SLICING:\r
- s->GetSlicingTransform()->SetMatrix(imageTransformInverse);\r
- break;\r
- default:\r
- imageTransformInverse->Delete();\r
- return;\r
- }\r
- s->ForceUpdateDisplayExtent();\r
-#if VTK_MAJOR_VERSION <= 5\r
- s->SetSlice((s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2+1]\r
- +s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2])/2.0);\r
-#else\r
- int extentImageReslice[6];\r
- s->GetRegisterExtent(extentImageReslice);\r
- s->SetSlice((extentImageReslice[s->GetSliceOrientation()*2+1]\r
- +extentImageReslice[s->GetSliceOrientation()*2])/2.0);\r
-#endif\r
- s->ResetCamera();\r
- s->Render();\r
- }\r
-\r
- imageTransformInverse->Delete();\r
- mSlicingPreset = preset;\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetPreset(int preset)\r
-{ \r
-\r
- //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());\r
- double window = mSlicers[0]->GetColorWindow();\r
- double level = mSlicers[0]->GetColorLevel();\r
-\r
- std::string component_type=mImage->GetScalarTypeAsITKString();\r
- switch (preset) {\r
- case WL_AUTO:\r
- double range[2];\r
- mImage->GetScalarRange(range);\r
- window = range[1] - range[0];\r
- level = (range[1] + range[0])* 0.5;\r
- break;\r
- case WL_HOUNSFIELD:\r
- window = 2000;\r
- level = 0;\r
- break;\r
- case WL_SOFTTISSUE:\r
- window = 400;\r
- level = 20;\r
- break;\r
- case WL_LUNGS: // lungs (same as FOCAL)\r
- window = 1700;\r
- level = -300;\r
- break;\r
- case WL_BONES:\r
- window = 1000;\r
- level = 500;\r
- break;\r
- case WL_HEAD:\r
- window = 200;\r
- level = 70;\r
- break;\r
- case WL_BINARY:\r
- window = 1;\r
- level = 0.5;\r
- break;\r
- case WL_USER:\r
- break;\r
- case WL_VENTILATION:\r
- window=1.;\r
- level=0.;\r
- break;\r
- }\r
- mPreset = preset;\r
- this->SetColorWindow(window);\r
- this->SetColorLevel(level);\r
-\r
- //if (LUT)\r
- //{\r
- // SetColorMap(-1);\r
- //}\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlKey)\r
-{ \r
- double min, max;\r
- if(bCtrlKey && this->mSlicers[slicer]->GetFusion()) {\r
- int t = mSlicers[slicer]->GetFusionTSlice();\r
- this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
- this->mSlicers[slicer]->GetFusion()->GetVTKImages()[t],\r
- this->mSlicers[slicer]->GetConcatenatedFusionTransform());\r
- this->SetFusionWindow(max-min);\r
- this->SetFusionLevel(0.5*(min+max));\r
- this->SetColorMap(mColorMap);\r
- }\r
- else if(bCtrlKey && this->mSlicers[slicer]->GetOverlay()) {\r
- int t = mSlicers[slicer]->GetOverlayTSlice();\r
- this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
- this->mSlicers[slicer]->GetOverlay()->GetVTKImages()[t],\r
- this->mSlicers[slicer]->GetConcatenatedOverlayTransform());\r
- if(this->mSlicers[slicer]->GetLinkOverlayWindowLevel()){\r
- this->SetColorWindow(max-min);\r
- this->SetColorLevel(0.5*(min+max));\r
- } else {\r
- this->SetOverlayColorWindow(max-min);\r
- this->SetOverlayColorLevel(0.5*(min+max));\r
- }\r
- }\r
- else {\r
- int t = this->GetTSlice();\r
- this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
- this->mSlicers[slicer]->GetImage()->GetVTKImages()[t],\r
- this->mSlicers[slicer]->GetConcatenatedTransform());\r
- this->SetColorWindow(max-min);\r
- this->SetColorLevel(0.5*(min+max));\r
- this->SetPreset(WL_USER);\r
- }\r
- this->Render();\r
- this->UpdateWindowLevel();\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::SetColorMap(int colormap)\r
-{ \r
- double range[2];\r
-\r
- range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];\r
- range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];\r
-\r
- double window = mSlicers[0]->GetWindowLevel()->GetWindow();\r
- double level = mSlicers[0]->GetWindowLevel()->GetLevel();\r
-\r
- vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());\r
- switch (colormap) {\r
- case -1:\r
- break;\r
- case 0:\r
- LUT = NULL;\r
- break;\r
- case 1:\r
- if (LUT == NULL)\r
- LUT = vtkLookupTable::New();\r
- LUT->SetValueRange(0,1);\r
- LUT->SetSaturationRange(1,1);\r
- LUT->SetHueRange(0,0.18);\r
- break;\r
- case 2:\r
- if (LUT == NULL)\r
- LUT = vtkLookupTable::New();\r
- LUT->SetValueRange(0,1);\r
- LUT->SetSaturationRange(1,1);\r
- LUT->SetHueRange(0.4,0.80);\r
- break;\r
- case 3:\r
- if (LUT == NULL)\r
- LUT = vtkLookupTable::New();\r
- LUT->SetValueRange(0.5,1);\r
- LUT->SetSaturationRange(1,1);\r
- LUT->SetHueRange(0.666,0);\r
- break;\r
- case 4:\r
- if (LUT == NULL)\r
- LUT = vtkLookupTable::New();\r
- LUT->SetValueRange(1,1);\r
- LUT->SetSaturationRange(1,1);\r
- LUT->SetHueRange(0,1);\r
- LUT->SetAlphaRange(1, 1);\r
- break;\r
- case 5:\r
- if (LUT == NULL)\r
- LUT = vtkLookupTable::New();\r
- LUT->SetValueRange(1,1);\r
- LUT->SetSaturationRange(1,1);\r
- LUT->SetHueRange(1,0.1);\r
- //LUT->SetRampToLinear();\r
- break;\r
- }\r
- if (LUT) {\r
- LUT->SetTableRange(level-fabs(window)/2,level+fabs(window)/2);\r
- LUT->Build();\r
- }\r
- vtkWindowLevelLookupTable* fusLUT = NULL;\r
-\r
- //FUSION / FUSION SEQUENCE\r
- if (mSlicers[0]->GetFusion()) { // && mFusionColorMap >= 0) {\r
- fusLUT = vtkWindowLevelLookupTable::New();\r
- double fusRange [2];\r
- fusRange[0] = mFusionLevel - mFusionWindow/2;\r
- fusRange[1] = mFusionLevel + mFusionWindow/2;\r
-\r
- //check whether it is actually a fusionSequence or a fusion, before invoking mFusionReader...\r
- double* frange;\r
- if (this->IsInvolvedInFusionSequence()) \r
- frange = mFusionSequenceReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
- else\r
- frange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
-\r
- fusLUT->SetTableRange(frange);\r
- fusLUT->SetValueRange(1,1);\r
- fusLUT->SetSaturationRange(1,1);\r
- fusLUT->SetAlphaRange(1, 1);\r
- fusLUT->SetWindow(mFusionWindow);\r
- fusLUT->SetLevel(mFusionLevel);\r
- if (mFusionColorMap == 1)\r
- fusLUT->SetHueRange(0,0.18);\r
- else if (mFusionColorMap == 2)\r
- fusLUT->SetHueRange(0.4,0.80);\r
- else if (mFusionColorMap == 3)\r
- {\r
- fusLUT->SetHueRange(0.666, 0);\r
- fusLUT->SetValueRange(0.5, 1);\r
- }\r
- else if (mFusionColorMap == 4)\r
- fusLUT->SetHueRange(0,1);\r
- else if (mFusionColorMap <= 0)\r
- {\r
- fusLUT->SetValueRange(0,1);\r
- fusLUT->SetSaturationRange(0,0);\r
- }\r
-\r
- fusLUT->ForceBuild();\r
- double v[4];\r
- // set color table transparency\r
- //double alpha_range=(double)mFusionThresOpacity/10;\r
- double range_end = fusRange[0] + (double)mFusionThresOpacity*(fusRange[1] - fusRange[0])/100;\r
- double curr_value = fusRange[0];\r
- int nvalues = fusLUT->GetNumberOfTableValues();\r
- for (double i = 0; curr_value < range_end; i++) { \r
- fusLUT->GetTableValue(i, v);\r
- v[3] = 0;\r
- //if (curr_value >= -alpha_range && curr_value <= alpha_range) v[3] = pow(fabs(curr_value/alpha_range),2);\r
- //else v[3] = 1;\r
- fusLUT->SetTableValue(i, v);\r
- curr_value += (fusRange[1] - fusRange[0])/nvalues;\r
- }\r
- }\r
- for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
-\r
- if (mSlicers[i]->GetOverlay()) {\r
- vtkLookupTable* supLUT = vtkLookupTable::New();\r
- supLUT->SetTableRange(range[0],range[1]);\r
- supLUT->SetValueRange(1,1);\r
- supLUT->SetSaturationRange(1,1);\r
- supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);\r
- supLUT->Build();\r
- vtkLookupTable* invLUT = vtkLookupTable::New();\r
- invLUT->SetTableRange(range[0],range[1]);\r
- invLUT->SetValueRange(1,1);\r
- invLUT->SetSaturationRange(1,1);\r
- invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);\r
- invLUT->Build();\r
- mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);\r
- mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);\r
- invLUT->Delete();\r
- supLUT->Delete();\r
- } else if (mSlicers[i]->GetOverlay()) {\r
- mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);\r
- } else {\r
- mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);\r
- }\r
-\r
- if (mSlicers[i]->GetFusion()) {\r
- mSlicers[i]->ShowFusionLegend(mFusionShowLegend);\r
- mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);\r
- mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);\r
- }\r
- }\r
- if (fusLUT)\r
- fusLUT->Delete();\r
- if (colormap >= 0)\r
- mColorMap = colormap;\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-\r
-//----------------------------------------------------------------------------\r
-vvLandmarks* vvSlicerManager::GetLandmarks()\r
-{ \r
- if (mLandmarks == NULL) {\r
- mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);\r
- for (unsigned int i = 0; i < mSlicers.size(); i++)\r
- mSlicers[i]->SetLandmarks(mLandmarks);\r
- }\r
- return mLandmarks;\r
-}\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::AddNewLandmark(float x,float y,float z,float t)\r
-{ \r
- emit callAddLandmark(x,y,z,t);\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::AddLandmark(float x,float y,float z,float t)\r
-{ \r
- double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];\r
- double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];\r
- double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];\r
-#if VTK_MAJOR_VERSION <= 5\r
- if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
- x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
- y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
- y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
- z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
- z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]+0.5)\r
-#else\r
- int extentImageReslice[6];\r
- mSlicers[0]->GetRegisterExtent(extentImageReslice);\r
- if (x_index >= extentImageReslice[0]-0.5 &&\r
- x_index <= extentImageReslice[1]+0.5 &&\r
- y_index >= extentImageReslice[2]-0.5 &&\r
- y_index <= extentImageReslice[3]+0.5 &&\r
- z_index >= extentImageReslice[4]-0.5 &&\r
- z_index <= extentImageReslice[5]+0.5)\r
-#endif\r
- {\r
- double value = this->GetScalarComponentAsDouble(mSlicers[mSelectedSlicer]->GetInput(), x_index, y_index, z_index); //Value in selected Slicer (not 0): bug #2848\r
- this->GetLandmarks()->AddLandmark(x,y,z,t,value);\r
- emit LandmarkAdded();\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::AddLandmarkProfile(float x,float y,float z,float t)\r
-{ \r
- double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];\r
- double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];\r
- double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];\r
-#if VTK_MAJOR_VERSION <= 5\r
- if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
- x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
- y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
- y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
- z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
- z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]+0.5)\r
-#else\r
- int extentImageReslice[6];\r
- mSlicers[0]->GetRegisterExtent(extentImageReslice);\r
- if (x_index >= extentImageReslice[0]-0.5 &&\r
- x_index <= extentImageReslice[1]+0.5 &&\r
- y_index >= extentImageReslice[2]-0.5 &&\r
- y_index <= extentImageReslice[3]+0.5 &&\r
- z_index >= extentImageReslice[4]-0.5 &&\r
- z_index <= extentImageReslice[5]+0.5)\r
-#endif\r
- {\r
- double value = this->GetScalarComponentAsDouble(mSlicers[mSelectedSlicer]->GetInput(), x_index, y_index, z_index); //Value in selected Slicer (not 0): bug #2848\r
- this->GetLandmarks()->AddLandmark(x,y,z,t,value);\r
- }\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::PrevImage(int slicer)\r
-{ \r
- emit ChangeImageWithIndexOffset(this, slicer, -1);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::NextImage(int slicer)\r
-{ \r
- emit ChangeImageWithIndexOffset(this, slicer, 1);\r
-}\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice)\r
-{ \r
- emit AVerticalSliderHasChanged(slicer, slice);\r
-}\r
-\r
-//----------------------------------------------------------------------------\r
-\r
-//----------------------------------------------------------------------------\r
-double vvSlicerManager::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component)\r
-{ \r
- int ix, iy, iz;\r
- return mSlicers[0]->GetScalarComponentAsDouble(image, X, Y, Z, ix, iy, iz, component);\r
-}\r
-//----------------------------------------------------------------------------\r
+/*=========================================================================
+ Program: vv http://www.creatis.insa-lyon.fr/rio/vv
+
+ 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
+
+ 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.
+
+ It is distributed under dual licence
+
+ - BSD See included LICENSE.txt file
+ - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ ======================================================================-====*/
+
+#include "vvSlicerManager.h"
+#include "vvSlicer.h"
+#include "vvImage.h"
+#include "vvSlicerManagerCommand.h"
+#include "vvInteractorStyleNavigator.h"
+#include "vvLandmarks.h"
+#include "vvMesh.h"
+#include "vvBlendImageActor.h"
+
+#include <vtkVersion.h>
+#include <vtkStreamingDemandDrivenPipeline.h>
+#include <vtkInformation.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>
+#include <vtkCamera.h>
+
+#include <qfileinfo.h>
+#include <QMessageBox>
+//----------------------------------------------------------------------------
+vvSlicerManager::vvSlicerManager(int numberOfSlicers)
+{
+
+ connect(this, SIGNAL(callAddLandmark(float,float,float,float)), this, SLOT(AddLandmark(float,float,float,float)));
+
+ mFileName = "";
+ mId = "";
+ mVFName = "";
+ mOverlayName = "";
+ mFusionName = "";
+ mVFId = "";
+ mLastError = "";
+ mType = vvImageReader::UNDEFINEDIMAGETYPE;
+ mColorMap = 0;
+ mPreset = 0;
+ mOverlayColor = 130;
+
+ mFusionOpacity = 30;
+ mFusionThresOpacity = 1;
+ mFusionColorMap = 3;
+ mFusionWindow = 1000;
+ mFusionLevel = 1000;
+ mFusionShowLegend = true;
+
+ mFusionSequenceInvolvementCode = -1;
+ mFusionSequenceIndexLinkedManager = -1;
+ mFusionSequenceFrameIndex = -1;
+ mFusionSequenceNbFrames = 0;
+ mFusionSequenceSpatialSyncFlag = false;
+ mFusionSequenceTemporalSyncFlag = false;
+
+ mLandmarks = NULL;
+ mLinkedId.resize(0);
+
+ for ( int i = 0; i < numberOfSlicers; i++) {
+ mSlicers.push_back(vtkSmartPointer<vvSlicer>::New());
+ mSlicers[i]->SetSlicerNumber(i);
+ }
+ mSelectedSlicer = -1;
+
+ mPreviousSlice.resize(numberOfSlicers, 0);
+ mPreviousTSlice.resize(numberOfSlicers, 0);
+ mSlicingPreset = WORLD_SLICING;
+
+
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+vvSlicerManager::~vvSlicerManager()
+{
+ if (mLandmarks)
+ delete mLandmarks;
+}
+//----------------------------------------------------------------------------
+
+
+//------------------------------------------------------------------------------
+void vvSlicerManager::SetFilename(std::string filename, int number)
+{
+ mFileName = filename;
+ mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
+ mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
+ mBaseFileNameNumber = number;
+
+ mFileName = mBaseFileName;
+ if (number != 0) {
+ mFileName.append("_"+clitk::toString(number));
+ }
+ mFileName.append(vtksys::SystemTools::GetFilenameLastExtension(filename));
+
+ for(unsigned int i=0; i<mSlicers.size(); i++) {
+ mSlicers[i]->SetFileName(mFileName);//vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
+ }
+
+}
+//------------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->AddContour(contour,propagate);
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::ToggleContourSuperposition()
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++)
+ mSlicers[i]->ToggleContourSuperposition();
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+std::string vvSlicerManager::GetListOfAbsoluteFilePathInOneString(const std::string &actorType)
+{
+ vvImageReader *reader = NULL;
+
+ if(actorType=="image")
+ reader = mReader;
+ else if(actorType=="overlay")
+ reader = mOverlayReader;
+ else if(actorType=="fusion")
+ reader = mFusionReader;
+ else if(actorType=="vector")
+ reader = mVectorReader;
+ else if(actorType=="fusionSequence")
+ reader = mFusionSequenceReader;
+
+ if(!reader)
+ return "";
+
+ std::string list;
+ for(unsigned int i=0; i<reader->GetInputFilenames().size(); i++){
+ QFileInfo fileinfo(reader->GetInputFilenames()[i].c_str()); //Do not show the path
+ if(i)
+ list += '\n';
+ list += fileinfo.absoluteFilePath().toStdString();
+ }
+ return list;
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+bool vvSlicerManager::SetImage(std::string filename, vvImageReader::LoadedImageType type, int n, unsigned int slice)
+{
+ mType = type;
+ if (mReader.IsNull())
+ mReader = vvImageReader::New();
+ 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));
+ //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());
+ }
+ } else {
+ mLastError = mReader->GetLastError();
+ return false;
+ }
+ // if (n!=0) {
+ // mFileName.append("_"+clitk::toString(n));
+ // }
+ return true;
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetImage(vvImage::Pointer image)
+{
+ mImage=image;
+ for (unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetImage(image);
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+bool vvSlicerManager::SetImages(std::vector<std::string> filenames, vvImageReader::LoadedImageType type, int n, bool patientCoordinateSystem)
+{
+ mType = type;
+ std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);
+ if (type == vvImageReader::DICOM)
+ fileWithoutExtension += "_dicom";
+ else if (type == vvImageReader::MERGED)
+ fileWithoutExtension += "_merged";
+ else if (type == vvImageReader::MERGEDWITHTIME)
+ fileWithoutExtension += "_merged_wt";
+
+ mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
+ mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);
+ if (mReader.IsNull())
+ mReader = vvImageReader::New();
+ mReader->SetInputFilenames(filenames);
+ if (type == vvImageReader::DICOM)
+ mReader->SetPatientCoordinateSystem(patientCoordinateSystem);
+ mReader->Update(type);
+
+ mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
+ 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 (n!=0) {
+ mFileName.append("_"+clitk::toString(n));
+ }
+ return true;
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+bool vvSlicerManager::SetOverlay(std::vector<std::string> filenames,int dim, std::string component, vvImageReader::LoadedImageType type)
+{
+ mOverlayName = filenames[0];
+ mOverlayComponent = component;
+ if (dim > mImage->GetNumberOfDimensions()) {
+ mLastError = " Overlay dimension cannot be greater than reference image!";
+ return false;
+ }
+ if (mOverlayReader.IsNull())
+ mOverlayReader = vvImageReader::New();
+ mOverlayReader->SetInputFilenames(filenames);
+ mOverlayReader->Update(type);
+ 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;
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+bool vvSlicerManager::SetFusion(std::vector<std::string> filenames,int dim, std::string component, vvImageReader::LoadedImageType type)
+{
+ mFusionName = filenames[0];
+ mFusionComponent = component;
+ if (dim > mImage->GetNumberOfDimensions()) {
+ mLastError = " Fusion dimension cannot be greater than reference image!";
+ return false;
+ }
+ if (mFusionReader.IsNull())
+ mFusionReader = vvImageReader::New();
+ mFusionReader->SetInputFilenames(filenames);
+ mFusionReader->Update(type);
+ 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];
+
+ return true;
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+//this function is called by vvMainWindow::AddFusionSequence for the primary sequence (CT), while the given files constitute the secondary sequence.
+bool vvSlicerManager::SetFusionSequence(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type)
+{
+ mFusionSequenceInvolvementCode = 0;
+
+ mFusionName = filenames[0];
+ mFusionComponent = component;
+
+ if (dim > mImage->GetNumberOfDimensions()) {
+ mLastError = " Fusion Sequence dimension cannot be greater than reference image!";
+ return false;
+ }
+
+ if (mFusionSequenceReader.IsNull())
+ mFusionSequenceReader = vvImageReader::New();
+
+ mFusionSequenceReader->SetInputFilenames(filenames);
+ mFusionSequenceReader->Update(type);
+
+
+ if (mFusionSequenceReader->GetLastError().size() == 0) {
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetFusion(mFusionSequenceReader->GetOutput(), mFusionSequenceInvolvementCode);
+ }
+ } else {
+ mLastError = mFusionSequenceReader->GetLastError();
+ return false;
+ }
+ double *fusRange = mFusionSequenceReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
+ mFusionLevel = (fusRange[0]+fusRange[1])/2;
+ mFusionWindow = fusRange[1]-fusRange[0];
+
+ //store the initial transform matrices of each frame, and reset them to identity
+ mFusionSequenceListInitialTransformMatrices.clear();
+ for (unsigned i=0 ; i<mFusionSequenceReader->GetOutput()->GetTransform().size() ; i++) {
+ AddFusionSequenceInitialTransformMatrices( mFusionSequenceReader->GetOutput()->GetTransform()[i]->GetMatrix() );
+ mFusionSequenceReader->GetOutput()->GetTransform()[i]->Identity();
+ mFusionSequenceReader->GetOutput()->GetTransform()[i]->Update();
+ }
+
+ //adjust the time slider in the overlay panel
+ mFusionSequenceNbFrames = mFusionSequenceReader->GetOutput()->GetTransform().size();
+ mFusionSequenceFrameIndex = std::max<int>( 0, std::min<int>(mFusionSequenceFrameIndex, mFusionSequenceNbFrames));
+
+ return true;
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+bool vvSlicerManager::SetVF(std::string filename)
+{
+ if (mVectorReader.IsNull())
+ mVectorReader = vvImageReader::New();
+ mVectorReader->SetInputFilename(filename);
+
+ if (mType == vvImageReader::IMAGEWITHTIME)
+ mVectorReader->Update(vvImageReader::VECTORFIELDWITHTIME);
+ else
+ mVectorReader->Update(vvImageReader::VECTORFIELD);
+ if (mVectorReader->GetLastError().size() != 0) {
+ mLastError = mVectorReader->GetLastError();
+ return false;
+ } else
+ return SetVF(mVectorReader->GetOutput(),filename);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)
+{
+ if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions()) {
+ mLastError = "Sorry, vector field dimension cannot be greater then reference image.";
+ return false;
+ }
+ if (vf->GetNumberOfDimensions() == 4) {
+ 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);
+ }
+ return true;
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+vvSlicer* vvSlicerManager::GetSlicer(int i)
+{
+ return mSlicers[i];
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateSlicer(int num, bool state)
+{
+ if (mSlicers[num]->GetImage()) {
+ mSlicers[num]->SetDisplayMode(state);
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetSlicerWindow(int i, vtkRenderWindow* RW)
+{
+ mSlicers[i]->SetRenderWindow(i,RW);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* style)
+{
+ vvSlicerManagerCommand *smc = vvSlicerManagerCommand::New();
+ smc->SM = this;
+ smc->SetSlicerNumber(i);
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);
+
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->
+ GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->
+ GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->
+ GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->
+ GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->
+ GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->
+ GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->
+ GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->
+ GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);
+ mSlicers[i]->GetRenderWindow()->GetInteractor()->
+ 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::EmitMousePositionUpdated(int slicer)
+{
+ emit MousePositionUpdatedSignal(slicer);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::EmitKeyPressed(std::string KeyPress)
+{
+ emit KeyPressedSignal(KeyPress);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetSliceOrientation(int slicer, int orientation)
+{
+ mSlicers[slicer]->SetSliceOrientation(orientation);
+ emit UpdateOrientation(slicer, orientation);
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+int vvSlicerManager::GetTSlice()
+{
+ return mSlicers[0]->GetTSlice();
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetTSlice(int slice, bool updateLinkedImages)
+{
+ if (!updateLinkedImages) { //for fusionSequence, TMax / MaxCurrentTSlice are irrelevant.
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetTSlice(slice, updateLinkedImages);
+ UpdateTSlice(i);
+ }
+ return;
+ }
+
+ if (slice < 0)
+ slice = 0;
+ else if (slice > mSlicers[0]->GetTMax())
+ slice = mSlicers[0]->GetTMax();
+ if (mLandmarks)
+ mLandmarks->SetTime(slice);
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ if (slice != mSlicers[i]->GetMaxCurrentTSlice()) {
+ mSlicers[i]->SetTSlice(slice, updateLinkedImages);
+ UpdateTSlice(i);
+ }
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetFusionSequenceTSlice(int slice)
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetFusionSequenceTSlice(slice);
+ UpdateTSlice(i);
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetNextTSlice(int originating_slicer)
+{
+ int t = mSlicers[0]->GetMaxCurrentTSlice();
+ t++;
+ if (t > mSlicers[0]->GetTMax())
+ t = 0;
+ emit UpdateTSlice(originating_slicer,t, mFusionSequenceInvolvementCode);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetPreviousTSlice(int originating_slicer)
+{
+ int t = mSlicers[0]->GetMaxCurrentTSlice();
+ t--;
+ if (t < 0)
+ t = mSlicers[0]->GetTMax();
+ emit UpdateTSlice(originating_slicer,t, mFusionSequenceInvolvementCode);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::ToggleInterpolation()
+{
+ bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetInterpolationImageReslice(interpolate);
+ mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);
+ if (mSlicers[i]->GetOverlayActor())
+ mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);
+ if (mSlicers[i]->GetFusionActor())
+ mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)
+{
+ if (tslice < 0)
+ tslice = 0;
+ else if (tslice > mSlicers[slicer]->GetTMax())
+ tslice = mSlicers[slicer]->GetTMax();
+ if (mLandmarks)
+ mLandmarks->SetTime(tslice);
+
+ if (mSlicers[slicer]->GetMaxCurrentTSlice() == tslice) return;
+
+ mSlicers[slicer]->SetTSlice(tslice);
+
+ if(mSlicingPreset==VOXELS_SLICING) {
+ vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();
+ mImage->GetTransform()[mSlicers[slicer]->GetTSlice()]->GetInverse(imageTransformInverse);
+ this->GetSlicer(slicer)->GetSlicingTransform()->SetMatrix(imageTransformInverse);
+ imageTransformInverse->Delete();
+ }
+
+ UpdateTSlice(slicer);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetColorWindow(double s)
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetColorWindow(s);
+ }
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetColorLevel(double s)
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetColorLevel(s);
+ }
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetOverlayColorWindow(double s)
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetOverlayColorWindow(s);
+ }
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetOverlayColorLevel(double s)
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetOverlayColorLevel(s);
+ }
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetLinkOverlayWindowLevel(bool b)
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetLinkOverlayWindowLevel(b);
+ }
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetCursorAndCornerAnnotationVisibility(int s)
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetCursorVisibility(s);
+ mSlicers[i]->SetCornerAnnotationVisibility(s);
+ }
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetOpacity(int i, double factor)
+{
+ mSlicers[i]->SetOpacity(1/factor);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateViews(int current,int slicer)
+{
+ double p[3], pt[3];
+ p[0] = mSlicers[slicer]->GetCurrentPosition()[0];
+ p[1] = mSlicers[slicer]->GetCurrentPosition()[1];
+ p[2] = mSlicers[slicer]->GetCurrentPosition()[2];
+ mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);
+
+ double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
+ /mSlicers[slicer]->GetInput()->GetSpacing()[0];
+ double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
+ /mSlicers[slicer]->GetInput()->GetSpacing()[1];
+ double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
+ /mSlicers[slicer]->GetInput()->GetSpacing()[2];
+#if VTK_MAJOR_VERSION <= 5
+ if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&
+ x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&
+ y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&
+ y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&
+ z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&
+ z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5)
+#else
+int extentImageReslice[6];
+mSlicers[slicer]->GetRegisterExtent(extentImageReslice);
+ if (x >= extentImageReslice[0]-0.5 &&
+ x <= extentImageReslice[1]+0.5 &&
+ y >= extentImageReslice[2]-0.5 &&
+ y <= extentImageReslice[3]+0.5 &&
+ z >= extentImageReslice[4]-0.5 &&
+ z <= extentImageReslice[5]+0.5)
+#endif
+ {
+ mSlicers[slicer]->UpdateCursorPosition();
+ mSlicers[slicer]->SetCursorColor(10,212,255);
+ mSelectedSlicer = slicer;
+
+ switch (mSlicers[slicer]->GetSliceOrientation()) {
+ case vtkImageViewer2::SLICE_ORIENTATION_XY:
+ if (mSlicers[slicer]->GetSlice() != (int)lrint(z))
+ mSlicers[slicer]->SetSlice((int)lrint(z));
+ break;
+
+ case vtkImageViewer2::SLICE_ORIENTATION_XZ:
+ if (mSlicers[slicer]->GetSlice() != (int)lrint(y))
+ mSlicers[slicer]->SetSlice((int)lrint(y));
+ break;
+
+ case vtkImageViewer2::SLICE_ORIENTATION_YZ:
+ if (mSlicers[slicer]->GetSlice() != (int)lrint(x))
+ mSlicers[slicer]->SetSlice((int)lrint(x));
+ break;
+ }
+ mSlicers[slicer]->Render();
+
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ if (i != (unsigned int)slicer
+ && mSlicers[i]->GetRenderer()->GetDraw()
+ && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2
+ && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {
+ mSlicers[i]->SetCurrentPosition(p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());
+ 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]->GetMaxCurrentTSlice());
+ 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)lrint(z))
+ mSlicers[i]->SetSlice((int)lrint(z));
+ break;
+
+ case vtkImageViewer2::SLICE_ORIENTATION_XZ:
+ if (mSlicers[i]->GetSlice() != (int)lrint(y))
+ mSlicers[i]->SetSlice((int)lrint(y));
+ break;
+
+ case vtkImageViewer2::SLICE_ORIENTATION_YZ:
+ if (mSlicers[i]->GetSlice() != (int)lrint(x))
+ mSlicers[i]->SetSlice((int)lrint(x));
+ break;
+ }
+
+ mSlicers[i]->Render();
+
+ UpdateSlice(i);
+ UpdateTSlice(i);
+ }
+ }
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateLinked(int slicer)
+{
+ double p[3], pt[3];
+ p[0] = mSlicers[slicer]->GetCurrentPosition()[0];
+ p[1] = mSlicers[slicer]->GetCurrentPosition()[1];
+ p[2] = mSlicers[slicer]->GetCurrentPosition()[2];
+ mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);
+ double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0]) / mSlicers[slicer]->GetInput()->GetSpacing()[0];
+ double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1]) / mSlicers[slicer]->GetInput()->GetSpacing()[1];
+ double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2]) / mSlicers[slicer]->GetInput()->GetSpacing()[2];
+#if VTK_MAJOR_VERSION <= 5
+ if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&
+ x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&
+ y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&
+ y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&
+ z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&
+ z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5)
+#else
+int extentImageReslice[6];
+mSlicers[slicer]->GetRegisterExtent(extentImageReslice);
+ if (x >= extentImageReslice[0]-0.5 &&
+ x <= extentImageReslice[1]+0.5 &&
+ y >= extentImageReslice[2]-0.5 &&
+ y <= extentImageReslice[3]+0.5 &&
+ z >= extentImageReslice[4]-0.5 &&
+ z <= extentImageReslice[5]+0.5)
+#endif
+ {
+ for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {
+ if (this->IsInvolvedInFusionSequence()) {
+ //this SlicerManager is involved in fusionSequence => do not synchronize the times
+ emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], -1);
+ }
+ else {
+ emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());
+ }
+ }
+ }
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagate)
+{
+ vtkCamera *refCam = refSlicer->GetRenderer()->GetActiveCamera();
+
+ double refPosition[3];
+ refCam->GetPosition(refPosition);
+ refPosition[refSlicer->GetSliceOrientation()] = refSlicer->GetSlice() *
+ refSlicer->GetInput()->GetSpacing()[refSlicer->GetSliceOrientation()] +
+ refSlicer->GetInput()->GetOrigin()[refSlicer->GetSliceOrientation()];
+
+ refSlicer->GetSlicingTransform()->TransformPoint(refPosition, refPosition);
+ mSlicers[0]->GetSlicingTransform()->GetInverse()->TransformPoint(refPosition, refPosition);
+
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ vtkCamera *camera = mSlicers[i]->GetRenderer()->GetActiveCamera();
+ camera->SetParallelScale(refCam->GetParallelScale());
+
+ double position[3], focal[3];
+ camera->GetPosition(position);
+ camera->GetFocalPoint(focal);
+
+ for(int j=0; j<3; j++) {
+ if(j!=mSlicers[i]->GetSliceOrientation()) {
+ position[j] = refPosition[j];
+ focal[j] = refPosition[j];
+ }
+ }
+
+ camera->SetFocalPoint(focal);
+ camera->SetPosition(position);
+
+ //Fix for bug #243
+ mSlicers[i]->ForceUpdateDisplayExtent();
+ }
+
+ Render();
+ if(bPropagate)
+ for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)
+ emit UpdateLinkedNavigation(*i, this, refSlicer);
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+double vvSlicerManager::GetColorWindow() const
+{
+ if (mSlicers.size())
+ return mSlicers[0]->GetColorWindow();
+ return -1;
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+double vvSlicerManager::GetColorLevel() const
+{
+ if (mSlicers.size())
+ return mSlicers[0]->GetColorLevel();
+ return -1;
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+double vvSlicerManager::GetOverlayColorWindow() const
+{
+ if (mSlicers.size())
+ return mSlicers[0]->GetOverlayColorWindow();
+ return -1;
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+double vvSlicerManager::GetOverlayColorLevel() const
+{
+ if (mSlicers.size())
+ return mSlicers[0]->GetOverlayColorLevel();
+ return -1;
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+bool vvSlicerManager::GetLinkOverlayWindowLevel() const
+{
+ if (mSlicers.size())
+ return mSlicers[0]->GetLinkOverlayWindowLevel();
+ return -1;
+}
+//----------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+void vvSlicerManager::ResetTransformationToIdentity(const std::string actorType)
+{
+ if(actorType == "image")
+ for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
+ this->GetImage()->GetTransform()[i]->Identity();
+ else if(actorType == "overlay")
+ for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
+ this->GetSlicer(0)->GetOverlay()->GetTransform()[i]->Identity();
+ else if(actorType == "fusion")
+ for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
+ this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();
+ else if(actorType == "fusionSequence") //TODO: Check what should really be done here
+ for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
+ this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();
+ else if(actorType == "vf")
+ for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)
+ this->GetVF()->GetTransform()[i]->Identity();
+ else
+ return;
+
+ for(int i=0; i< this->GetNumberOfSlicers(); i++){
+ this->GetSlicer(i)->ForceUpdateDisplayExtent();
+ this->GetSlicer(i)->ResetCamera();
+ this->GetSlicer(i)->Render();
+ }
+}
+//------------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::Render()
+{
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->Render();
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::GenerateDefaultLookupTable()
+{
+ SetPreset(mPreset);
+ SetColorMap(mColorMap);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::Reload()
+{
+ mReader->Update(mType);
+ mImage=mReader->GetOutput();
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetImage(mImage);
+ }
+
+ //if this image is the primary sequence of a fusion sequence, then the main transform matrix should be updated.
+ if (this->IsMainSequenceOfFusionSequence()) {
+ SetFusionSequenceMainTransformMatrix( mImage->GetTransform()[0]->GetMatrix() );
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::ReloadFusion()
+{
+ mFusionReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),mType);
+
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetFusion(mFusionReader->GetOutput());
+ mSlicers[i]->Render();
+ }
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+//the secondary sequence is being reloaded.
+void vvSlicerManager::ReloadFusionSequence()
+{
+ // this is to keep the slice thickness, which needs to be artificially increased for visualization
+ double sp_x, sp_y, sp_z;
+ this->GetImage()->GetVTKImages()[0]->GetSpacing(sp_x, sp_y, sp_z);
+
+ mFusionSequenceReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),vvImageReader::MERGEDWITHTIME);
+
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetFusion(mFusionSequenceReader->GetOutput(), 1);
+ mSlicers[i]->Render();
+ }
+
+ //Update the slider
+ mFusionSequenceNbFrames = mFusionSequenceReader->GetOutput()->GetTransform().size();
+ if (mFusionSequenceFrameIndex>=mFusionSequenceNbFrames) {
+ mFusionSequenceFrameIndex=0;
+ }
+
+ //Update the list of initial transforms
+ mFusionSequenceListInitialTransformMatrices.clear();
+ for (unsigned i=0 ; i<mFusionSequenceNbFrames ; i++) {
+ this->AddFusionSequenceInitialTransformMatrices( mFusionSequenceReader->GetOutput()->GetTransform()[i]->GetMatrix() );
+ }
+
+ // also update the slice thickness
+ for (unsigned i=0 ; i<this->GetImage()->GetTransform().size() ; i++) {
+ sp_x = this->GetImage()->GetVTKImages()[i]->GetSpacing()[0];
+ sp_y = this->GetImage()->GetVTKImages()[i]->GetSpacing()[1];
+ this->GetImage()->GetVTKImages()[i]->SetSpacing( sp_x, sp_y, sp_z);
+ }
+
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::ReloadOverlay()
+{
+ mOverlayReader->Update(mImage->GetNumberOfDimensions(),mOverlayComponent.c_str(),mType);
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+ mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
+ mSlicers[i]->Render();
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::ReloadVF()
+{
+ mVectorReader->Update(vvImageReader::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();
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)
+{
+ if (actor_type =="overlay")
+ mOverlayReader = NULL;
+
+ if (actor_type =="fusion")
+ mFusionReader = NULL;
+
+ if (actor_type =="fusionSequence") {
+ mFusionSequenceReader = NULL;
+ }
+
+ for (unsigned int i = 0; i < mSlicers.size(); i++)
+ mSlicers[i]->RemoveActor(actor_type,overlay_index);
+
+ if (actor_type=="vector") {
+ mVF=NULL;
+ mVectorReader=NULL;
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::RemoveActors()
+{
+ ///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());
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)
+{
+ // int view = mSlicers[slicer]->GetSliceOrientation();
+ // int slice = mSlicers[slicer]->GetSlice();
+ double x = mSlicers[slicer]->GetCurrentPosition()[0];
+ double y = mSlicers[slicer]->GetCurrentPosition()[1];
+ double z = mSlicers[slicer]->GetCurrentPosition()[2];
+ double xyz[3], xyzTransform[3];
+ xyz[0] = x;
+ xyz[1] = y;
+ xyz[2] = z;
+ mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(xyz, xyzTransform);
+ double X = (xyzTransform[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])/mSlicers[slicer]->GetInput()->GetSpacing()[0];
+ double Y = (xyzTransform[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])/mSlicers[slicer]->GetInput()->GetSpacing()[1];
+ double Z = (xyzTransform[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])/mSlicers[slicer]->GetInput()->GetSpacing()[2];
+ double value = -VTK_DOUBLE_MAX;
+ int displayVec = 0;
+ double xVec=0, yVec=0, zVec=0, valueVec=0;
+ int displayOver = 0;
+ int displayFus = 0;
+ double valueOver=0, valueFus=0;
+#if VTK_MAJOR_VERSION <= 5
+ if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] -0.5 &&
+ X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] +0.5 &&
+ Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] -0.5 &&
+ Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] +0.5 &&
+ Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] -0.5 &&
+ Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5] +0.5)
+#else
+int extentImageReslice[6];
+mSlicers[slicer]->GetRegisterExtent(extentImageReslice);
+ if (X >= extentImageReslice[0] -0.5 &&
+ X <= extentImageReslice[1] +0.5 &&
+ Y >= extentImageReslice[2] -0.5 &&
+ Y <= extentImageReslice[3] +0.5 &&
+ Z >= extentImageReslice[4] -0.5 &&
+ Z <= extentImageReslice[5] +0.5)
+#endif
+ {
+ value = this->GetScalarComponentAsDouble(mSlicers[slicer]->GetInput(), X, Y, Z);
+
+ if (mSlicers[slicer]->GetVFActor() ) {
+ displayVec = 1;
+ unsigned int currentTime = mSlicers[slicer]->GetMaxCurrentTSlice();
+ 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 = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 0);
+ yVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 1);
+ zVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 2);
+ valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);
+ }
+ }
+ if (mSlicers[slicer]->GetOverlayActor() ) {
+ displayOver = 1;
+ vtkImageData *overlay = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput());
+ double Xover = (x - overlay->GetOrigin()[0]) / overlay->GetSpacing()[0];
+ double Yover = (y - overlay->GetOrigin()[1]) / overlay->GetSpacing()[1];
+ double Zover = (z - overlay->GetOrigin()[2]) / overlay->GetSpacing()[2];
+ valueOver = this->GetScalarComponentAsDouble(overlay, Xover, Yover, Zover);
+ }
+
+ if ( mSlicers[slicer]->GetFusionActor() ) {
+ displayFus = 1;
+ vtkImageData *fusion = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput());
+ double Xover = (x - fusion->GetOrigin()[0]) / fusion->GetSpacing()[0];
+ double Yover = (y - fusion->GetOrigin()[1]) / fusion->GetSpacing()[1];
+ double Zover = (z - fusion->GetOrigin()[2]) / fusion->GetSpacing()[2];
+ valueFus = this->GetScalarComponentAsDouble(fusion, Xover, Yover, Zover);
+ }
+ else if (this->IsInvolvedInFusionSequence()) {
+ //if the cursor moves over the 'independent' version of the secondary sequence
+ //do not update the panel, just keep it as it is.
+ displayFus = 1;
+ valueFus = std::numeric_limits<double>::quiet_NaN();
+ }
+
+ 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);
+ }
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::Activated()
+{
+ emit currentImageChanged(mId);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::Picked()
+{
+ emit currentPickedImageChanged(mId);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateWindowLevel()
+{
+ emit WindowLevelChanged();
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateSlice(int slicer)
+{
+ 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();
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateTSlice(int slicer)
+{
+ int slice = mSlicers[slicer]->GetSlice();
+
+ int tslice = mSlicers[slicer]->GetMaxCurrentTSlice();
+ //if (this->IsInvolvedInFusionSequence()) tslice = mSlicers[slicer]->GetTSlice(); //actually, this is handled by the Slicer
+
+ if (mPreviousSlice[slicer] == slice) {
+ if (mPreviousTSlice[slicer] == tslice) {
+ // DD("************** NOTHING ***********");
+ return;
+ }
+ }
+ mPreviousSlice[slicer] = slice;
+ mPreviousTSlice[slicer] = tslice;
+
+ emit UpdateTSlice(slicer, tslice, mFusionSequenceInvolvementCode);
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateSliceRange(int slicer)
+{
+ emit UpdateSliceRange(slicer,
+ mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],
+ 0,mSlicers[slicer]->GetTMax());
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetSlicingPreset(SlicingPresetType preset)
+{
+ if(mSlicingPreset==preset)
+ return;
+
+ vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();
+ mImage->GetTransform()[this->GetTSlice()]->GetInverse(imageTransformInverse);
+
+ for(int i=0; i< this->GetNumberOfSlicers(); i++){
+ vvSlicer *s = this->GetSlicer(i);
+ switch(preset)
+ {
+ case WORLD_SLICING:
+ s->GetSlicingTransform()->Identity();
+ break;
+ case VOXELS_SLICING:
+ s->GetSlicingTransform()->SetMatrix(imageTransformInverse);
+ break;
+ default:
+ imageTransformInverse->Delete();
+ return;
+ }
+ s->ForceUpdateDisplayExtent();
+#if VTK_MAJOR_VERSION <= 5
+ s->SetSlice((s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2+1]
+ +s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2])/2.0);
+#else
+ int extentImageReslice[6];
+ s->GetRegisterExtent(extentImageReslice);
+ s->SetSlice((extentImageReslice[s->GetSliceOrientation()*2+1]
+ +extentImageReslice[s->GetSliceOrientation()*2])/2.0);
+#endif
+ s->ResetCamera();
+ s->Render();
+ }
+
+ imageTransformInverse->Delete();
+ mSlicingPreset = preset;
+}
+
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetPreset(int preset)
+{
+
+ //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
+ double window = mSlicers[0]->GetColorWindow();
+ double level = mSlicers[0]->GetColorLevel();
+
+ std::string component_type=mImage->GetScalarTypeAsITKString();
+ switch (preset) {
+ case WL_AUTO:
+ double range[2];
+ mImage->GetScalarRange(range);
+ window = range[1] - range[0];
+ level = (range[1] + range[0])* 0.5;
+ break;
+ case WL_HOUNSFIELD:
+ window = 2000;
+ level = 0;
+ break;
+ case WL_SOFTTISSUE:
+ window = 400;
+ level = 20;
+ break;
+ case WL_LUNGS: // lungs (same as FOCAL)
+ window = 1700;
+ level = -300;
+ break;
+ case WL_BONES:
+ window = 1000;
+ level = 500;
+ break;
+ case WL_HEAD:
+ window = 200;
+ level = 70;
+ break;
+ case WL_BINARY:
+ window = 1;
+ level = 0.5;
+ break;
+ case WL_USER:
+ break;
+ case WL_VENTILATION:
+ window=1.;
+ level=0.;
+ break;
+ }
+ mPreset = preset;
+ this->SetColorWindow(window);
+ this->SetColorLevel(level);
+
+ //if (LUT)
+ //{
+ // SetColorMap(-1);
+ //}
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlKey)
+{
+ double min, max;
+ if(bCtrlKey && this->mSlicers[slicer]->GetFusion()) {
+ int t = mSlicers[slicer]->GetFusionTSlice();
+ this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
+ this->mSlicers[slicer]->GetFusion()->GetVTKImages()[t],
+ this->mSlicers[slicer]->GetConcatenatedFusionTransform());
+ this->SetFusionWindow(max-min);
+ this->SetFusionLevel(0.5*(min+max));
+ this->SetColorMap(mColorMap);
+ }
+ else if(bCtrlKey && this->mSlicers[slicer]->GetOverlay()) {
+ int t = mSlicers[slicer]->GetOverlayTSlice();
+ this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
+ this->mSlicers[slicer]->GetOverlay()->GetVTKImages()[t],
+ this->mSlicers[slicer]->GetConcatenatedOverlayTransform());
+ if(this->mSlicers[slicer]->GetLinkOverlayWindowLevel()){
+ this->SetColorWindow(max-min);
+ this->SetColorLevel(0.5*(min+max));
+ } else {
+ this->SetOverlayColorWindow(max-min);
+ this->SetOverlayColorLevel(0.5*(min+max));
+ }
+ }
+ else {
+ int t = this->GetTSlice();
+ this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,
+ this->mSlicers[slicer]->GetImage()->GetVTKImages()[t],
+ this->mSlicers[slicer]->GetConcatenatedTransform());
+ this->SetColorWindow(max-min);
+ this->SetColorLevel(0.5*(min+max));
+ this->SetPreset(WL_USER);
+ }
+ this->UpdateWindowLevel();
+}
+//----------------------------------------------------------------------------
+
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::SetColorMap(int colormap)
+{
+ double range[2];
+
+ range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];
+ range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];
+
+ double window = mSlicers[0]->GetWindowLevel()->GetWindow();
+ double level = mSlicers[0]->GetWindowLevel()->GetLevel();
+
+ vtkLookupTable* LUT = static_cast<vtkLookupTable*>(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.5,1);
+ LUT->SetSaturationRange(1,1);
+ LUT->SetHueRange(0.666,0);
+ break;
+ case 4:
+ if (LUT == NULL)
+ LUT = vtkLookupTable::New();
+ LUT->SetValueRange(1,1);
+ LUT->SetSaturationRange(1,1);
+ LUT->SetHueRange(0,1);
+ LUT->SetAlphaRange(1, 1);
+ break;
+ case 5:
+ if (LUT == NULL)
+ LUT = vtkLookupTable::New();
+ LUT->SetValueRange(1,1);
+ LUT->SetSaturationRange(1,1);
+ LUT->SetHueRange(1,0.1);
+ //LUT->SetRampToLinear();
+ break;
+ }
+ if (LUT) {
+ LUT->SetTableRange(level-fabs(window)/2,level+fabs(window)/2);
+ LUT->Build();
+ }
+ vtkWindowLevelLookupTable* fusLUT = NULL;
+
+ //FUSION / FUSION SEQUENCE
+ if (mSlicers[0]->GetFusion()) { // && mFusionColorMap >= 0) {
+ fusLUT = vtkWindowLevelLookupTable::New();
+ double fusRange [2];
+ fusRange[0] = mFusionLevel - mFusionWindow/2;
+ fusRange[1] = mFusionLevel + mFusionWindow/2;
+
+ //check whether it is actually a fusionSequence or a fusion, before invoking mFusionReader...
+ double* frange;
+ if (this->IsInvolvedInFusionSequence())
+ frange = mFusionSequenceReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
+ else
+ frange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
+
+ fusLUT->SetTableRange(frange);
+ fusLUT->SetValueRange(1,1);
+ fusLUT->SetSaturationRange(1,1);
+ fusLUT->SetAlphaRange(1, 1);
+ fusLUT->SetWindow(mFusionWindow);
+ fusLUT->SetLevel(mFusionLevel);
+ 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.666, 0);
+ fusLUT->SetValueRange(0.5, 1);
+ }
+ else if (mFusionColorMap == 4)
+ fusLUT->SetHueRange(0,1);
+ else if (mFusionColorMap <= 0)
+ {
+ fusLUT->SetValueRange(0,1);
+ fusLUT->SetSaturationRange(0,0);
+ }
+
+ fusLUT->ForceBuild();
+ double v[4];
+ // set color table transparency
+ //double alpha_range=(double)mFusionThresOpacity/10;
+ double range_end = fusRange[0] + (double)mFusionThresOpacity*(fusRange[1] - fusRange[0])/100;
+ double curr_value = fusRange[0];
+ int nvalues = fusLUT->GetNumberOfTableValues();
+ for (double i = 0; curr_value < range_end; i++) {
+ fusLUT->GetTableValue(i, v);
+ v[3] = 0;
+ //if (curr_value >= -alpha_range && curr_value <= alpha_range) v[3] = pow(fabs(curr_value/alpha_range),2);
+ //else v[3] = 1;
+ fusLUT->SetTableValue(i, v);
+ curr_value += (fusRange[1] - fusRange[0])/nvalues;
+ }
+ }
+ for ( unsigned int i = 0; i < mSlicers.size(); i++) {
+
+ if (mSlicers[i]->GetOverlay()) {
+ vtkLookupTable* supLUT = vtkLookupTable::New();
+ supLUT->SetTableRange(range[0],range[1]);
+ supLUT->SetValueRange(1,1);
+ supLUT->SetSaturationRange(1,1);
+ supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);
+ supLUT->Build();
+ vtkLookupTable* invLUT = vtkLookupTable::New();
+ invLUT->SetTableRange(range[0],range[1]);
+ invLUT->SetValueRange(1,1);
+ invLUT->SetSaturationRange(1,1);
+ invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);
+ invLUT->Build();
+ mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);
+ mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);
+ invLUT->Delete();
+ supLUT->Delete();
+ } else if (mSlicers[i]->GetOverlay()) {
+ mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
+ } else {
+ mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
+ }
+
+ if (mSlicers[i]->GetFusion()) {
+ mSlicers[i]->ShowFusionLegend(mFusionShowLegend);
+ mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);
+ mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);
+ }
+ }
+ if (fusLUT)
+ fusLUT->Delete();
+ if (colormap >= 0)
+ mColorMap = 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);
+ }
+ return mLandmarks;
+}
+//----------------------------------------------------------------------------
+void vvSlicerManager::AddNewLandmark(float x,float y,float z,float t)
+{
+ emit callAddLandmark(x,y,z,t);
+}
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::AddLandmark(float x,float y,float z,float t)
+{
+ double x_index = (x - mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetOrigin()[0])/mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetSpacing()[0];
+ double y_index = (y - mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetOrigin()[1])/mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetSpacing()[1];
+ double z_index = (z - mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetOrigin()[2])/mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetSpacing()[2];
+#if VTK_MAJOR_VERSION <= 5
+ if (x_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[0]-0.5 &&
+ x_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[1]+0.5 &&
+ y_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[2]-0.5 &&
+ y_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[3]+0.5 &&
+ z_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[4]-0.5 &&
+ z_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[5]+0.5)
+#else
+ if (x_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[0]-0.5 &&
+ x_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[1]+0.5 &&
+ y_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[2]-0.5 &&
+ y_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[3]+0.5 &&
+ z_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[4]-0.5 &&
+ z_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[5]+0.5)
+#endif
+ {
+ double value = this->GetScalarComponentAsDouble(mSlicers[mSelectedSlicer]->GetImage()->GetVTKImages()[mSlicers[mSelectedSlicer]->GetTSlice()], x_index, y_index, z_index); //Value in selected Slicer (not 0): bug #2848
+ this->GetLandmarks()->AddLandmark(x,y,z,t,value);
+ emit LandmarkAdded();
+ }
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::AddLandmarkProfile(float x,float y,float z,float t)
+{
+ double x_index = (x - mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetOrigin()[0])/mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetSpacing()[0];
+ double y_index = (y - mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetOrigin()[1])/mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetSpacing()[1];
+ double z_index = (z - mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetOrigin()[2])/mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetSpacing()[2];
+#if VTK_MAJOR_VERSION <= 5
+ if (x_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[0]-0.5 &&
+ x_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[1]+0.5 &&
+ y_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[2]-0.5 &&
+ y_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[3]+0.5 &&
+ z_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[4]-0.5 &&
+ z_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetWholeExtent()[5]+0.5)
+#else
+ if (x_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[0]-0.5 &&
+ x_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[1]+0.5 &&
+ y_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[2]-0.5 &&
+ y_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[3]+0.5 &&
+ z_index >= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[4]-0.5 &&
+ z_index <= mSlicers[0]->GetImage()->GetVTKImages()[mSlicers[0]->GetTSlice()]->GetInformation()->Get(vtkDataObject::DATA_EXTENT())[5]+0.5)
+#endif
+ {
+ double value = this->GetScalarComponentAsDouble(mSlicers[mSelectedSlicer]->GetImage()->GetVTKImages()[mSlicers[mSelectedSlicer]->GetTSlice()], x_index, y_index, z_index); //Value in selected Slicer (not 0): bug #2848
+ this->GetLandmarks()->AddLandmark(x,y,z,t,value);
+ }
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+void vvSlicerManager::UpdateLandmark()
+{
+ this->GetLandmarks()->TransformUpdate(mSlicers[mSelectedSlicer]->GetConcatenatedTransform()->GetInverse());
+}
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+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);
+}
+
+//----------------------------------------------------------------------------
+
+//----------------------------------------------------------------------------
+double vvSlicerManager::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component)
+{
+ int ix, iy, iz;
+ return mSlicers[0]->GetScalarComponentAsDouble(image, X, Y, Z, ix, iy, iz, component);
+}
+//----------------------------------------------------------------------------