1 /*=========================================================================
5 Author : Pierre Seroul (pierre.seroul@gmail.com)
8 Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
9 CREATIS-LRMN http://www.creatis.insa-lyon.fr
11 This program is free software: you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
13 the Free Software Foundation, version 3 of the License.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>.
23 =========================================================================*/
24 #include "vvSlicerManager.h"
28 #include "vvSlicerManagerCommand.h"
29 #include "vvInteractorStyleNavigator.h"
30 #include "vvLandmarks.h"
31 #include "vvImageReader.h"
32 #include "vvImageReader.h"
34 #include "vvImageMapToWLColors.h"
36 #include "vtkImageActor.h"
37 #include "vtkImageData.h"
38 #include "vtkRenderWindow.h"
39 #include "vtkRendererCollection.h"
40 #include "vtkRenderWindowInteractor.h"
41 #include "vtkImageMapToWindowLevelColors.h"
42 #include "vtkWindowLevelLookupTable.h"
43 #include "vtkColorTransferFunction.h"
44 #include "vtkImageClip.h"
45 #include <vtkLODActor.h>
46 #include <vtkPointData.h>
48 #include <vtksys/SystemTools.hxx>
49 //----------------------------------------------------------------------------
51 vvSlicerManager::vvSlicerManager(int numberOfSlicers)
60 mType = UNDEFINEDIMAGETYPE;
74 mOverlayReader = NULL;
79 for ( int i = 0; i < numberOfSlicers; i++)
81 vvSlicer *slicer = vvSlicer::New();
82 mSlicers.push_back(slicer);
86 vvSlicerManager::~vvSlicerManager()
88 for ( unsigned int i = 0; i < mSlicers.size(); i++)
90 if (mSlicers[i] != NULL)
91 mSlicers[i]->Delete();
103 delete mOverlayReader;
107 delete mFusionReader;
113 void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)
115 for ( unsigned int i = 0; i < mSlicers.size(); i++)
117 mSlicers[i]->AddContour(contour,propagate);
121 void vvSlicerManager::ToggleContourSuperposition()
123 for ( unsigned int i = 0; i < mSlicers.size(); i++)
124 mSlicers[i]->ToggleContourSuperposition();
127 bool vvSlicerManager::SetImage(std::string filename,LoadedImageType type)
129 mFileName = filename;
132 mReader = new vvImageReader;
133 std::vector<std::string> filenames;
134 filenames.push_back(filename);
135 mReader->SetInputFilenames(filenames);
136 mReader->Update(type);
137 if (mReader->GetLastError().size() == 0)
139 mImage=mReader->GetOutput();
140 for ( unsigned int i = 0; i < mSlicers.size(); i++)
142 mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
143 mSlicers[i]->SetImage(mReader->GetOutput());
148 mLastError = mReader->GetLastError();
154 void vvSlicerManager::SetImage(vvImage::Pointer image)
157 for (unsigned int i = 0; i < mSlicers.size();i++)
159 mSlicers[i]->SetImage(image);
163 bool vvSlicerManager::SetImages(std::vector<std::string> filenames,LoadedImageType type)
166 std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);
168 fileWithoutExtension += "_dicom";
169 else if (type == MERGED)
170 fileWithoutExtension += "_merged";
171 else if (type == MERGEDWITHTIME)
172 fileWithoutExtension += "_merged_wt";
174 mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);
176 mReader = new vvImageReader;
177 mReader->SetInputFilenames(filenames);
178 mReader->Update(type);
181 if (mReader->GetLastError().size() == 0)
183 mImage=mReader->GetOutput();
184 for ( unsigned int i = 0; i < mSlicers.size(); i++)
186 mSlicers[i]->SetFileName(fileWithoutExtension);
187 mSlicers[i]->SetImage(mReader->GetOutput());
192 mLastError = mReader->GetLastError();
198 bool vvSlicerManager::SetOverlay(std::string filename,int dim, std::string component)
200 mOverlayName = filename;
201 mOverlayComponent = component;
202 if (dim > mImage->GetNumberOfDimensions())
204 mLastError = " Overlay dimension cannot be greater then reference image!";
207 if (mOverlayReader == NULL)
208 mOverlayReader = new vvImageReader;
209 std::vector<std::string> filenames;
210 filenames.push_back(filename);
211 mOverlayReader->SetInputFilenames(filenames);
212 mOverlayReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);
213 if (mOverlayReader->GetLastError().size() == 0)
215 for ( unsigned int i = 0; i < mSlicers.size(); i++)
217 mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
222 mLastError = mOverlayReader->GetLastError();
228 bool vvSlicerManager::SetFusion(std::string filename,int dim, std::string component)
230 mFusionName = filename;
231 mFusionComponent = component;
232 if (dim > mImage->GetNumberOfDimensions())
234 mLastError = " Overlay dimension cannot be greater then reference image!";
237 if (mFusionReader == NULL)
238 mFusionReader = new vvImageReader;
239 std::vector<std::string> filenames;
240 filenames.push_back(filename);
241 mFusionReader->SetInputFilenames(filenames);
242 mFusionReader->Update(mImage->GetNumberOfDimensions(),component.c_str(),mType);
243 if (mFusionReader->GetLastError().size() == 0)
245 for ( unsigned int i = 0; i < mSlicers.size(); i++)
247 mSlicers[i]->SetFusion(mFusionReader->GetOutput());
252 mLastError = mFusionReader->GetLastError();
255 double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();
256 mFusionLevel = (fusRange[0]+fusRange[1])/2;
257 mFusionWindow = fusRange[1]-fusRange[0];
261 bool vvSlicerManager::SetVF(std::string filename)
263 if (mVectorReader == NULL)
264 mVectorReader = new vvImageReader;
265 mVectorReader->SetInputFilename(filename);
266 mVectorReader->Update(VECTORFIELD);
267 if (mVectorReader->GetLastError().size() != 0)
269 mLastError = mVectorReader->GetLastError();
273 return SetVF(mVectorReader->GetOutput(),filename);
276 bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)
278 if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions())
280 mLastError = " Vector field dimension cannot be greater then reference image!";
285 for ( unsigned int i = 0; i < mSlicers.size(); i++)
287 mSlicers[i]->SetVF(vf);
292 void vvSlicerManager::SetExtractedImage(std::string filename,vvImage::Pointer image, int slice)
294 mFileName = filename;
295 mImage = vvImage::New();
296 if (image->GetNumberOfDimensions() == 4)
298 mImage->AddImage(image->GetVTKImages()[slice]);
299 for ( unsigned int i = 0; i < mSlicers.size(); i++)
301 mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
302 mSlicers[i]->SetImage(mImage);
307 vtkImageClip* clipper = vtkImageClip::New();
309 image->GetVTKImages()[0]->GetWholeExtent(extent);
310 clipper->SetInput(image->GetVTKImages()[0]);
311 clipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],extent[3],slice,slice);
313 mImage->AddImage(clipper->GetOutput());
314 for ( unsigned int i = 0; i < mSlicers.size(); i++)
316 mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));
317 mSlicers[i]->SetImage(mImage);
323 vvSlicer* vvSlicerManager::GetSlicer(int i)
328 void vvSlicerManager::UpdateSlicer(int num, bool state)
330 if (mSlicers[num]->GetImage())
331 mSlicers[num]->SetDisplayMode(state);
334 void vvSlicerManager::SetSlicerWindow(int i, vtkRenderWindow* RW)
336 mSlicers[i]->SetRenderWindow(i,RW);
339 void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* style)
341 vvSlicerManagerCommand *smc = vvSlicerManagerCommand::New();
342 std::cerr << smc << ":" << i << " " << this << endl;
344 smc->SetSlicerNumber(i);
345 mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);
347 mSlicers[i]->GetRenderWindow()->GetInteractor()->
348 GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);
349 mSlicers[i]->GetRenderWindow()->GetInteractor()->
350 GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);
351 mSlicers[i]->GetRenderWindow()->GetInteractor()->
352 GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);
353 mSlicers[i]->GetRenderWindow()->GetInteractor()->
354 GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);
355 mSlicers[i]->GetRenderWindow()->GetInteractor()->
356 GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);
357 mSlicers[i]->GetRenderWindow()->GetInteractor()->
358 GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);
359 mSlicers[i]->GetRenderWindow()->GetInteractor()->
360 GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);
361 mSlicers[i]->GetRenderWindow()->GetInteractor()->
362 GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);
363 mSlicers[i]->GetRenderWindow()->GetInteractor()->
364 GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);
365 mSlicers[i]->GetRenderWindow()->GetInteractor()->
366 GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);
370 void vvSlicerManager::SetTSlice(int slice)
374 else if (slice > mSlicers[0]->GetTMax())
375 slice = mSlicers[0]->GetTMax();
377 mLandmarks->SetTime(slice);
378 for ( unsigned int i = 0; i < mSlicers.size(); i++)
380 mSlicers[i]->SetTSlice(slice);
381 if (mSlicers[i]->GetImageActor()->GetVisibility())
386 void vvSlicerManager::SetNextTSlice(int originating_slicer)
388 int t = mSlicers[0]->GetTSlice();
390 if (t > mSlicers[0]->GetTMax())
392 emit UpdateTSlice(originating_slicer,t);
395 void vvSlicerManager::SetPreviousTSlice(int originating_slicer)
397 int t = mSlicers[0]->GetTSlice();
400 t = mSlicers[0]->GetTMax();
401 emit UpdateTSlice(originating_slicer,t);
404 void vvSlicerManager::ToggleInterpolation()
406 bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());
407 for ( unsigned int i = 0; i < mSlicers.size(); i++)
409 mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);
414 void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)
418 else if (tslice > mSlicers[slicer]->GetTMax())
419 tslice = mSlicers[slicer]->GetTMax();
421 mLandmarks->SetTime(tslice);
422 mSlicers[slicer]->SetTSlice(tslice);
423 if (mSlicers[slicer]->GetImageActor()->GetVisibility())
424 UpdateTSlice(slicer);
427 void vvSlicerManager::SetColorWindow(double s)
429 for ( unsigned int i = 0; i < mSlicers.size(); i++)
431 mSlicers[i]->SetColorWindow(s);
435 void vvSlicerManager::SetColorLevel(double s)
437 for ( unsigned int i = 0; i < mSlicers.size(); i++)
439 mSlicers[i]->SetColorLevel(s);
443 void vvSlicerManager::SetCursorVisibility(int s)
445 for ( unsigned int i = 0; i < mSlicers.size(); i++)
447 mSlicers[i]->SetCursorVisibility(s);
451 void vvSlicerManager::SetOpacity(int i, double factor)
453 mSlicers[i]->SetOpacity(1/factor);
456 void vvSlicerManager::UpdateViews(int current,int slicer)
458 double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
459 /mSlicers[slicer]->GetInput()->GetSpacing()[0];
460 double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
461 /mSlicers[slicer]->GetInput()->GetSpacing()[1];
462 double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
463 /mSlicers[slicer]->GetInput()->GetSpacing()[2];
465 if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
466 x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
467 y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
468 y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
469 z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
470 z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5])
472 mSlicers[slicer]->UpdateCursorPosition();
473 mSlicers[slicer]->SetCursorColor(10,212,255);
475 switch (mSlicers[slicer]->GetSliceOrientation())
477 case vtkImageViewer2::SLICE_ORIENTATION_XY:
478 if (mSlicers[slicer]->GetSlice() == (int)floor(z))
479 mSlicers[slicer]->Render();
481 mSlicers[slicer]->SetSlice((int)floor(z));
484 case vtkImageViewer2::SLICE_ORIENTATION_XZ:
485 if (mSlicers[slicer]->GetSlice() == (int)floor(y))
486 mSlicers[slicer]->Render();
488 mSlicers[slicer]->SetSlice((int)floor(y));
491 case vtkImageViewer2::SLICE_ORIENTATION_YZ:
492 if (mSlicers[slicer]->GetSlice() == (int)floor(x))
493 mSlicers[slicer]->Render();
495 mSlicers[slicer]->SetSlice((int)floor(x));
499 for ( unsigned int i = 0; i < mSlicers.size(); i++)
501 if (i != (unsigned int)slicer && mSlicers[i]->GetImageActor()->GetVisibility()
502 && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2
503 && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2)
505 mSlicers[i]->SetCurrentPosition(mSlicers[slicer]->GetCurrentPosition()[0],
506 mSlicers[slicer]->GetCurrentPosition()[1],
507 mSlicers[slicer]->GetCurrentPosition()[2],
508 mSlicers[slicer]->GetTSlice());
509 mSlicers[i]->UpdateCursorPosition();
510 if (current) //do not display corner annotation if image is the one picked
512 mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,
513 -VTK_DOUBLE_MAX, mSlicers[slicer]->GetTSlice());
514 mSlicers[i]->SetCursorColor(255,10,212);
518 mSlicers[i]->SetCursorColor(150,10,282);
520 switch (mSlicers[i]->GetSliceOrientation())
522 case vtkImageViewer2::SLICE_ORIENTATION_XY:
523 if (mSlicers[i]->GetSlice() == (int)floor(z))
524 mSlicers[i]->Render();
526 mSlicers[i]->SetSlice((int)floor(z));
529 case vtkImageViewer2::SLICE_ORIENTATION_XZ:
530 if (mSlicers[i]->GetSlice() == (int)floor(y))
531 mSlicers[i]->Render();
533 mSlicers[i]->SetSlice((int)floor(y));
536 case vtkImageViewer2::SLICE_ORIENTATION_YZ:
537 if (mSlicers[i]->GetSlice() == (int)floor(x))
538 mSlicers[i]->Render();
540 mSlicers[i]->SetSlice((int)floor(x));
550 void vvSlicerManager::UpdateLinked(int slicer)
552 double x = (mSlicers[slicer]->GetCurrentPosition()[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])
553 /mSlicers[slicer]->GetInput()->GetSpacing()[0];
554 double y = (mSlicers[slicer]->GetCurrentPosition()[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])
555 /mSlicers[slicer]->GetInput()->GetSpacing()[1];
556 double z = (mSlicers[slicer]->GetCurrentPosition()[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])
557 /mSlicers[slicer]->GetInput()->GetSpacing()[2];
559 if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
560 x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
561 y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
562 y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
563 z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
564 z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5])
566 for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)
568 emit UpdateLinkManager(*i, slicer,mSlicers[slicer]->GetCurrentPosition()[0],
569 mSlicers[slicer]->GetCurrentPosition()[1],
570 mSlicers[slicer]->GetCurrentPosition()[2],mSlicers[slicer]->GetTSlice());
574 double vvSlicerManager::GetColorWindow()
577 return mSlicers[0]->GetColorWindow();
581 double vvSlicerManager::GetColorLevel()
584 return mSlicers[0]->GetColorLevel();
588 void vvSlicerManager::Render()
590 for ( unsigned int i = 0; i < mSlicers.size(); i++)
592 mSlicers[i]->Render();
596 void vvSlicerManager::GenerateDefaultLookupTable()
599 SetColorMap(mColorMap);
602 void vvSlicerManager::Reload()
604 mReader->Update(mType);
605 mImage=mReader->GetOutput();
606 for ( unsigned int i = 0; i < mSlicers.size(); i++)
608 mSlicers[i]->SetImage(mImage);
612 void vvSlicerManager::ReloadFusion()
614 mFusionReader->Update();
615 for ( unsigned int i = 0; i < mSlicers.size(); i++)
617 mSlicers[i]->SetFusion(mFusionReader->GetOutput());
618 mSlicers[i]->Render();
622 void vvSlicerManager::ReloadOverlay()
624 mOverlayReader->Update();
625 for ( unsigned int i = 0; i < mSlicers.size(); i++)
627 mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());
628 mSlicers[i]->Render();
632 void vvSlicerManager::ReloadVF()
634 mVectorReader->Update(VECTORFIELD); //deletes the old images through the VF::Init() function
635 mVF=mVectorReader->GetOutput();
636 for ( unsigned int i = 0; i < mSlicers.size(); i++)
638 mSlicers[i]->SetVF(mVF);
639 mSlicers[i]->Render();
643 void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)
645 for (unsigned int i = 0; i < mSlicers.size();i++)
647 mSlicers[i]->RemoveActor(actor_type,overlay_index);
649 if (actor_type=="vector")
653 delete mVectorReader;
659 void vvSlicerManager::RemoveActors()
661 ///This method leaks a few objects. See RemoveActor for what a correct implementation would look like
662 for ( unsigned int i = 0; i < mSlicers.size(); i++)
664 mSlicers[i]->SetDisplayMode(0);
665 mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());
669 void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)
671 // int view = mSlicers[slicer]->GetSliceOrientation();
672 // int slice = mSlicers[slicer]->GetSlice();
673 double x = mSlicers[slicer]->GetCursorPosition()[0];
674 double y = mSlicers[slicer]->GetCursorPosition()[1];
675 double z = mSlicers[slicer]->GetCursorPosition()[2];
676 double X = (x - mSlicers[slicer]->GetInput()->GetOrigin()[0])/
677 mSlicers[slicer]->GetInput()->GetSpacing()[0];
678 double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/
679 mSlicers[slicer]->GetInput()->GetSpacing()[1];
680 double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/
681 mSlicers[slicer]->GetInput()->GetSpacing()[2];
682 double value = -VTK_DOUBLE_MAX;
684 double xVec=0, yVec=0, zVec=0, valueVec=0;
687 double valueOver=0, valueFus=0;
688 if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&
689 X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&
690 Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&
691 Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&
692 Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&
693 Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5])
695 value = mSlicers[slicer]->GetInput()->GetScalarComponentAsDouble(
699 if (mSlicers[slicer]->GetVFActor() && mSlicers[slicer]->GetVFActor()->GetVisibility())
702 unsigned int currentTime = mSlicers[slicer]->GetTSlice();
703 vtkImageData *vf = NULL;
705 if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)
706 vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];
708 vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];
712 double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];
713 double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];
714 double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];
715 xVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),0);
716 yVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),1);
717 zVec = vf->GetScalarComponentAsDouble( (int)floor(Xvf), (int)floor(Yvf), (int)floor(Zvf),2);
718 valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);
721 if (mSlicers[slicer]->GetOverlayActor() && mSlicers[slicer]->GetOverlayActor()->GetVisibility())
724 double Xover = (x - mSlicers[slicer]->GetOverlay()->GetOrigin()[0])
725 /mSlicers[slicer]->GetOverlay()->GetSpacing()[0];
726 double Yover = (y - mSlicers[slicer]->GetOverlay()->GetOrigin()[1])
727 /mSlicers[slicer]->GetOverlay()->GetSpacing()[1];
728 double Zover = (z - mSlicers[slicer]->GetOverlay()->GetOrigin()[2])
729 /mSlicers[slicer]->GetOverlay()->GetSpacing()[2];
730 if (Xover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[0] &&
731 Xover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[1] &&
732 Yover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[2] &&
733 Yover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[3] &&
734 Zover >= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[4] &&
735 Zover <= mSlicers[slicer]->GetOverlayMapper()->GetInput()->GetWholeExtent()[5])
737 valueOver = static_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput())->
738 GetScalarComponentAsDouble(
741 (int)floor(Zover),0);
744 if (mSlicers[slicer]->GetFusionActor() && mSlicers[slicer]->GetFusionActor()->GetVisibility())
747 double Xfus = (x - mSlicers[slicer]->GetFusion()->GetOrigin()[0])
748 /mSlicers[slicer]->GetFusion()->GetSpacing()[0];
749 double Yfus = (y - mSlicers[slicer]->GetFusion()->GetOrigin()[1])
750 /mSlicers[slicer]->GetFusion()->GetSpacing()[1];
751 double Zfus = (z - mSlicers[slicer]->GetFusion()->GetOrigin()[2])
752 /mSlicers[slicer]->GetFusion()->GetSpacing()[2];
753 if (Xfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[0] &&
754 Xfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[1] &&
755 Yfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[2] &&
756 Yfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[3] &&
757 Zfus >= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[4] &&
758 Zfus <= mSlicers[slicer]->GetFusionMapper()->GetInput()->GetWholeExtent()[5])
760 valueFus = static_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput())->
761 GetScalarComponentAsDouble(
767 emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),
769 emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);
770 emit UpdateOverlay(displayOver,valueOver,value);
771 emit UpdateFusion(displayFus,valueFus);
772 for (unsigned int i = 0; i < mSlicers.size(); i++)
774 if (mSlicers[i]->GetImageActor()->GetVisibility() == 1)
775 emit UpdateWindows(i,mSlicers[i]->GetSliceOrientation(),mSlicers[i]->GetSlice());
777 emit UpdateWindows(i,-1,-1);
782 void vvSlicerManager::Activated()
784 emit currentImageChanged(mId);
787 void vvSlicerManager::UpdateWindowLevel()
789 emit WindowLevelChanged(mSlicers[0]->GetColorWindow(),mSlicers[0]->GetColorLevel(),mPreset,mColorMap);
792 void vvSlicerManager::UpdateSlice(int slicer)
794 emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());
797 void vvSlicerManager::UpdateTSlice(int slicer)
799 emit UpdateTSlice(slicer,mSlicers[0]->GetTSlice());
802 void vvSlicerManager::UpdateSliceRange(int slicer)
804 emit UpdateSliceRange(slicer,
805 mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],
806 0,mSlicers[slicer]->GetTMax());
809 void vvSlicerManager::SetPreset(int preset)
811 //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
812 double window = mSlicers[0]->GetColorWindow();
813 double level = mSlicers[0]->GetColorLevel();
815 std::string component_type=mImage->GetScalarTypeAsString();
819 if (component_type == "unsigned_char")
824 else if (component_type == "short")
832 mImage->GetScalarRange(range);
833 window = range[1] - range[0];
834 level = (range[1] + range[0])* 0.5;
865 this->SetColorWindow(window);
866 this->SetColorLevel(level);
874 void vvSlicerManager::SetLocalColorWindowing(const int slicer)
877 this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max);
878 this->SetColorWindow(max-min);
879 this->SetColorLevel(0.5*(min+max));
883 void vvSlicerManager::SetColorMap()
885 SetColorMap(mColorMap);
888 void vvSlicerManager::SetColorMap(int colormap)
891 range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];
892 range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];
894 double window = mSlicers[0]->GetWindowLevel()->GetWindow();
895 double level = mSlicers[0]->GetWindowLevel()->GetLevel();
897 vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());
907 LUT = vtkLookupTable::New();
908 LUT->SetValueRange(0,1);
909 LUT->SetSaturationRange(1,1);
910 LUT->SetHueRange(0,0.18);
914 LUT = vtkLookupTable::New();
915 LUT->SetValueRange(0,1);
916 LUT->SetSaturationRange(1,1);
917 LUT->SetHueRange(0.4,0.80);
921 LUT = vtkLookupTable::New();
922 LUT->SetValueRange(0,1);
923 LUT->SetSaturationRange(1,1);
924 LUT->SetHueRange(0,1);
928 LUT = vtkLookupTable::New();
929 LUT->SetValueRange(0.,1);
930 LUT->SetSaturationRange(1,1);
931 LUT->SetHueRange(1,0.1);
932 //LUT->SetRampToLinear();
937 LUT->SetTableRange(level-fabs(window)/4,level+fabs(window)/4);
940 vtkLookupTable* fusLUT = NULL;
941 if (mSlicers[0]->GetFusion())
943 fusLUT = vtkLookupTable::New();
945 fusRange[0] = mFusionLevel - mFusionWindow/2;
946 fusRange[1] = mFusionLevel + mFusionWindow/2;
947 fusLUT->SetTableRange(fusRange[0],fusRange[1]);
948 fusLUT->SetValueRange(1,1);
949 fusLUT->SetSaturationRange(1,1);
950 if (mFusionColorMap == 1)
951 fusLUT->SetHueRange(0,0.18);
952 else if (mFusionColorMap == 2)
953 fusLUT->SetHueRange(0.4,0.80);
954 else if (mFusionColorMap == 3)
955 fusLUT->SetHueRange(0,1);
957 if (mFusionColorMap == 0)
960 for ( unsigned int i = 0; i < mSlicers.size(); i++) {
961 if (mSlicers[i]->GetOverlay() && mSlicers[i]->GetOverlayActor()->GetVisibility()) {
962 vtkLookupTable* supLUT = vtkLookupTable::New();
963 supLUT->SetTableRange(range[0],range[1]);
964 supLUT->SetValueRange(1,1);
965 supLUT->SetSaturationRange(1,1);
966 supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);
968 vtkLookupTable* invLUT = vtkLookupTable::New();
969 invLUT->SetTableRange(range[0],range[1]);
970 invLUT->SetValueRange(1,1);
971 invLUT->SetSaturationRange(1,1);
972 invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);
974 dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
975 ->SetWindowLevelMode(true);
976 mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);
977 mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);
981 else if (mSlicers[i]->GetOverlay())
983 //dynamic_cast<vvImageMapToWLColors*>(mSlicers[i]->GetWindowLevel())
984 //->SetWindowLevelMode(false);
985 mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
989 mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);
991 if (mSlicers[i]->GetFusion() && mSlicers[i]->GetFusionActor()->GetVisibility())
993 mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);
994 mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);
1000 mColorMap = colormap;
1003 vvLandmarks* vvSlicerManager::GetLandmarks()
1005 if (mLandmarks == NULL)
1007 mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);
1008 for (unsigned int i = 0; i < mSlicers.size(); i++)
1009 mSlicers[i]->SetLandmarks(mLandmarks);
1014 void vvSlicerManager::AddLandmark(float x,float y,float z,float t)
1016 double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];
1017 double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];
1018 double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];
1019 double value = mSlicers[0]->GetInput()->GetScalarComponentAsDouble(
1023 this->GetLandmarks()->AddLandmark(x,y,z,t,value);
1024 emit LandmarkAdded();