1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
19 #include "vvSlicerManager.h"
22 #include "vvSlicerManagerCommand.h"
23 #include "vvInteractorStyleNavigator.h"
24 #include "vvLandmarks.h"
26 #include "vvImageMapToWLColors.h"
27 #include "vvBlendImageActor.h"
29 #include <vtkImageActor.h>
30 #include <vtkImageData.h>
31 #include <vtkRenderWindow.h>
32 #include <vtkRendererCollection.h>
33 #include <vtkRenderWindowInteractor.h>
34 #include <vtkImageMapToWindowLevelColors.h>
35 #include <vtkWindowLevelLookupTable.h>
36 #include <vtkColorTransferFunction.h>
37 #include <vtkImageClip.h>
38 #include <vtkLODActor.h>
39 #include <vtkPointData.h>
40 #include <vtksys/SystemTools.hxx>
41 #include <vtkCamera.h>
43 //----------------------------------------------------------------------------
44 vvSlicerManager::vvSlicerManager(int numberOfSlicers)
53 mType = UNDEFINEDIMAGETYPE;
67 mOverlayReader = NULL;
72 for ( int i = 0; i < numberOfSlicers; i++) {
73 vvSlicer *slicer = vvSlicer::New();
74 mSlicers.push_back(slicer);
76 mPreviousSlice.resize(numberOfSlicers);
77 mPreviousTSlice.resize(numberOfSlicers);
79 //----------------------------------------------------------------------------
82 //----------------------------------------------------------------------------
83 vvSlicerManager::~vvSlicerManager()
85 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
86 if (mSlicers[i] != NULL)
87 mSlicers[i]->Delete();
92 //----------------------------------------------------------------------------
95 //------------------------------------------------------------------------------
96 void vvSlicerManager::SetFilename(std::string filename, int number)
99 mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
100 mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
101 mBaseFileNameNumber = number;
103 mFileName = mBaseFileName;
105 mFileName.append("_"+clitk::toString(number));
107 mFileName.append(vtksys::SystemTools::GetFilenameLastExtension(filename));
109 for(unsigned int i=0; i<mSlicers.size(); i++) {
110 mSlicers[i]->SetFileName(mFileName);//vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
114 //------------------------------------------------------------------------------
117 //----------------------------------------------------------------------------
118 void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)
120 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
121 mSlicers[i]->AddContour(contour,propagate);
124 //----------------------------------------------------------------------------
127 //----------------------------------------------------------------------------
128 void vvSlicerManager::ToggleContourSuperposition()
130 for ( unsigned int i = 0; i < mSlicers.size(); i++)
131 mSlicers[i]->ToggleContourSuperposition();
133 //----------------------------------------------------------------------------
136 //----------------------------------------------------------------------------
137 bool vvSlicerManager::SetImage(std::string filename, LoadedImageType type, int n, unsigned int slice)
140 if (mReader.IsNull())
141 mReader = vvImageReader::New();
142 std::vector<std::string> filenames;
143 filenames.push_back(filename);
144 mReader->SetInputFilenames(filenames);
145 mReader->SetSlice(slice); // Only used for SLICED type
146 mReader->Update(type);
148 SetFilename(filename, n);
149 // mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
150 //mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
151 //mBaseFileNameNumber = n;
153 if (mReader->GetLastError().size() == 0) {
154 mImage=mReader->GetOutput();
155 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
156 mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
157 mSlicers[i]->SetImage(mReader->GetOutput());
160 mLastError = mReader->GetLastError();
164 // mFileName.append("_"+clitk::toString(n));
168 //----------------------------------------------------------------------------
171 //----------------------------------------------------------------------------
172 void vvSlicerManager::SetImage(vvImage::Pointer image)
175 for (unsigned int i = 0; i < mSlicers.size(); i++) {
176 mSlicers[i]->SetImage(image);
179 //----------------------------------------------------------------------------
182 //----------------------------------------------------------------------------
183 bool vvSlicerManager::SetImages(std::vector<std::string> filenames,LoadedImageType type, int n)
186 std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);
188 fileWithoutExtension += "_dicom";
189 else if (type == MERGED)
190 fileWithoutExtension += "_merged";
191 else if (type == MERGEDWITHTIME)
192 fileWithoutExtension += "_merged_wt";
194 mFileName = vtksys::SystemTools::GetFilenameName(mFileName);
195 mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);
196 if (mReader.IsNull())
197 mReader = vvImageReader::New();
198 mReader->SetInputFilenames(filenames);
199 mReader->Update(type);
201 mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));
202 mBaseFileNameNumber = n;
204 if (mReader->GetLastError().size() == 0) {
205 mImage=mReader->GetOutput();
206 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
207 mSlicers[i]->SetFileName(fileWithoutExtension);
208 mSlicers[i]->SetImage(mReader->GetOutput());
211 mLastError = mReader->GetLastError();
215 mFileName.append("_"+clitk::toString(n));
219 //----------------------------------------------------------------------------
222 //----------------------------------------------------------------------------
223 bool vvSlicerManager::SetOverlay(std::string filename,int dim, std::string component)
225 mOverlayName = filename;
226 mOverlayComponent = component;
227 if (dim > mImage->GetNumberOfDimensions()) {
228 mLastError = " Overlay dimension cannot be greater then reference image!";
231 if (mOverlayReader.IsNull())
232 mOverlayReader = vvImageReader::New();
233 std::vector<std::string> filenames;
234 filenames.push_back(filename);
235 mOverlayReader->SetInputFilenames(filenames);
236 mOverlayReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);
237 if (mOverlayReader->GetLastError().size() == 0) {
238 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
239 mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
242 mLastError = mOverlayReader->GetLastError();
247 //----------------------------------------------------------------------------
250 //----------------------------------------------------------------------------
251 bool vvSlicerManager::SetFusion(std::string filename,int dim, std::string component)
253 mFusionName = filename;
254 mFusionComponent = component;
255 if (dim > mImage->GetNumberOfDimensions()) {
256 mLastError = " Overlay dimension cannot be greater then reference image!";
259 if (mFusionReader.IsNull())
260 mFusionReader = vvImageReader::New();
261 std::vector<std::string> filenames;
262 filenames.push_back(filename);
263 mFusionReader->SetInputFilenames(filenames);
264 mFusionReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);
265 if (mFusionReader->GetLastError().size() == 0) {
266 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
267 mSlicers[i]->SetFusion(mFusionReader->GetOutput());
270 mLastError = mFusionReader->GetLastError();
273 double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
274 mFusionLevel = (fusRange[0]+fusRange[1])/2;
275 mFusionWindow = fusRange[1]-fusRange[0];
278 //----------------------------------------------------------------------------
281 //----------------------------------------------------------------------------
282 bool vvSlicerManager::SetVF(std::string filename)
284 if (mVectorReader.IsNull())
285 mVectorReader = vvImageReader::New();
286 mVectorReader->SetInputFilename(filename);
287 mVectorReader->Update(VECTORFIELD);
288 if (mVectorReader->GetLastError().size() != 0) {
289 mLastError = mVectorReader->GetLastError();
292 return SetVF(mVectorReader->GetOutput(),filename);
294 //----------------------------------------------------------------------------
297 //----------------------------------------------------------------------------
298 bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)
300 if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions()) {
301 mLastError = "Sorry, vector field dimension cannot be greater then reference image.";
304 if (vf->GetNumberOfDimensions() == 4) {
305 if (vf->GetSpacing()[3] != mImage->GetSpacing()[3]) {
306 mLastError = "Sorry, vector field time spacing cannot be different from time spacing of the reference image.";
309 if (vf->GetOrigin()[3] != mImage->GetOrigin()[3]) {
310 mLastError = "Sorry, vector field time origin cannot be different from time origin of the reference image.";
316 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
317 mSlicers[i]->SetVF(vf);
321 //----------------------------------------------------------------------------
324 //----------------------------------------------------------------------------
325 vvSlicer* vvSlicerManager::GetSlicer(int i)
329 //----------------------------------------------------------------------------
332 //----------------------------------------------------------------------------
333 void vvSlicerManager::UpdateSlicer(int num, bool state)
335 if (mSlicers[num]->GetImage())
336 mSlicers[num]->SetDisplayMode(state);
338 //----------------------------------------------------------------------------
341 //----------------------------------------------------------------------------
342 void vvSlicerManager::SetSlicerWindow(int i, vtkRenderWindow* RW)
344 mSlicers[i]->SetRenderWindow(i,RW);
346 //----------------------------------------------------------------------------
349 //----------------------------------------------------------------------------
350 void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* style)
352 vvSlicerManagerCommand *smc = vvSlicerManagerCommand::New();
354 smc->SetSlicerNumber(i);
355 mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);
357 mSlicers[i]->GetRenderWindow()->GetInteractor()->
358 GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
359 mSlicers[i]->GetRenderWindow()->GetInteractor()->
360 GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);
361 mSlicers[i]->GetRenderWindow()->GetInteractor()->
362 GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);
363 mSlicers[i]->GetRenderWindow()->GetInteractor()->
364 GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);
365 mSlicers[i]->GetRenderWindow()->GetInteractor()->
366 GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);
367 mSlicers[i]->GetRenderWindow()->GetInteractor()->
368 GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);
369 mSlicers[i]->GetRenderWindow()->GetInteractor()->
370 GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);
371 mSlicers[i]->GetRenderWindow()->GetInteractor()->
372 GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);
373 mSlicers[i]->GetRenderWindow()->GetInteractor()->
374 GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);
375 mSlicers[i]->GetRenderWindow()->GetInteractor()->
376 GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);
377 // mSlicers[i]->GetRenderWindow()->GetInteractor()->
378 // GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);
379 mSlicers[i]->GetRenderWindow()->GetInteractor()->
380 GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);
381 mSlicers[i]->GetRenderWindow()->GetInteractor()->
382 GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc);
385 //----------------------------------------------------------------------------
388 //----------------------------------------------------------------------------
389 void vvSlicerManager::LeftButtonReleaseEvent(int slicer)
391 emit LeftButtonReleaseSignal(slicer);
393 //----------------------------------------------------------------------------
396 //----------------------------------------------------------------------------
397 void vvSlicerManager::SetTSlice(int slice)
401 else if (slice > mSlicers[0]->GetTMax())
402 slice = mSlicers[0]->GetTMax();
404 mLandmarks->SetTime(slice);
405 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
406 if (slice != mSlicers[i]->GetTSlice()) {
407 mSlicers[i]->SetTSlice(slice);
408 if (mSlicers[i]->GetImageActor()->GetVisibility())
413 //----------------------------------------------------------------------------
416 //----------------------------------------------------------------------------
417 void vvSlicerManager::SetNextTSlice(int originating_slicer)
419 int t = mSlicers[0]->GetTSlice();
421 if (t > mSlicers[0]->GetTMax())
423 emit UpdateTSlice(originating_slicer,t);
425 //----------------------------------------------------------------------------
428 //----------------------------------------------------------------------------
429 void vvSlicerManager::SetPreviousTSlice(int originating_slicer)
431 int t = mSlicers[0]->GetTSlice();
434 t = mSlicers[0]->GetTMax();
435 emit UpdateTSlice(originating_slicer,t);
437 //----------------------------------------------------------------------------
440 //----------------------------------------------------------------------------
441 void vvSlicerManager::ToggleInterpolation()
443 bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());
444 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
445 mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);
446 if (mSlicers[i]->GetOverlayActor())
447 mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);
448 if (mSlicers[i]->GetFusionActor())
449 mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);
452 //----------------------------------------------------------------------------
455 //----------------------------------------------------------------------------
456 void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)
460 else if (tslice > mSlicers[slicer]->GetTMax())
461 tslice = mSlicers[slicer]->GetTMax();
463 mLandmarks->SetTime(tslice);
465 if (mSlicers[slicer]->GetTSlice() == tslice) return;
467 mSlicers[slicer]->SetTSlice(tslice);
468 if (mSlicers[slicer]->GetImageActor()->GetVisibility())
469 UpdateTSlice(slicer);
471 //----------------------------------------------------------------------------
474 //----------------------------------------------------------------------------
475 void vvSlicerManager::SetColorWindow(double s)
477 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
478 mSlicers[i]->SetColorWindow(s);
481 //----------------------------------------------------------------------------
484 //----------------------------------------------------------------------------
485 void vvSlicerManager::SetColorLevel(double s)
487 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
488 mSlicers[i]->SetColorLevel(s);
491 //----------------------------------------------------------------------------
493 //----------------------------------------------------------------------------
494 void vvSlicerManager::SetCursorAndCornerAnnotationVisibility(int s)
496 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
497 mSlicers[i]->SetCursorVisibility(s);
498 mSlicers[i]->SetCornerAnnotationVisibility(s);
501 //----------------------------------------------------------------------------
503 //----------------------------------------------------------------------------
504 void vvSlicerManager::SetOpacity(int i, double factor)
506 mSlicers[i]->SetOpacity(1/factor);
508 //----------------------------------------------------------------------------
511 //----------------------------------------------------------------------------
512 void vvSlicerManager::UpdateViews(int current,int slicer)
514 double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
515 /mSlicers[slicer]->GetInput()->GetSpacing()[0];
516 double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
517 /mSlicers[slicer]->GetInput()->GetSpacing()[1];
518 double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
519 /mSlicers[slicer]->GetInput()->GetSpacing()[2];
521 if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
522 x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
523 y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
524 y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
525 z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
526 z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
527 mSlicers[slicer]->UpdateCursorPosition();
528 mSlicers[slicer]->SetCursorColor(10,212,255);
530 switch (mSlicers[slicer]->GetSliceOrientation()) {
531 case vtkImageViewer2::SLICE_ORIENTATION_XY:
532 if (mSlicers[slicer]->GetSlice() == (int)floor(z))
533 mSlicers[slicer]->Render();
535 mSlicers[slicer]->SetSlice((int)floor(z));
538 case vtkImageViewer2::SLICE_ORIENTATION_XZ:
539 if (mSlicers[slicer]->GetSlice() == (int)floor(y))
540 mSlicers[slicer]->Render();
542 mSlicers[slicer]->SetSlice((int)floor(y));
545 case vtkImageViewer2::SLICE_ORIENTATION_YZ:
546 if (mSlicers[slicer]->GetSlice() == (int)floor(x))
547 mSlicers[slicer]->Render();
549 mSlicers[slicer]->SetSlice((int)floor(x));
553 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
554 if (i != (unsigned int)slicer && mSlicers[i]->GetImageActor()->GetVisibility()
555 && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2
556 && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {
557 mSlicers[i]->SetCurrentPosition(mSlicers[slicer]->GetCurrentPosition()[0],
558 mSlicers[slicer]->GetCurrentPosition()[1],
559 mSlicers[slicer]->GetCurrentPosition()[2],
560 mSlicers[slicer]->GetTSlice());
561 mSlicers[i]->UpdateCursorPosition();
562 if (current) { //do not display corner annotation if image is the one picked
563 mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,
564 -VTK_DOUBLE_MAX, mSlicers[slicer]->GetTSlice());
565 mSlicers[i]->SetCursorColor(255,10,212);
567 mSlicers[i]->SetCursorColor(150,10,282);
569 switch (mSlicers[i]->GetSliceOrientation()) {
570 case vtkImageViewer2::SLICE_ORIENTATION_XY:
571 if (mSlicers[i]->GetSlice() == (int)floor(z))
572 mSlicers[i]->Render();
574 mSlicers[i]->SetSlice((int)floor(z));
577 case vtkImageViewer2::SLICE_ORIENTATION_XZ:
578 if (mSlicers[i]->GetSlice() == (int)floor(y))
579 mSlicers[i]->Render();
581 mSlicers[i]->SetSlice((int)floor(y));
584 case vtkImageViewer2::SLICE_ORIENTATION_YZ:
585 if (mSlicers[i]->GetSlice() == (int)floor(x))
586 mSlicers[i]->Render();
588 mSlicers[i]->SetSlice((int)floor(x));
597 //----------------------------------------------------------------------------
600 //----------------------------------------------------------------------------
601 void vvSlicerManager::UpdateLinked(int slicer)
603 double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
604 /mSlicers[slicer]->GetInput()->GetSpacing()[0];
605 double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
606 /mSlicers[slicer]->GetInput()->GetSpacing()[1];
607 double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
608 /mSlicers[slicer]->GetInput()->GetSpacing()[2];
610 if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
611 x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
612 y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
613 y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
614 z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
615 z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
616 for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {
617 emit UpdateLinkManager(*i, slicer,mSlicers[slicer]->GetCurrentPosition()[0],
618 mSlicers[slicer]->GetCurrentPosition()[1],
619 mSlicers[slicer]->GetCurrentPosition()[2],mSlicers[slicer]->GetTSlice());
623 //----------------------------------------------------------------------------
625 //----------------------------------------------------------------------------
626 void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *slicer, bool bPropagate)
628 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
629 vtkCamera *camera = mSlicers[i] ->GetRenderer()->GetActiveCamera();
630 vtkCamera *refCam = slicer->GetRenderer()->GetActiveCamera();
631 camera->SetParallelScale(refCam->GetParallelScale());
633 double position[3], focal[3];
634 camera->GetPosition(position);
635 camera->GetFocalPoint(focal);
637 double refPosition[3], refFocal[3];
638 refCam->GetPosition(refPosition);
639 refCam->GetFocalPoint(refFocal);
641 if(slicer->GetSliceOrientation()==mSlicers[i]->GetSliceOrientation()) {
642 for(int i=0; i<3; i++) {
643 position[i] = refPosition[i];
644 focal[i] = refFocal[i];
648 if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
649 if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
650 position[0] = refPosition[0];
651 focal[0] = refFocal[0];
653 if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
654 position[1] = refPosition[1];
655 focal[1] = refFocal[1];
659 if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
660 if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
661 position[2] = refPosition[2];
662 focal[2] = refFocal[2];
664 if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
665 position[0] = refPosition[0];
666 focal[0] = refFocal[0];
670 if(slicer->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_YZ) {
671 if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XY) {
672 position[1] = refPosition[1];
673 focal[1] = refFocal[1];
675 if(mSlicers[i]->GetSliceOrientation()==vtkImageViewer2::SLICE_ORIENTATION_XZ) {
676 position[2] = refPosition[2];
677 focal[2] = refFocal[2];
681 camera->SetFocalPoint(focal);
682 camera->SetPosition(position);
685 mSlicers[i]->ForceUpdateDisplayExtent();
690 for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)
691 emit UpdateLinkedNavigation(*i, this);
693 //----------------------------------------------------------------------------
695 //----------------------------------------------------------------------------
696 double vvSlicerManager::GetColorWindow()
699 return mSlicers[0]->GetColorWindow();
702 //----------------------------------------------------------------------------
705 //----------------------------------------------------------------------------
706 double vvSlicerManager::GetColorLevel()
709 return mSlicers[0]->GetColorLevel();
712 //----------------------------------------------------------------------------
715 //----------------------------------------------------------------------------
716 void vvSlicerManager::Render()
718 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
719 mSlicers[i]->Render();
722 //----------------------------------------------------------------------------
725 //----------------------------------------------------------------------------
726 void vvSlicerManager::GenerateDefaultLookupTable()
729 SetColorMap(mColorMap);
731 //----------------------------------------------------------------------------
734 //----------------------------------------------------------------------------
735 void vvSlicerManager::Reload()
737 mReader->Update(mType);
738 mImage=mReader->GetOutput();
739 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
740 mSlicers[i]->SetImage(mImage);
743 //----------------------------------------------------------------------------
746 //----------------------------------------------------------------------------
747 void vvSlicerManager::ReloadFusion()
749 mFusionReader->Update();
750 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
751 mSlicers[i]->SetFusion(mFusionReader->GetOutput());
752 mSlicers[i]->Render();
755 //----------------------------------------------------------------------------
758 //----------------------------------------------------------------------------
759 void vvSlicerManager::ReloadOverlay()
761 mOverlayReader->Update();
762 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
763 mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
764 mSlicers[i]->Render();
767 //----------------------------------------------------------------------------
770 //----------------------------------------------------------------------------
771 void vvSlicerManager::ReloadVF()
773 mVectorReader->Update(VECTORFIELD); //deletes the old images through the VF::Init() function
774 mVF=mVectorReader->GetOutput();
775 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
776 mSlicers[i]->SetVF(mVF);
777 mSlicers[i]->Render();
780 //----------------------------------------------------------------------------
783 //----------------------------------------------------------------------------
784 void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)
786 if (actor_type =="overlay")
787 mOverlayReader = NULL;
789 if (actor_type =="fusion")
790 mFusionReader = NULL;
792 for (unsigned int i = 0; i < mSlicers.size(); i++)
793 mSlicers[i]->RemoveActor(actor_type,overlay_index);
795 if (actor_type=="vector") {
800 //----------------------------------------------------------------------------
803 //----------------------------------------------------------------------------
804 void vvSlicerManager::RemoveActors()
806 ///This method leaks a few objects. See RemoveActor for what a
807 ///correct implementation would look like
808 //DS -> probably due to the reader (now released in the
809 //RemoveActor() function. (I hope)
810 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
811 mSlicers[i]->SetDisplayMode(0);
812 mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());
815 //----------------------------------------------------------------------------
818 //----------------------------------------------------------------------------
819 void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)
821 // int view = mSlicers[slicer]->GetSliceOrientation();
822 // int slice = mSlicers[slicer]->GetSlice();
823 double x = mSlicers[slicer]->GetCursorPosition()[0];
824 double y = mSlicers[slicer]->GetCursorPosition()[1];
825 double z = mSlicers[slicer]->GetCursorPosition()[2];
826 double X = (x - mSlicers[slicer]->GetInput()->GetOrigin()[0])/
827 mSlicers[slicer]->GetInput()->GetSpacing()[0];
828 double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/
829 mSlicers[slicer]->GetInput()->GetSpacing()[1];
830 double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/
831 mSlicers[slicer]->GetInput()->GetSpacing()[2];
832 double value = -VTK_DOUBLE_MAX;
834 double xVec=0, yVec=0, zVec=0, valueVec=0;
837 double valueOver=0, valueFus=0;
838 if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
839 X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
840 Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
841 Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
842 Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
843 Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {
844 value = this->GetScalarComponentAsDouble(mSlicers[slicer]->GetInput(), X, Y, Z);
846 if (mSlicers[slicer]->GetVFActor() && mSlicers[slicer]->GetVFActor()->GetVisibility()) {
848 unsigned int currentTime = mSlicers[slicer]->GetTSlice();
849 vtkImageData *vf = NULL;
851 if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)
852 vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];
854 vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];
857 double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];
858 double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];
859 double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];
860 xVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 0);
861 yVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 1);
862 zVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 2);
863 valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);
866 if (mSlicers[slicer]->GetOverlayActor() && mSlicers[slicer]->GetOverlayActor()->GetVisibility()) {
868 double Xover = (x - mSlicers[slicer]->GetOverlay()->GetOrigin()[0])
869 /mSlicers[slicer]->GetOverlay()->GetSpacing()[0];
870 double Yover = (y - mSlicers[slicer]->GetOverlay()->GetOrigin()[1])
871 /mSlicers[slicer]->GetOverlay()->GetSpacing()[1];
872 double Zover = (z - mSlicers[slicer]->GetOverlay()->GetOrigin()[2])
873 /mSlicers[slicer]->GetOverlay()->GetSpacing()[2];
874 if (Xover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[0] &&
875 Xover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[1] &&
876 Yover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[2] &&
877 Yover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[3] &&
878 Zover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[4] &&
879 Zover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[5]) {
880 valueOver = this->GetScalarComponentAsDouble(static_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput()), Xover, Yover, Zover);
883 if (mSlicers[slicer]->GetFusionActor() && mSlicers[slicer]->GetFusionActor()->GetVisibility()) {
885 double Xfus = (x - mSlicers[slicer]->GetFusion()->GetOrigin()[0])
886 /mSlicers[slicer]->GetFusion()->GetSpacing()[0];
887 double Yfus = (y - mSlicers[slicer]->GetFusion()->GetOrigin()[1])
888 /mSlicers[slicer]->GetFusion()->GetSpacing()[1];
889 double Zfus = (z - mSlicers[slicer]->GetFusion()->GetOrigin()[2])
890 /mSlicers[slicer]->GetFusion()->GetSpacing()[2];
891 if (Xfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[0] &&
892 Xfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[1] &&
893 Yfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[2] &&
894 Yfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[3] &&
895 Zfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[4] &&
896 Zfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[5]) {
897 valueFus = this->GetScalarComponentAsDouble(static_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput()), Xfus, Yfus, Zfus);
900 emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),
902 emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);
903 emit UpdateOverlay(displayOver,valueOver,value);
904 emit UpdateFusion(displayFus,valueFus);
905 for (unsigned int i = 0; i < mSlicers.size(); i++) {
906 if (mSlicers[i]->GetImageActor()->GetVisibility() == 1)
907 emit UpdateWindows(i,mSlicers[i]->GetSliceOrientation(),mSlicers[i]->GetSlice());
909 emit UpdateWindows(i,-1,-1);
913 //----------------------------------------------------------------------------
916 //----------------------------------------------------------------------------
917 void vvSlicerManager::Activated()
919 emit currentImageChanged(mId);
921 //----------------------------------------------------------------------------
924 //----------------------------------------------------------------------------
925 void vvSlicerManager::Picked()
927 emit currentPickedImageChanged(mId);
929 //----------------------------------------------------------------------------
931 //----------------------------------------------------------------------------
932 void vvSlicerManager::UpdateWindowLevel()
934 emit WindowLevelChanged(mSlicers[0]->GetColorWindow(),mSlicers[0]->GetColorLevel(),mPreset,mColorMap);
936 //----------------------------------------------------------------------------
939 //----------------------------------------------------------------------------
940 void vvSlicerManager::UpdateSlice(int slicer)
942 if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {
943 //DD("============= NOTHING");
946 emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());
947 mSlicers[slicer]->Render(); // DS <-- I add this, this could/must be the only Render ...
948 mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();
950 //----------------------------------------------------------------------------
953 //----------------------------------------------------------------------------
954 void vvSlicerManager::UpdateTSlice(int slicer)
956 if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {
957 if (mPreviousTSlice[slicer] == mSlicers[slicer]->GetTSlice()) {
958 // DD("************** NOTHING ***********");
962 mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();
963 mPreviousTSlice[slicer] = mSlicers[slicer]->GetTSlice();
964 emit UpdateTSlice(slicer,mSlicers[slicer]->GetTSlice());
966 //----------------------------------------------------------------------------
969 //----------------------------------------------------------------------------
970 void vvSlicerManager::UpdateSliceRange(int slicer)
972 emit UpdateSliceRange(slicer,
973 mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],
974 0,mSlicers[slicer]->GetTMax());
976 //----------------------------------------------------------------------------
979 //----------------------------------------------------------------------------
980 void vvSlicerManager::SetPreset(int preset)
982 //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
983 double window = mSlicers[0]->GetColorWindow();
984 double level = mSlicers[0]->GetColorLevel();
986 std::string component_type=mImage->GetScalarTypeAsITKString();
990 mImage->GetScalarRange(range);
991 window = range[1] - range[0];
992 level = (range[1] + range[0])* 0.5;
1022 this->SetColorWindow(window);
1023 this->SetColorLevel(level);
1030 //----------------------------------------------------------------------------
1033 //----------------------------------------------------------------------------
1034 void vvSlicerManager::SetLocalColorWindowing(const int slicer)
1037 this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max);
1038 this->SetColorWindow(max-min);
1039 this->SetColorLevel(0.5*(min+max));
1040 this->UpdateWindowLevel();
1043 //----------------------------------------------------------------------------
1046 //----------------------------------------------------------------------------
1047 void vvSlicerManager::SetColorMap()
1049 SetColorMap(mColorMap);
1051 //----------------------------------------------------------------------------
1054 //----------------------------------------------------------------------------
1055 void vvSlicerManager::SetColorMap(int colormap)
1058 range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];
1059 range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];
1061 double window = mSlicers[0]->GetWindowLevel()->GetWindow();
1062 double level = mSlicers[0]->GetWindowLevel()->GetLevel();
1064 vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
1073 LUT = vtkLookupTable::New();
1074 LUT->SetValueRange(0,1);
1075 LUT->SetSaturationRange(1,1);
1076 LUT->SetHueRange(0,0.18);
1080 LUT = vtkLookupTable::New();
1081 LUT->SetValueRange(0,1);
1082 LUT->SetSaturationRange(1,1);
1083 LUT->SetHueRange(0.4,0.80);
1087 LUT = vtkLookupTable::New();
1088 LUT->SetValueRange(0,1);
1089 LUT->SetSaturationRange(1,1);
1090 LUT->SetHueRange(0,1);
1094 LUT = vtkLookupTable::New();
1095 LUT->SetValueRange(0.,1);
1096 LUT->SetSaturationRange(1,1);
1097 LUT->SetHueRange(1,0.1);
1098 //LUT->SetRampToLinear();
1102 LUT->SetTableRange(level-fabs(window)/4,level+fabs(window)/4);
1105 vtkLookupTable* fusLUT = NULL;
1106 if (mSlicers[0]->GetFusion()) {
1107 fusLUT = vtkLookupTable::New();
1108 double fusRange [2];
1109 fusRange[0] = mFusionLevel - mFusionWindow/2;
1110 fusRange[1] = mFusionLevel + mFusionWindow/2;
1111 fusLUT->SetTableRange(fusRange[0],fusRange[1]);
1112 fusLUT->SetValueRange(1,1);
1113 fusLUT->SetSaturationRange(1,1);
1114 if (mFusionColorMap == 1)
1115 fusLUT->SetHueRange(0,0.18);
1116 else if (mFusionColorMap == 2)
1117 fusLUT->SetHueRange(0.4,0.80);
1118 else if (mFusionColorMap == 3)
1119 fusLUT->SetHueRange(0,1);
1121 if (mFusionColorMap == 0)
1124 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
1125 if (mSlicers[i]->GetOverlay() && mSlicers[i]->GetOverlayActor()->GetVisibility()) {
1126 vtkLookupTable* supLUT = vtkLookupTable::New();
1127 supLUT->SetTableRange(range[0],range[1]);
1128 supLUT->SetValueRange(1,1);
1129 supLUT->SetSaturationRange(1,1);
1130 supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);
1132 vtkLookupTable* invLUT = vtkLookupTable::New();
1133 invLUT->SetTableRange(range[0],range[1]);
1134 invLUT->SetValueRange(1,1);
1135 invLUT->SetSaturationRange(1,1);
1136 invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);
1138 dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
1139 ->SetWindowLevelMode(true);
1140 mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);
1141 mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);
1144 } else if (mSlicers[i]->GetOverlay()) {
1145 //dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
1146 //->SetWindowLevelMode(false);
1147 mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
1149 mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
1151 if (mSlicers[i]->GetFusion() && mSlicers[i]->GetFusionActor()->GetVisibility()) {
1152 mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);
1153 mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);
1154 mSlicers[i]->GetFusionMapper()->SetWindow(mFusionWindow);
1155 mSlicers[i]->GetFusionMapper()->SetLevel(mFusionLevel);
1161 mColorMap = colormap;
1163 //----------------------------------------------------------------------------
1166 //----------------------------------------------------------------------------
1167 vvLandmarks* vvSlicerManager::GetLandmarks()
1169 if (mLandmarks == NULL) {
1170 mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);
1171 for (unsigned int i = 0; i < mSlicers.size(); i++)
1172 mSlicers[i]->SetLandmarks(mLandmarks);
1176 //----------------------------------------------------------------------------
1179 //----------------------------------------------------------------------------
1180 void vvSlicerManager::AddLandmark(float x,float y,float z,float t)
1182 double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];
1183 double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];
1184 double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];
1185 if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0] &&
1186 x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1] &&
1187 y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2] &&
1188 y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3] &&
1189 z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4] &&
1190 z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]) {
1191 double value = this->GetScalarComponentAsDouble(mSlicers[0]->GetInput(), x_index, y_index, z_index);
1192 this->GetLandmarks()->AddLandmark(x,y,z,t,value);
1193 emit LandmarkAdded();
1196 //----------------------------------------------------------------------------
1198 //----------------------------------------------------------------------------
1199 void vvSlicerManager::PrevImage(int slicer)
1201 emit ChangeImageWithIndexOffset(this, slicer, -1);
1203 //----------------------------------------------------------------------------
1205 //----------------------------------------------------------------------------
1206 void vvSlicerManager::NextImage(int slicer)
1208 emit ChangeImageWithIndexOffset(this, slicer, 1);
1210 //----------------------------------------------------------------------------
1212 //----------------------------------------------------------------------------
1213 void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice)
1215 emit AVerticalSliderHasChanged(slicer, slice);
1218 //----------------------------------------------------------------------------
1220 //----------------------------------------------------------------------------
1221 double vvSlicerManager::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component)
1224 return mSlicers[0]->GetScalarComponentAsDouble(image, X, Y, Z, ix, iy, iz, component);
1226 //----------------------------------------------------------------------------