X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=vv%2FvvSlicerManager.cxx;h=015409b2debdf12cc501dd6b0226eddabf77e6a8;hb=f8f487135ec75a4a88e1d325cad6375313b59a29;hp=b6f21562a6e19887cdb921f01f784aa6e900c2ff;hpb=bec6f659babc742382ca007b53800e7305fa298f;p=clitk.git diff --git a/vv/vvSlicerManager.cxx b/vv/vvSlicerManager.cxx index b6f2156..015409b 100644 --- a/vv/vvSlicerManager.cxx +++ b/vv/vvSlicerManager.cxx @@ -23,7 +23,6 @@ #include "vvInteractorStyleNavigator.h" #include "vvLandmarks.h" #include "vvMesh.h" -#include "vvImageMapToWLColors.h" #include "vvBlendImageActor.h" #include @@ -69,7 +68,8 @@ vvSlicerManager::vvSlicerManager(int numberOfSlicers) for ( int i = 0; i < numberOfSlicers; i++) mSlicers.push_back(vtkSmartPointer::New()); - + mSelectedSlicer = -1; + mPreviousSlice.resize(numberOfSlicers); mPreviousTSlice.resize(numberOfSlicers); mSlicingPreset = WORLD_SLICING; @@ -242,20 +242,18 @@ bool vvSlicerManager::SetImages(std::vector filenames, vvImageReade //---------------------------------------------------------------------------- -bool vvSlicerManager::SetOverlay(std::string filename,int dim, std::string component) +bool vvSlicerManager::SetOverlay(std::vector filenames,int dim, std::string component, vvImageReader::LoadedImageType type) { - mOverlayName = filename; + mOverlayName = filenames[0]; mOverlayComponent = component; if (dim > mImage->GetNumberOfDimensions()) { - mLastError = " Overlay dimension cannot be greater then reference image!"; + mLastError = " Overlay dimension cannot be greater than reference image!"; return false; } if (mOverlayReader.IsNull()) mOverlayReader = vvImageReader::New(); - std::vector filenames; - filenames.push_back(filename); mOverlayReader->SetInputFilenames(filenames); - mOverlayReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType); + mOverlayReader->Update(type); if (mOverlayReader->GetLastError().size() == 0) { for ( unsigned int i = 0; i < mSlicers.size(); i++) { mSlicers[i]->SetOverlay(mOverlayReader->GetOutput()); @@ -444,7 +442,7 @@ void vvSlicerManager::SetTSlice(int slice) if (mLandmarks) mLandmarks->SetTime(slice); for ( unsigned int i = 0; i < mSlicers.size(); i++) { - if (slice != mSlicers[i]->GetTSlice()) { + if (slice != mSlicers[i]->GetMaxCurrentTSlice()) { mSlicers[i]->SetTSlice(slice); UpdateTSlice(i); } @@ -456,7 +454,7 @@ void vvSlicerManager::SetTSlice(int slice) //---------------------------------------------------------------------------- void vvSlicerManager::SetNextTSlice(int originating_slicer) { - int t = mSlicers[0]->GetTSlice(); + int t = mSlicers[0]->GetMaxCurrentTSlice(); t++; if (t > mSlicers[0]->GetTMax()) t = 0; @@ -469,7 +467,7 @@ void vvSlicerManager::SetNextTSlice(int originating_slicer) //---------------------------------------------------------------------------- void vvSlicerManager::SetPreviousTSlice(int originating_slicer) { - int t = mSlicers[0]->GetTSlice(); + int t = mSlicers[0]->GetMaxCurrentTSlice(); t--; if (t < 0) t = mSlicers[0]->GetTMax(); @@ -504,16 +502,17 @@ void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer) if (mLandmarks) mLandmarks->SetTime(tslice); - if (mSlicers[slicer]->GetTSlice() == tslice) return; + if (mSlicers[slicer]->GetMaxCurrentTSlice() == tslice) return; + + mSlicers[slicer]->SetTSlice(tslice); if(mSlicingPreset==VOXELS_SLICING) { vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New(); - mImage->GetTransform()[tslice]->GetInverse(imageTransformInverse); + mImage->GetTransform()[mSlicers[slicer]->GetTSlice()]->GetInverse(imageTransformInverse); this->GetSlicer(slicer)->GetSlicingTransform()->SetMatrix(imageTransformInverse); imageTransformInverse->Delete(); } - mSlicers[slicer]->SetTSlice(tslice); UpdateTSlice(slicer); } //---------------------------------------------------------------------------- @@ -606,6 +605,7 @@ void vvSlicerManager::UpdateViews(int current,int slicer) z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) { mSlicers[slicer]->UpdateCursorPosition(); mSlicers[slicer]->SetCursorColor(10,212,255); + mSelectedSlicer = slicer; switch (mSlicers[slicer]->GetSliceOrientation()) { case vtkImageViewer2::SLICE_ORIENTATION_XY: @@ -630,11 +630,11 @@ void vvSlicerManager::UpdateViews(int current,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]->GetTSlice()); + 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]->GetTSlice()); + -VTK_DOUBLE_MAX, mSlicers[slicer]->GetMaxCurrentTSlice()); mSlicers[i]->SetCursorColor(255,10,212); } else { mSlicers[i]->SetCursorColor(150,10,282); @@ -686,9 +686,7 @@ void vvSlicerManager::UpdateLinked(int slicer) z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 && z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) { for (std::list::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) { - emit UpdateLinkManager(*i, slicer,mSlicers[slicer]->GetCurrentPosition()[0], - mSlicers[slicer]->GetCurrentPosition()[1], - mSlicers[slicer]->GetCurrentPosition()[2],mSlicers[slicer]->GetTSlice()); + emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice()); } } } @@ -698,14 +696,15 @@ void vvSlicerManager::UpdateLinked(int slicer) void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagate) { vtkCamera *refCam = refSlicer->GetRenderer()->GetActiveCamera(); - double refPosition[3], refFocal[3]; + + double refPosition[3]; refCam->GetPosition(refPosition); - refCam->GetFocalPoint(refFocal); - - refSlicer->GetSlicingTransform()->TransformPoint(refPosition); - refSlicer->GetSlicingTransform()->TransformPoint(refFocal); - mSlicers[0]->GetSlicingTransform()->GetInverse()->TransformPoint(refPosition); - mSlicers[0]->GetSlicingTransform()->GetInverse()->TransformPoint(refFocal); + 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(); @@ -715,51 +714,15 @@ void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagat camera->GetPosition(position); camera->GetFocalPoint(focal); - if(refSlicer->GetSliceOrientation()==mSlicers[i]->GetSliceOrientation()) { - for(int i=0; i<3; i++) { - position[i] = refPosition[i]; - focal[i] = refFocal[i]; - } - } - - if(refSlicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) { - if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) { - position[0] = refPosition[0]; - focal[0] = refFocal[0]; - } - if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) { - position[1] = refPosition[1]; - focal[1] = refFocal[1]; + for(int j=0; j<3; j++) { + if(j!=mSlicers[i]->GetSliceOrientation()) { + position[j] = refPosition[j]; + focal[j] = refPosition[j]; } } - if(refSlicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) { - if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) { - position[2] = refPosition[2]; - focal[2] = refFocal[2]; - } - if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) { - position[0] = refPosition[0]; - focal[0] = refFocal[0]; - } - } - - if(refSlicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) { - if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) { - position[1] = refPosition[1]; - focal[1] = refFocal[1]; - } - if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) { - position[2] = refPosition[2]; - focal[2] = refFocal[2]; - } - } -DD(camera->GetFocalPoint()[0] << ' ' << camera->GetFocalPoint()[1] << ' ' << camera->GetFocalPoint()[2]) camera->SetFocalPoint(focal); -DD(camera->GetFocalPoint()[0] << ' ' << camera->GetFocalPoint()[1] << ' ' << camera->GetFocalPoint()[2]) -DD(camera->GetPosition()[0] << ' ' << camera->GetPosition()[1] << ' ' << camera->GetPosition()[2]) camera->SetPosition(position); -DD(camera->GetPosition()[0] << ' ' << camera->GetPosition()[1] << ' ' << camera->GetPosition()[2]) //Fix for bug #243 mSlicers[i]->ForceUpdateDisplayExtent(); @@ -773,7 +736,7 @@ DD(camera->GetPosition()[0] << ' ' << camera->GetPosition()[1] << ' ' << camera- //---------------------------------------------------------------------------- //---------------------------------------------------------------------------- -double vvSlicerManager::GetColorWindow() +double vvSlicerManager::GetColorWindow() const { if (mSlicers.size()) return mSlicers[0]->GetColorWindow(); @@ -783,7 +746,7 @@ double vvSlicerManager::GetColorWindow() //---------------------------------------------------------------------------- -double vvSlicerManager::GetColorLevel() +double vvSlicerManager::GetColorLevel() const { if (mSlicers.size()) return mSlicers[0]->GetColorLevel(); @@ -978,7 +941,7 @@ void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer) if (mSlicers[slicer]->GetVFActor() ) { displayVec = 1; - unsigned int currentTime = mSlicers[slicer]->GetTSlice(); + unsigned int currentTime = mSlicers[slicer]->GetMaxCurrentTSlice(); vtkImageData *vf = NULL; if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime) @@ -1065,7 +1028,7 @@ void vvSlicerManager::UpdateSlice(int slicer) void vvSlicerManager::UpdateTSlice(int slicer) { int slice = mSlicers[slicer]->GetSlice(); - int tslice = mSlicers[slicer]->GetTSlice(); + int tslice = mSlicers[slicer]->GetMaxCurrentTSlice(); if (mPreviousSlice[slicer] == slice) { if (mPreviousTSlice[slicer] == tslice) { // DD("************** NOTHING ***********"); @@ -1099,21 +1062,24 @@ void vvSlicerManager::SetSlicingPreset(SlicingPresetType preset) mImage->GetTransform()[this->GetTSlice()]->GetInverse(imageTransformInverse); for(int i=0; i< this->GetNumberOfSlicers(); i++){ + vvSlicer *s = this->GetSlicer(i); switch(preset) { case WORLD_SLICING: - this->GetSlicer(i)->GetSlicingTransform()->Identity(); + s->GetSlicingTransform()->Identity(); break; case VOXELS_SLICING: - this->GetSlicer(i)->GetSlicingTransform()->SetMatrix(imageTransformInverse); + s->GetSlicingTransform()->SetMatrix(imageTransformInverse); break; default: imageTransformInverse->Delete(); return; } - this->GetSlicer(i)->ForceUpdateDisplayExtent(); - this->GetSlicer(i)->ResetCamera(); - this->GetSlicer(i)->Render(); + s->ForceUpdateDisplayExtent(); + s->SetSlice((s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2+1] + +s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2])/2.0); + s->ResetCamera(); + s->Render(); } imageTransformInverse->Delete(); @@ -1145,9 +1111,9 @@ void vvSlicerManager::SetPreset(int preset) window = 400; level = 20; break; - case 3: - window = 1500; - level = -500; + case 3: // lungs (same as FOCAL) + window = 1700; + level = -300; break; case 4: window = 1000; @@ -1180,19 +1146,20 @@ void vvSlicerManager::SetPreset(int preset) void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlKey) { double min, max; - int t = this->GetTSlice(); 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]->GetFusion()->GetTransform()[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]->GetOverlay()->GetTransform()[t]); + this->mSlicers[slicer]->GetConcatenatedOverlayTransform()); if(this->mSlicers[slicer]->GetLinkOverlayWindowLevel()){ this->SetColorWindow(max-min); this->SetColorLevel(0.5*(min+max)); @@ -1202,6 +1169,7 @@ void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlK } } else { + int t = this->GetTSlice(); this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max, this->mSlicers[slicer]->GetImage()->GetVTKImages()[t], this->mSlicers[slicer]->GetConcatenatedTransform()); @@ -1336,15 +1304,11 @@ void vvSlicerManager::SetColorMap(int colormap) invLUT->SetSaturationRange(1,1); invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360); invLUT->Build(); - dynamic_cast(mSlicers[i]->GetWindowLevel()) - ->SetWindowLevelMode(true); mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT); mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT); invLUT->Delete(); supLUT->Delete(); } else if (mSlicers[i]->GetOverlay()) { - //dynamic_cast(mSlicers[i]->GetWindowLevel()) - //->SetWindowLevelMode(false); mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT); } else { mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT); @@ -1383,12 +1347,12 @@ void vvSlicerManager::AddLandmark(float x,float y,float z,float t) double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0]; double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1]; double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2]; - if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0] && - x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1] && - y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2] && - y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3] && - z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4] && - z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]) { + if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0]-0.5 && + x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1]+0.5 && + y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2]-0.5 && + y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3]+0.5 && + z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4]-0.5 && + z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]+0.5) { double value = this->GetScalarComponentAsDouble(mSlicers[0]->GetInput(), x_index, y_index, z_index); this->GetLandmarks()->AddLandmark(x,y,z,t,value); emit LandmarkAdded();