]> Creatis software - clitk.git/blob - vv/vvSlicerManager.cxx
Copy pasted code from overlay to fusion for sequences. This yet another
[clitk.git] / vv / vvSlicerManager.cxx
1 /*=========================================================================\r
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv\r
3 \r
4   Authors belong to:\r
5   - University of LYON              http://www.universite-lyon.fr/\r
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr\r
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr\r
8 \r
9   This software is distributed WITHOUT ANY WARRANTY; without even\r
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR\r
11   PURPOSE.  See the copyright notices for more information.\r
12 \r
13   It is distributed under dual licence\r
14 \r
15   - BSD        See included LICENSE.txt file\r
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html\r
17   ======================================================================-====*/\r
18 \r
19 #include "vvSlicerManager.h"\r
20 #include "vvSlicer.h"\r
21 #include "vvImage.h"\r
22 #include "vvSlicerManagerCommand.h"\r
23 #include "vvInteractorStyleNavigator.h"\r
24 #include "vvLandmarks.h"\r
25 #include "vvMesh.h"\r
26 #include "vvBlendImageActor.h"\r
27 \r
28 #include <vtkImageActor.h>\r
29 #include <vtkImageData.h>\r
30 #include <vtkRenderWindow.h>\r
31 #include <vtkRendererCollection.h>\r
32 #include <vtkRenderWindowInteractor.h>\r
33 #include <vtkImageMapToWindowLevelColors.h>\r
34 #include <vtkWindowLevelLookupTable.h>\r
35 #include <vtkColorTransferFunction.h>\r
36 #include <vtkImageClip.h>\r
37 #include <vtkLODActor.h>\r
38 #include <vtkPointData.h>\r
39 #include <vtksys/SystemTools.hxx>\r
40 #include <vtkCamera.h>\r
41 \r
42 #include <qfileinfo.h>\r
43 #include <QMessageBox>\r
44 //----------------------------------------------------------------------------\r
45 vvSlicerManager::vvSlicerManager(int numberOfSlicers)\r
46 {\r
47   mFileName = "";\r
48   mId = "";\r
49   mVFName = "";\r
50   mOverlayName = "";\r
51   mFusionName = "";\r
52   mVFId = "";\r
53   mLastError = "";\r
54   mType = vvImageReader::UNDEFINEDIMAGETYPE;\r
55   mColorMap = 0;\r
56   mPreset = 0;\r
57   mOverlayColor = 130;\r
58 \r
59   mFusionOpacity = 30;\r
60   mFusionThresOpacity = 1;\r
61   mFusionColorMap = 3;\r
62   mFusionWindow = 1000;\r
63   mFusionLevel = 1000;\r
64   mFusionShowLegend = true;\r
65   \r
66   mFusionSequenceInvolvementCode = -1;\r
67   mFusionSequenceIndexLinkedManager = -1;\r
68   mFusionSequenceFrameIndex = -1;\r
69   mFusionSequenceNbFrames = 0;\r
70   mFusionSequenceSpatialSyncFlag = false;\r
71   mFusionSequenceTemporalSyncFlag = false;\r
72 \r
73   mLandmarks = NULL;\r
74   mLinkedId.resize(0);\r
75 \r
76   for ( int i = 0; i < numberOfSlicers; i++)\r
77     mSlicers.push_back(vtkSmartPointer<vvSlicer>::New());\r
78   mSelectedSlicer = -1;\r
79   \r
80   mPreviousSlice.resize(numberOfSlicers, 0);\r
81   mPreviousTSlice.resize(numberOfSlicers, 0);\r
82   mSlicingPreset = WORLD_SLICING;\r
83 \r
84   \r
85 }\r
86 //----------------------------------------------------------------------------\r
87 \r
88 \r
89 //----------------------------------------------------------------------------\r
90 vvSlicerManager::~vvSlicerManager()\r
91 {\r
92   if (mLandmarks)\r
93     delete mLandmarks;\r
94 }\r
95 //----------------------------------------------------------------------------\r
96 \r
97 \r
98 //------------------------------------------------------------------------------\r
99 void vvSlicerManager::SetFilename(std::string filename, int number)\r
100 {\r
101   mFileName = filename;\r
102   mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
103   mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
104   mBaseFileNameNumber = number;\r
105 \r
106   mFileName = mBaseFileName;\r
107   if (number != 0) {\r
108     mFileName.append("_"+clitk::toString(number));\r
109   }\r
110   mFileName.append(vtksys::SystemTools::GetFilenameLastExtension(filename));\r
111 \r
112   for(unsigned int i=0; i<mSlicers.size(); i++) {\r
113     mSlicers[i]->SetFileName(mFileName);//vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));\r
114   }\r
115   \r
116 }\r
117 //------------------------------------------------------------------------------\r
118 \r
119 \r
120 //----------------------------------------------------------------------------\r
121 void vvSlicerManager::AddContour(vvMesh::Pointer contour,bool propagate)\r
122 {\r
123   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
124     mSlicers[i]->AddContour(contour,propagate);\r
125   }\r
126 }\r
127 //----------------------------------------------------------------------------\r
128 \r
129 \r
130 //----------------------------------------------------------------------------\r
131 void vvSlicerManager::ToggleContourSuperposition()\r
132 {\r
133   for ( unsigned int i = 0; i < mSlicers.size(); i++)\r
134     mSlicers[i]->ToggleContourSuperposition();\r
135 }\r
136 //----------------------------------------------------------------------------\r
137 \r
138 //----------------------------------------------------------------------------\r
139 std::string vvSlicerManager::GetListOfAbsoluteFilePathInOneString(const std::string &actorType)\r
140 {\r
141   vvImageReader *reader = NULL;\r
142 \r
143   if(actorType=="image")\r
144     reader = mReader;\r
145   else if(actorType=="overlay")\r
146     reader = mOverlayReader;\r
147   else if(actorType=="fusion")\r
148     reader = mFusionReader;\r
149   else if(actorType=="vector")\r
150     reader = mVectorReader;\r
151   else if(actorType=="fusionSequence")\r
152         reader = mFusionSequenceReader;\r
153 \r
154   if(!reader)\r
155     return "";\r
156 \r
157   std::string list;\r
158   for(unsigned int i=0; i<reader->GetInputFilenames().size(); i++){\r
159     QFileInfo fileinfo(reader->GetInputFilenames()[i].c_str()); //Do not show the path\r
160     if(i)\r
161       list += '\n';\r
162     list += fileinfo.absoluteFilePath().toStdString();\r
163   }\r
164   return list;\r
165 }\r
166 //----------------------------------------------------------------------------\r
167 \r
168 \r
169 //----------------------------------------------------------------------------\r
170 bool vvSlicerManager::SetImage(std::string filename, vvImageReader::LoadedImageType type, int n, unsigned int slice)\r
171 {\r
172   mType = type;\r
173   if (mReader.IsNull())\r
174     mReader = vvImageReader::New();\r
175   std::vector<std::string> filenames;\r
176   filenames.push_back(filename);\r
177   mReader->SetInputFilenames(filenames);\r
178   mReader->SetSlice(slice); // Only used for SLICED type\r
179   mReader->Update(type);\r
180 \r
181   SetFilename(filename, n);\r
182   //  mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
183   //mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
184   //mBaseFileNameNumber = n;\r
185 \r
186   if (mReader->GetLastError().size() == 0) {\r
187     mImage=mReader->GetOutput();\r
188     for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
189       mSlicers[i]->SetFileName(vtksys::SystemTools::GetFilenameWithoutLastExtension(filename));\r
190       mSlicers[i]->SetImage(mReader->GetOutput());\r
191     }\r
192   } else {\r
193     mLastError = mReader->GetLastError();\r
194     return false;\r
195   }\r
196   // if (n!=0) {\r
197   //   mFileName.append("_"+clitk::toString(n));\r
198   // }\r
199   return true;\r
200 }\r
201 //----------------------------------------------------------------------------\r
202 \r
203 \r
204 //----------------------------------------------------------------------------\r
205 void vvSlicerManager::SetImage(vvImage::Pointer image)\r
206 {\r
207   mImage=image;\r
208   for (unsigned int i = 0; i < mSlicers.size(); i++) {\r
209     mSlicers[i]->SetImage(image);\r
210   }\r
211 }\r
212 //----------------------------------------------------------------------------\r
213 \r
214 \r
215 //----------------------------------------------------------------------------\r
216 bool vvSlicerManager::SetImages(std::vector<std::string> filenames, vvImageReader::LoadedImageType type, int n)\r
217 {\r
218   mType = type;\r
219   std::string fileWithoutExtension = vtksys::SystemTools::GetFilenameWithoutExtension(filenames[0]);\r
220   if (type == vvImageReader::DICOM)\r
221     fileWithoutExtension += "_dicom";\r
222   else if (type == vvImageReader::MERGED)\r
223     fileWithoutExtension += "_merged";\r
224   else if (type == vvImageReader::MERGEDWITHTIME)\r
225     fileWithoutExtension += "_merged_wt";\r
226 \r
227   mFileName = vtksys::SystemTools::GetFilenameName(mFileName);\r
228   mFileName = fileWithoutExtension + vtksys::SystemTools::GetFilenameExtension(filenames[0]);\r
229   if (mReader.IsNull())\r
230     mReader = vvImageReader::New();\r
231   mReader->SetInputFilenames(filenames);\r
232   mReader->Update(type);\r
233 \r
234   mBaseFileName = vtksys::SystemTools::GetFilenameName(vtksys::SystemTools::GetFilenameWithoutLastExtension(mFileName));\r
235   mBaseFileNameNumber = n;\r
236 \r
237   if (mReader->GetLastError().size() == 0) {\r
238     mImage=mReader->GetOutput();\r
239     for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
240       mSlicers[i]->SetFileName(fileWithoutExtension);\r
241       mSlicers[i]->SetImage(mReader->GetOutput());\r
242     }\r
243   } else {\r
244     mLastError = mReader->GetLastError();\r
245     return false;\r
246   }\r
247   if (n!=0) {\r
248     mFileName.append("_"+clitk::toString(n));\r
249   }\r
250   return true;\r
251 }\r
252 //----------------------------------------------------------------------------\r
253 \r
254 \r
255 //----------------------------------------------------------------------------\r
256 bool vvSlicerManager::SetOverlay(std::vector<std::string> filenames,int dim, std::string component, vvImageReader::LoadedImageType type)\r
257 {\r
258   mOverlayName = filenames[0];\r
259   mOverlayComponent = component;\r
260   if (dim > mImage->GetNumberOfDimensions()) {\r
261     mLastError = " Overlay dimension cannot be greater than reference image!";\r
262     return false;\r
263   }\r
264   if (mOverlayReader.IsNull())\r
265     mOverlayReader = vvImageReader::New();\r
266   mOverlayReader->SetInputFilenames(filenames);\r
267   mOverlayReader->Update(type);\r
268   if (mOverlayReader->GetLastError().size() == 0) {\r
269     for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
270       mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());\r
271     }\r
272   } else {\r
273     mLastError = mOverlayReader->GetLastError();\r
274     return false;\r
275   }\r
276   return true;\r
277 }\r
278 //----------------------------------------------------------------------------\r
279 \r
280 \r
281 //----------------------------------------------------------------------------\r
282 bool vvSlicerManager::SetFusion(std::vector<std::string> filenames,int dim, std::string component, vvImageReader::LoadedImageType type)\r
283 {\r
284   mFusionName = filenames[0];\r
285   mFusionComponent = component;\r
286   if (dim > mImage->GetNumberOfDimensions()) {\r
287     mLastError = " Fusion dimension cannot be greater than reference image!";\r
288     return false;\r
289   }\r
290   if (mFusionReader.IsNull())\r
291     mFusionReader = vvImageReader::New();\r
292   mFusionReader->SetInputFilenames(filenames);\r
293   mFusionReader->Update(type);\r
294   if (mFusionReader->GetLastError().size() == 0) {\r
295     for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
296       mSlicers[i]->SetFusion(mFusionReader->GetOutput());\r
297     }\r
298   } else {\r
299     mLastError = mFusionReader->GetLastError();\r
300     return false;\r
301   }\r
302   double *fusRange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
303   mFusionLevel = (fusRange[0]+fusRange[1])/2;\r
304   mFusionWindow = fusRange[1]-fusRange[0];\r
305 \r
306   return true;\r
307 }\r
308 //----------------------------------------------------------------------------\r
309 \r
310 //----------------------------------------------------------------------------\r
311 //this function is called by vvMainWindow::AddFusionSequence for the primary sequence (CT), while the given files constitute the secondary sequence.\r
312 bool vvSlicerManager::SetFusionSequence(std::vector<std::string> filenames, int dim, std::string component, vvImageReader::LoadedImageType type)\r
313 {\r
314         mFusionSequenceInvolvementCode = 0;\r
315 \r
316         mFusionName = filenames[0];\r
317         mFusionComponent = component;\r
318 \r
319         if (dim > mImage->GetNumberOfDimensions()) {\r
320                 mLastError = " Fusion Sequence dimension cannot be greater than reference image!";\r
321                 return false;\r
322         }\r
323 \r
324         if (mFusionSequenceReader.IsNull())\r
325                 mFusionSequenceReader = vvImageReader::New();\r
326 \r
327         mFusionSequenceReader->SetInputFilenames(filenames);\r
328         mFusionSequenceReader->Update(type);\r
329 \r
330 \r
331         if (mFusionSequenceReader->GetLastError().size() == 0) {\r
332                 for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
333                         mSlicers[i]->SetFusion(mFusionSequenceReader->GetOutput(), mFusionSequenceInvolvementCode);\r
334                 }\r
335         } else {\r
336                 mLastError = mFusionSequenceReader->GetLastError();\r
337                 return false;\r
338         }\r
339         double *fusRange = mFusionSequenceReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
340         mFusionLevel = (fusRange[0]+fusRange[1])/2;\r
341         mFusionWindow = fusRange[1]-fusRange[0];\r
342 \r
343         //store the initial transform matrices of each frame, and reset them to identity\r
344         mFusionSequenceListInitialTransformMatrices.clear();\r
345         for (unsigned i=0 ; i<mFusionSequenceReader->GetOutput()->GetTransform().size() ; i++) {\r
346                 AddFusionSequenceInitialTransformMatrices( mFusionSequenceReader->GetOutput()->GetTransform()[i]->GetMatrix() );\r
347                 mFusionSequenceReader->GetOutput()->GetTransform()[i]->Identity();\r
348                 mFusionSequenceReader->GetOutput()->GetTransform()[i]->Update();\r
349         }\r
350 \r
351         //adjust the time slider in the overlay panel\r
352         mFusionSequenceNbFrames = mFusionSequenceReader->GetOutput()->GetTransform().size(); \r
353         mFusionSequenceFrameIndex = std::max<int>( 0, std::min<int>(mFusionSequenceFrameIndex, mFusionSequenceNbFrames));\r
354 \r
355         return true;\r
356 }\r
357 //----------------------------------------------------------------------------\r
358 \r
359 \r
360 //----------------------------------------------------------------------------\r
361 bool vvSlicerManager::SetVF(std::string filename)\r
362 {\r
363   if (mVectorReader.IsNull())\r
364     mVectorReader = vvImageReader::New();\r
365   mVectorReader->SetInputFilename(filename);\r
366   \r
367   if (mType == vvImageReader::IMAGEWITHTIME)\r
368     mVectorReader->Update(vvImageReader::VECTORFIELDWITHTIME);\r
369   else\r
370     mVectorReader->Update(vvImageReader::VECTORFIELD);\r
371   if (mVectorReader->GetLastError().size() != 0) {\r
372     mLastError = mVectorReader->GetLastError();\r
373     return false;\r
374   } else\r
375     return SetVF(mVectorReader->GetOutput(),filename);\r
376 }\r
377 //----------------------------------------------------------------------------\r
378 \r
379 \r
380 //----------------------------------------------------------------------------\r
381 bool vvSlicerManager::SetVF(vvImage::Pointer vf,std::string filename)\r
382 {\r
383   if (vf->GetNumberOfDimensions() > mImage->GetNumberOfDimensions()) {\r
384     mLastError = "Sorry, vector field dimension cannot be greater then reference image.";\r
385     return false;\r
386   }\r
387   if (vf->GetNumberOfDimensions() == 4) {\r
388     if (vf->GetSpacing()[3] != mImage->GetSpacing()[3]) {\r
389       mLastError = "Sorry, vector field time spacing cannot be different from time spacing of the reference image.";\r
390       return false;\r
391     }\r
392     if (vf->GetOrigin()[3] != mImage->GetOrigin()[3]) {\r
393       mLastError = "Sorry, vector field time origin cannot be different from time origin of the reference image.";\r
394       return false;\r
395     }\r
396   }\r
397   mVF=vf;\r
398   mVFName = filename;\r
399   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
400     mSlicers[i]->SetVF(vf);\r
401   }\r
402   return true;\r
403 }\r
404 //----------------------------------------------------------------------------\r
405 \r
406 \r
407 //----------------------------------------------------------------------------\r
408 vvSlicer* vvSlicerManager::GetSlicer(int i)\r
409 {\r
410   return mSlicers[i];\r
411 }\r
412 //----------------------------------------------------------------------------\r
413 \r
414 \r
415 //----------------------------------------------------------------------------\r
416 void vvSlicerManager::UpdateSlicer(int num, bool state)\r
417 {\r
418   if (mSlicers[num]->GetImage()) {\r
419     mSlicers[num]->SetDisplayMode(state);\r
420   }\r
421 }\r
422 //----------------------------------------------------------------------------\r
423 \r
424 \r
425 //----------------------------------------------------------------------------\r
426 void vvSlicerManager::SetSlicerWindow(int i, vtkRenderWindow* RW)\r
427 {\r
428   mSlicers[i]->SetRenderWindow(i,RW);\r
429 }\r
430 //----------------------------------------------------------------------------\r
431 \r
432 \r
433 //----------------------------------------------------------------------------\r
434 void vvSlicerManager::SetInteractorStyleNavigator(int i, vtkInteractorStyle* style)\r
435 {\r
436   vvSlicerManagerCommand *smc = vvSlicerManagerCommand::New();\r
437   smc->SM = this;\r
438   smc->SetSlicerNumber(i);\r
439   mSlicers[i]->GetRenderWindow()->GetInteractor()->SetInteractorStyle(style);\r
440 \r
441   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
442     GetInteractorStyle()->AddObserver(vtkCommand::KeyPressEvent, smc);\r
443   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
444     GetInteractorStyle()->AddObserver(vtkCommand::WindowLevelEvent, smc);\r
445   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
446     GetInteractorStyle()->AddObserver(vtkCommand::EndWindowLevelEvent, smc);\r
447   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
448     GetInteractorStyle()->AddObserver(vtkCommand::StartWindowLevelEvent, smc);\r
449   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
450     GetInteractorStyle()->AddObserver(vtkCommand::PickEvent, smc);\r
451   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
452     GetInteractorStyle()->AddObserver(vtkCommand::StartPickEvent, smc);\r
453   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
454     GetInteractorStyle()->AddObserver(vtkCommand::LeaveEvent, smc);\r
455   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
456     GetInteractorStyle()->AddObserver(vtkCommand::UserEvent, smc);\r
457   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
458     GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelForwardEvent, smc);\r
459   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
460     GetInteractorStyle()->AddObserver(vtkCommand::MouseWheelBackwardEvent, smc);\r
461   // mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
462   //   GetInteractorStyle()->AddObserver(vtkCommand::LeftButtonReleaseEvent, smc);\r
463   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
464     GetInteractorStyle()->AddObserver(vtkCommand::EndPickEvent, smc);\r
465   mSlicers[i]->GetRenderWindow()->GetInteractor()->\r
466     GetInteractorStyle()->AddObserver(vtkCommand::EndInteractionEvent, smc);\r
467   smc->Delete();\r
468 }\r
469 //----------------------------------------------------------------------------\r
470 \r
471 \r
472 //----------------------------------------------------------------------------\r
473 void vvSlicerManager::LeftButtonReleaseEvent(int slicer)\r
474 {\r
475   emit LeftButtonReleaseSignal(slicer);\r
476 }\r
477 //----------------------------------------------------------------------------\r
478 \r
479 \r
480 //----------------------------------------------------------------------------\r
481 void vvSlicerManager::EmitMousePositionUpdated(int slicer)\r
482 {\r
483   emit MousePositionUpdatedSignal(slicer);\r
484 }\r
485 //----------------------------------------------------------------------------\r
486 \r
487 \r
488 //----------------------------------------------------------------------------\r
489 void vvSlicerManager::EmitKeyPressed(std::string KeyPress)\r
490 {\r
491   emit KeyPressedSignal(KeyPress);\r
492 }\r
493 //----------------------------------------------------------------------------\r
494 \r
495 \r
496 //----------------------------------------------------------------------------\r
497 void vvSlicerManager::SetSliceOrientation(int slicer, int orientation)\r
498 {\r
499   mSlicers[slicer]->SetSliceOrientation(orientation);\r
500   emit UpdateOrientation(slicer, orientation);\r
501 }\r
502 //----------------------------------------------------------------------------\r
503 \r
504 //----------------------------------------------------------------------------\r
505 int vvSlicerManager::GetTSlice()\r
506 {\r
507   return mSlicers[0]->GetTSlice();\r
508 }\r
509 //----------------------------------------------------------------------------\r
510 \r
511 //----------------------------------------------------------------------------\r
512 void vvSlicerManager::SetTSlice(int slice, bool updateLinkedImages)\r
513 {\r
514         if (!updateLinkedImages) { //for fusionSequence, TMax / MaxCurrentTSlice are irrelevant.\r
515                 for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
516                         mSlicers[i]->SetTSlice(slice, updateLinkedImages);\r
517                         UpdateTSlice(i);\r
518                 }\r
519                 return;\r
520         }\r
521 \r
522   if (slice < 0)\r
523     slice = 0;\r
524   else if (slice > mSlicers[0]->GetTMax())\r
525     slice = mSlicers[0]->GetTMax();\r
526   if (mLandmarks)\r
527     mLandmarks->SetTime(slice);\r
528   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
529     if (slice != mSlicers[i]->GetMaxCurrentTSlice()) {\r
530       mSlicers[i]->SetTSlice(slice, updateLinkedImages);\r
531       UpdateTSlice(i);\r
532     }\r
533   }\r
534 }\r
535 //----------------------------------------------------------------------------\r
536 \r
537 \r
538 //----------------------------------------------------------------------------\r
539 void vvSlicerManager::SetFusionSequenceTSlice(int slice)\r
540 {\r
541         for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
542                 mSlicers[i]->SetFusionSequenceTSlice(slice);\r
543                 UpdateTSlice(i);\r
544         }\r
545 }\r
546 //----------------------------------------------------------------------------\r
547 \r
548 \r
549 //----------------------------------------------------------------------------\r
550 void vvSlicerManager::SetNextTSlice(int originating_slicer)\r
551 {\r
552   int t = mSlicers[0]->GetMaxCurrentTSlice();\r
553   t++;\r
554   if (t > mSlicers[0]->GetTMax())\r
555     t = 0;\r
556   //std::cout << "vvSlicerManager::SetNextTSlice" << std::endl;\r
557   emit UpdateTSlice(originating_slicer,t, mFusionSequenceInvolvementCode);\r
558 }\r
559 //----------------------------------------------------------------------------\r
560 \r
561 \r
562 //----------------------------------------------------------------------------\r
563 void vvSlicerManager::SetPreviousTSlice(int originating_slicer)\r
564 {\r
565   int t = mSlicers[0]->GetMaxCurrentTSlice();\r
566   t--;\r
567   if (t < 0)\r
568     t = mSlicers[0]->GetTMax();\r
569   //std::cout << "vvSlicerManager::SetPreviousTSlice" << std::endl;\r
570   emit UpdateTSlice(originating_slicer,t, mFusionSequenceInvolvementCode);\r
571 }\r
572 //----------------------------------------------------------------------------\r
573 \r
574 \r
575 //----------------------------------------------------------------------------\r
576 void vvSlicerManager::ToggleInterpolation()\r
577 {\r
578   bool interpolate=!(mSlicers[0]->GetImageActor()->GetInterpolate());\r
579   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
580     mSlicers[i]->GetImageActor()->SetInterpolate(interpolate);\r
581     if (mSlicers[i]->GetOverlayActor())\r
582       mSlicers[i]->GetOverlayActor()->SetInterpolate(interpolate);\r
583     if (mSlicers[i]->GetFusionActor())\r
584       mSlicers[i]->GetFusionActor()->SetInterpolate(interpolate);\r
585   }\r
586 }\r
587 //----------------------------------------------------------------------------\r
588 \r
589 \r
590 //----------------------------------------------------------------------------\r
591 void vvSlicerManager::SetTSliceInSlicer(int tslice, int slicer)\r
592 {\r
593   if (tslice < 0)\r
594     tslice = 0;\r
595   else if (tslice > mSlicers[slicer]->GetTMax())\r
596     tslice = mSlicers[slicer]->GetTMax();\r
597   if (mLandmarks)\r
598     mLandmarks->SetTime(tslice);\r
599 \r
600   if (mSlicers[slicer]->GetMaxCurrentTSlice() == tslice) return;\r
601 \r
602   mSlicers[slicer]->SetTSlice(tslice);\r
603 \r
604   if(mSlicingPreset==VOXELS_SLICING) {\r
605     vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();\r
606     mImage->GetTransform()[mSlicers[slicer]->GetTSlice()]->GetInverse(imageTransformInverse);\r
607     this->GetSlicer(slicer)->GetSlicingTransform()->SetMatrix(imageTransformInverse);\r
608     imageTransformInverse->Delete();\r
609   }\r
610 \r
611   UpdateTSlice(slicer);\r
612 }\r
613 //----------------------------------------------------------------------------\r
614 \r
615 \r
616 //----------------------------------------------------------------------------\r
617 void vvSlicerManager::SetColorWindow(double s)\r
618 {\r
619   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
620     mSlicers[i]->SetColorWindow(s);\r
621   }\r
622 }\r
623 //----------------------------------------------------------------------------\r
624 \r
625 //----------------------------------------------------------------------------\r
626 void vvSlicerManager::SetColorLevel(double s)\r
627 {\r
628   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
629     mSlicers[i]->SetColorLevel(s);\r
630   }\r
631 }\r
632 //----------------------------------------------------------------------------\r
633 \r
634 //----------------------------------------------------------------------------\r
635 void vvSlicerManager::SetOverlayColorWindow(double s)\r
636 {\r
637   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
638     mSlicers[i]->SetOverlayColorWindow(s);\r
639   }\r
640 }\r
641 //----------------------------------------------------------------------------\r
642 \r
643 //----------------------------------------------------------------------------\r
644 void vvSlicerManager::SetOverlayColorLevel(double s)\r
645 {\r
646   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
647     mSlicers[i]->SetOverlayColorLevel(s);\r
648   }\r
649 }\r
650 //----------------------------------------------------------------------------\r
651 \r
652 //----------------------------------------------------------------------------\r
653 void vvSlicerManager::SetLinkOverlayWindowLevel(bool b)\r
654 {\r
655   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
656     mSlicers[i]->SetLinkOverlayWindowLevel(b);\r
657   }\r
658 }\r
659 //----------------------------------------------------------------------------\r
660 \r
661 //----------------------------------------------------------------------------\r
662 void vvSlicerManager::SetCursorAndCornerAnnotationVisibility(int s)\r
663 {\r
664   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
665     mSlicers[i]->SetCursorVisibility(s);\r
666     mSlicers[i]->SetCornerAnnotationVisibility(s);\r
667   }\r
668 }\r
669 //----------------------------------------------------------------------------\r
670 \r
671 //----------------------------------------------------------------------------\r
672 void vvSlicerManager::SetOpacity(int i, double factor)\r
673 {\r
674   mSlicers[i]->SetOpacity(1/factor);\r
675 }\r
676 //----------------------------------------------------------------------------\r
677 \r
678 \r
679 //----------------------------------------------------------------------------\r
680 void vvSlicerManager::UpdateViews(int current,int slicer)\r
681 {\r
682   double p[3], pt[3];\r
683   p[0] = mSlicers[slicer]->GetCurrentPosition()[0];\r
684   p[1] = mSlicers[slicer]->GetCurrentPosition()[1];\r
685   p[2] = mSlicers[slicer]->GetCurrentPosition()[2];\r
686   mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);\r
687 \r
688   double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0])\r
689     /mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
690   double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1])\r
691     /mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
692   double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2])\r
693     /mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
694 \r
695   if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
696       x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
697       y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
698       y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
699       z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
700       z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {\r
701     mSlicers[slicer]->UpdateCursorPosition();\r
702     mSlicers[slicer]->SetCursorColor(10,212,255);\r
703     mSelectedSlicer = slicer;\r
704 \r
705     switch (mSlicers[slicer]->GetSliceOrientation()) {\r
706     case vtkImageViewer2::SLICE_ORIENTATION_XY:\r
707       if (mSlicers[slicer]->GetSlice() != (int)lrint(z))\r
708         mSlicers[slicer]->SetSlice((int)lrint(z));\r
709       break;\r
710 \r
711     case vtkImageViewer2::SLICE_ORIENTATION_XZ:\r
712       if (mSlicers[slicer]->GetSlice() != (int)lrint(y))\r
713         mSlicers[slicer]->SetSlice((int)lrint(y));\r
714       break;\r
715 \r
716     case vtkImageViewer2::SLICE_ORIENTATION_YZ:\r
717       if (mSlicers[slicer]->GetSlice() != (int)lrint(x))\r
718         mSlicers[slicer]->SetSlice((int)lrint(x));\r
719       break;\r
720     }\r
721     mSlicers[slicer]->Render();\r
722 \r
723     for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
724       if (i != (unsigned int)slicer\r
725           && mSlicers[i]->GetRenderer()->GetDraw()\r
726           && mSlicers[i]->GetRenderWindow()->GetSize()[0] > 2\r
727           && mSlicers[i]->GetRenderWindow()->GetSize()[1] > 2) {\r
728         mSlicers[i]->SetCurrentPosition(p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());\r
729         mSlicers[i]->UpdateCursorPosition();\r
730         if (current) { //do not display corner annotation if image is the one picked\r
731           mSlicers[i]->SetCurrentPosition(-VTK_DOUBLE_MAX,-VTK_DOUBLE_MAX,\r
732                                           -VTK_DOUBLE_MAX, mSlicers[slicer]->GetMaxCurrentTSlice());\r
733           mSlicers[i]->SetCursorColor(255,10,212);\r
734         } else {\r
735           mSlicers[i]->SetCursorColor(150,10,282);\r
736         }\r
737         switch (mSlicers[i]->GetSliceOrientation()) {\r
738         case vtkImageViewer2::SLICE_ORIENTATION_XY:\r
739           if (mSlicers[i]->GetSlice() != (int)lrint(z))\r
740             mSlicers[i]->SetSlice((int)lrint(z));\r
741           break;\r
742 \r
743         case vtkImageViewer2::SLICE_ORIENTATION_XZ:\r
744           if (mSlicers[i]->GetSlice() != (int)lrint(y))\r
745             mSlicers[i]->SetSlice((int)lrint(y));\r
746           break;\r
747 \r
748         case vtkImageViewer2::SLICE_ORIENTATION_YZ:\r
749           if (mSlicers[i]->GetSlice() != (int)lrint(x))\r
750             mSlicers[i]->SetSlice((int)lrint(x));\r
751           break;\r
752         }\r
753         \r
754         mSlicers[i]->Render();\r
755         \r
756         UpdateSlice(i);\r
757         UpdateTSlice(i);\r
758       }\r
759     }\r
760   }\r
761 }\r
762 //----------------------------------------------------------------------------\r
763 \r
764 \r
765 //----------------------------------------------------------------------------\r
766 void vvSlicerManager::UpdateLinked(int slicer)\r
767 {\r
768   double p[3], pt[3];\r
769   p[0] = mSlicers[slicer]->GetCurrentPosition()[0];\r
770   p[1] = mSlicers[slicer]->GetCurrentPosition()[1];\r
771   p[2] = mSlicers[slicer]->GetCurrentPosition()[2];\r
772   mSlicers[slicer]->GetSlicingTransform()->GetInverse()->TransformPoint(p, pt);\r
773   double x = (pt[0] - mSlicers[slicer]->GetInput()->GetOrigin()[0]) / mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
774   double y = (pt[1] - mSlicers[slicer]->GetInput()->GetOrigin()[1]) / mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
775   double z = (pt[2] - mSlicers[slicer]->GetInput()->GetOrigin()[2]) / mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
776 \r
777   if (x >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
778       x <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
779       y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
780       y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
781       z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
782       z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]+0.5) {\r
783     for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++) {\r
784                 if (this->IsInvolvedInFusionSequence()) {\r
785                         //this SlicerManager is involved in fusionSequence => do not synchronize the times\r
786                         emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], -1);\r
787                 }\r
788                 else {\r
789                         emit UpdateLinkManager(*i, slicer, p[0], p[1], p[2], mSlicers[slicer]->GetMaxCurrentTSlice());\r
790                 }\r
791     }\r
792   }\r
793 }\r
794 //----------------------------------------------------------------------------\r
795 \r
796 //----------------------------------------------------------------------------\r
797 void vvSlicerManager::UpdateLinkedNavigation(vvSlicer *refSlicer, bool bPropagate)\r
798 {\r
799   vtkCamera *refCam = refSlicer->GetRenderer()->GetActiveCamera();\r
800 \r
801   double refPosition[3];\r
802   refCam->GetPosition(refPosition);\r
803   refPosition[refSlicer->GetSliceOrientation()] = refSlicer->GetSlice() *\r
804       refSlicer->GetInput()->GetSpacing()[refSlicer->GetSliceOrientation()] +\r
805       refSlicer->GetInput()->GetOrigin()[refSlicer->GetSliceOrientation()];\r
806 \r
807   refSlicer->GetSlicingTransform()->TransformPoint(refPosition, refPosition);\r
808   mSlicers[0]->GetSlicingTransform()->GetInverse()->TransformPoint(refPosition, refPosition);\r
809 \r
810   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
811     vtkCamera *camera = mSlicers[i]->GetRenderer()->GetActiveCamera();\r
812     camera->SetParallelScale(refCam->GetParallelScale());\r
813 \r
814     double position[3], focal[3];\r
815     camera->GetPosition(position);\r
816     camera->GetFocalPoint(focal);\r
817 \r
818     for(int j=0; j<3; j++) {\r
819       if(j!=mSlicers[i]->GetSliceOrientation()) {\r
820         position[j] = refPosition[j];\r
821         focal[j]    = refPosition[j];\r
822       }\r
823     }\r
824 \r
825     camera->SetFocalPoint(focal);\r
826     camera->SetPosition(position);\r
827 \r
828     //Fix for bug #243\r
829     mSlicers[i]->ForceUpdateDisplayExtent();\r
830   }\r
831   \r
832   Render();\r
833   if(bPropagate)\r
834     for (std::list<std::string>::const_iterator i = mLinkedId.begin(); i != mLinkedId.end(); i++)\r
835       emit UpdateLinkedNavigation(*i, this, refSlicer);\r
836 }\r
837 //----------------------------------------------------------------------------\r
838 \r
839 //----------------------------------------------------------------------------\r
840 double vvSlicerManager::GetColorWindow() const\r
841 {\r
842   if (mSlicers.size())\r
843     return mSlicers[0]->GetColorWindow();\r
844   return -1;\r
845 }\r
846 //----------------------------------------------------------------------------\r
847 \r
848 \r
849 //----------------------------------------------------------------------------\r
850 double vvSlicerManager::GetColorLevel() const\r
851 {\r
852   if (mSlicers.size())\r
853     return mSlicers[0]->GetColorLevel();\r
854   return -1;\r
855 }\r
856 //----------------------------------------------------------------------------\r
857 \r
858 //----------------------------------------------------------------------------\r
859 double vvSlicerManager::GetOverlayColorWindow() const\r
860 {\r
861   if (mSlicers.size())\r
862     return mSlicers[0]->GetOverlayColorWindow();\r
863   return -1;\r
864 }\r
865 //----------------------------------------------------------------------------\r
866 \r
867 //----------------------------------------------------------------------------\r
868 double vvSlicerManager::GetOverlayColorLevel() const\r
869 {\r
870   if (mSlicers.size())\r
871     return mSlicers[0]->GetOverlayColorLevel();\r
872   return -1;\r
873 }\r
874 //----------------------------------------------------------------------------\r
875 \r
876 //----------------------------------------------------------------------------\r
877 bool vvSlicerManager::GetLinkOverlayWindowLevel() const\r
878 {\r
879   if (mSlicers.size())\r
880     return mSlicers[0]->GetLinkOverlayWindowLevel();\r
881   return -1;\r
882 }\r
883 //----------------------------------------------------------------------------\r
884 \r
885 //------------------------------------------------------------------------------\r
886 void vvSlicerManager::ResetTransformationToIdentity(const std::string actorType)\r
887 {\r
888   if(actorType == "image")\r
889     for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
890       this->GetImage()->GetTransform()[i]->Identity();\r
891   else if(actorType == "overlay")\r
892     for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
893       this->GetSlicer(0)->GetOverlay()->GetTransform()[i]->Identity();\r
894   else if(actorType == "fusion")\r
895     for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
896       this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();\r
897   else if(actorType == "fusionSequence") //TODO: Check what should really be done here\r
898     for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
899       this->GetSlicer(0)->GetFusion()->GetTransform()[i]->Identity();\r
900   else if(actorType == "vf")\r
901     for(unsigned int i=0; i<this->GetImage()->GetTransform().size(); i++)\r
902       this->GetVF()->GetTransform()[i]->Identity();\r
903   else\r
904     return;\r
905 \r
906   for(int i=0; i< this->GetNumberOfSlicers(); i++){\r
907     this->GetSlicer(i)->ForceUpdateDisplayExtent();\r
908     this->GetSlicer(i)->ResetCamera();\r
909     this->GetSlicer(i)->Render();\r
910   }\r
911 }\r
912 //------------------------------------------------------------------------------\r
913 \r
914 //----------------------------------------------------------------------------\r
915 void vvSlicerManager::Render()\r
916 {\r
917   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
918     mSlicers[i]->Render();\r
919   }\r
920 }\r
921 //----------------------------------------------------------------------------\r
922 \r
923 \r
924 //----------------------------------------------------------------------------\r
925 void vvSlicerManager::GenerateDefaultLookupTable()\r
926 {\r
927   SetPreset(mPreset);\r
928   SetColorMap(mColorMap);\r
929 }\r
930 //----------------------------------------------------------------------------\r
931 \r
932 \r
933 //----------------------------------------------------------------------------\r
934 void vvSlicerManager::Reload()\r
935 {\r
936   mReader->Update(mType);\r
937   mImage=mReader->GetOutput();\r
938   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
939     mSlicers[i]->SetImage(mImage);\r
940   }\r
941   \r
942   //if this image is the primary sequence of a fusion sequence, then the main transform matrix should be updated.\r
943   if (this->IsMainSequenceOfFusionSequence()) {\r
944           SetFusionSequenceMainTransformMatrix( mImage->GetTransform()[0]->GetMatrix() );\r
945   }\r
946 }\r
947 //----------------------------------------------------------------------------\r
948 \r
949 \r
950 //----------------------------------------------------------------------------\r
951 void vvSlicerManager::ReloadFusion()\r
952 {\r
953   mFusionReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),mType);\r
954 \r
955   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
956     mSlicers[i]->SetFusion(mFusionReader->GetOutput());\r
957     mSlicers[i]->Render();\r
958   }\r
959 }\r
960 //----------------------------------------------------------------------------\r
961 \r
962 //----------------------------------------------------------------------------\r
963 //the secondary sequence is being reloaded.\r
964 void vvSlicerManager::ReloadFusionSequence()\r
965 {\r
966   //  this is to keep the slice thickness, which needs to be artificially increased for visualization\r
967   double sp_x, sp_y, sp_z;\r
968   this->GetImage()->GetVTKImages()[0]->GetSpacing(sp_x, sp_y, sp_z);\r
969 \r
970   mFusionSequenceReader->Update(mImage->GetNumberOfDimensions(),mFusionComponent.c_str(),vvImageReader::MERGEDWITHTIME);\r
971 \r
972   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
973     mSlicers[i]->SetFusion(mFusionSequenceReader->GetOutput(), 1);\r
974     mSlicers[i]->Render();\r
975   }\r
976 \r
977   //Update the slider\r
978   mFusionSequenceNbFrames = mFusionSequenceReader->GetOutput()->GetTransform().size();\r
979   if (mFusionSequenceFrameIndex>=mFusionSequenceNbFrames) {\r
980           mFusionSequenceFrameIndex=0;\r
981   }\r
982 \r
983   //Update the list of initial transforms\r
984   mFusionSequenceListInitialTransformMatrices.clear();\r
985   for (unsigned i=0 ; i<mFusionSequenceNbFrames ; i++) {\r
986           this->AddFusionSequenceInitialTransformMatrices( mFusionSequenceReader->GetOutput()->GetTransform()[i]->GetMatrix() );\r
987   }\r
988 \r
989   //  also update the slice thickness\r
990   for (unsigned i=0 ; i<this->GetImage()->GetTransform().size() ; i++) {\r
991     sp_x = this->GetImage()->GetVTKImages()[i]->GetSpacing()[0];\r
992     sp_y = this->GetImage()->GetVTKImages()[i]->GetSpacing()[1];\r
993     this->GetImage()->GetVTKImages()[i]->SetSpacing( sp_x, sp_y, sp_z);\r
994   }\r
995 \r
996 }\r
997 //----------------------------------------------------------------------------\r
998 \r
999 \r
1000 //----------------------------------------------------------------------------\r
1001 void vvSlicerManager::ReloadOverlay()\r
1002 {\r
1003   mOverlayReader->Update(mImage->GetNumberOfDimensions(),mOverlayComponent.c_str(),mType);\r
1004   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
1005     mSlicers[i]->SetOverlay(mOverlayReader->GetOutput());\r
1006     mSlicers[i]->Render();\r
1007   }\r
1008 }\r
1009 //----------------------------------------------------------------------------\r
1010 \r
1011 \r
1012 //----------------------------------------------------------------------------\r
1013 void vvSlicerManager::ReloadVF()\r
1014 {\r
1015   mVectorReader->Update(vvImageReader::VECTORFIELD); //deletes the old images through the VF::Init() function\r
1016   mVF=mVectorReader->GetOutput();\r
1017   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
1018     mSlicers[i]->SetVF(mVF);\r
1019     mSlicers[i]->Render();\r
1020   }\r
1021 }\r
1022 //----------------------------------------------------------------------------\r
1023 \r
1024 \r
1025 //----------------------------------------------------------------------------\r
1026 void vvSlicerManager::RemoveActor(const std::string& actor_type, int overlay_index)\r
1027 {\r
1028   if (actor_type =="overlay")\r
1029     mOverlayReader = NULL;\r
1030 \r
1031   if (actor_type =="fusion")\r
1032     mFusionReader = NULL;\r
1033 \r
1034   if (actor_type =="fusionSequence") {\r
1035     mFusionSequenceReader = NULL;\r
1036   }\r
1037 \r
1038   for (unsigned int i = 0; i < mSlicers.size(); i++)\r
1039     mSlicers[i]->RemoveActor(actor_type,overlay_index);\r
1040 \r
1041   if (actor_type=="vector") {\r
1042     mVF=NULL;\r
1043     mVectorReader=NULL;\r
1044   }\r
1045 }\r
1046 //----------------------------------------------------------------------------\r
1047 \r
1048 \r
1049 //----------------------------------------------------------------------------\r
1050 void vvSlicerManager::RemoveActors()\r
1051 {\r
1052   ///This method leaks a few objects. See RemoveActor for what a\r
1053   ///correct implementation would look like\r
1054   //DS -> probably due to the reader (now released in the\r
1055   //RemoveActor() function. (I hope)\r
1056   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
1057     mSlicers[i]->SetDisplayMode(0);\r
1058     mSlicers[i]->GetRenderer()->RemoveActor(mSlicers[i]->GetImageActor());\r
1059   }\r
1060 }\r
1061 //----------------------------------------------------------------------------\r
1062 \r
1063 \r
1064 //----------------------------------------------------------------------------\r
1065 void vvSlicerManager::UpdateInfoOnCursorPosition(int slicer)\r
1066 {\r
1067   //  int view = mSlicers[slicer]->GetSliceOrientation();\r
1068   //  int slice = mSlicers[slicer]->GetSlice();\r
1069   double x = mSlicers[slicer]->GetCursorPosition()[0];\r
1070   double y = mSlicers[slicer]->GetCursorPosition()[1];\r
1071   double z = mSlicers[slicer]->GetCursorPosition()[2];\r
1072   double X = (x - mSlicers[slicer]->GetInput()->GetOrigin()[0])/\r
1073     mSlicers[slicer]->GetInput()->GetSpacing()[0];\r
1074   double Y = (y - mSlicers[slicer]->GetInput()->GetOrigin()[1])/\r
1075     mSlicers[slicer]->GetInput()->GetSpacing()[1];\r
1076   double Z = (z - mSlicers[slicer]->GetInput()->GetOrigin()[2])/\r
1077     mSlicers[slicer]->GetInput()->GetSpacing()[2];\r
1078   double value = -VTK_DOUBLE_MAX;\r
1079   int displayVec = 0;\r
1080   double xVec=0, yVec=0, zVec=0, valueVec=0;\r
1081   int displayOver = 0;\r
1082   int displayFus = 0;\r
1083   double valueOver=0, valueFus=0;\r
1084   if (X >= mSlicers[slicer]->GetInput()->GetWholeExtent()[0] &&\r
1085       X <= mSlicers[slicer]->GetInput()->GetWholeExtent()[1] &&\r
1086       Y >= mSlicers[slicer]->GetInput()->GetWholeExtent()[2] &&\r
1087       Y <= mSlicers[slicer]->GetInput()->GetWholeExtent()[3] &&\r
1088       Z >= mSlicers[slicer]->GetInput()->GetWholeExtent()[4] &&\r
1089       Z <= mSlicers[slicer]->GetInput()->GetWholeExtent()[5]) {\r
1090 \r
1091     value = this->GetScalarComponentAsDouble(mSlicers[slicer]->GetInput(), X, Y, Z);\r
1092 \r
1093     if (mSlicers[slicer]->GetVFActor() ) {\r
1094       displayVec = 1;\r
1095       unsigned int currentTime = mSlicers[slicer]->GetMaxCurrentTSlice();\r
1096       vtkImageData *vf = NULL;\r
1097 \r
1098       if (mSlicers[slicer]->GetVF()->GetVTKImages().size() > currentTime)\r
1099         vf = mSlicers[slicer]->GetVF()->GetVTKImages()[currentTime];\r
1100       else\r
1101         vf = mSlicers[slicer]->GetVF()->GetVTKImages()[0];\r
1102 \r
1103       if (vf) {\r
1104         double Xvf = (x - vf->GetOrigin()[0])/ vf->GetSpacing()[0];\r
1105         double Yvf = (y - vf->GetOrigin()[1])/ vf->GetSpacing()[1];\r
1106         double Zvf = (z - vf->GetOrigin()[2])/ vf->GetSpacing()[2];\r
1107         xVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 0);\r
1108         yVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 1);\r
1109         zVec = this->GetScalarComponentAsDouble( vf, Xvf, Yvf, Zvf, 2);\r
1110         valueVec = sqrt(xVec*xVec + yVec*yVec + zVec*zVec);\r
1111       }\r
1112     }\r
1113     if (mSlicers[slicer]->GetOverlayActor() ) {\r
1114       displayOver = 1;\r
1115       vtkImageData *overlay = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetOverlayMapper()->GetInput());\r
1116       double Xover = (x - overlay->GetOrigin()[0]) / overlay->GetSpacing()[0];\r
1117       double Yover = (y - overlay->GetOrigin()[1]) / overlay->GetSpacing()[1];\r
1118       double Zover = (z - overlay->GetOrigin()[2]) / overlay->GetSpacing()[2];\r
1119       valueOver = this->GetScalarComponentAsDouble(overlay, Xover, Yover, Zover);\r
1120     }\r
1121 \r
1122         if ( mSlicers[slicer]->GetFusionActor() ) {\r
1123                 displayFus = 1;\r
1124                 vtkImageData *fusion = dynamic_cast<vtkImageData*>(mSlicers[slicer]->GetFusionMapper()->GetInput());\r
1125                 double Xover = (x - fusion->GetOrigin()[0]) / fusion->GetSpacing()[0];\r
1126                 double Yover = (y - fusion->GetOrigin()[1]) / fusion->GetSpacing()[1];\r
1127                 double Zover = (z - fusion->GetOrigin()[2]) / fusion->GetSpacing()[2];\r
1128                 valueFus = this->GetScalarComponentAsDouble(fusion, Xover, Yover, Zover);\r
1129         }\r
1130         else if (this->IsInvolvedInFusionSequence()) { \r
1131     //if the cursor moves over the 'independent' version of the secondary sequence\r
1132     //do not update the panel, just keep it as it is.\r
1133                 displayFus = 1;\r
1134                 valueFus = std::numeric_limits<double>::quiet_NaN();\r
1135         }\r
1136 \r
1137     emit UpdatePosition(mSlicers[slicer]->GetCursorVisibility(),\r
1138                         x,y,z,X,Y,Z,value);\r
1139     emit UpdateVector(displayVec,xVec, yVec, zVec, valueVec);\r
1140     emit UpdateOverlay(displayOver,valueOver,value);\r
1141     emit UpdateFusion(displayFus,valueFus);\r
1142   }\r
1143 }\r
1144 //----------------------------------------------------------------------------\r
1145 \r
1146 \r
1147 //----------------------------------------------------------------------------\r
1148 void vvSlicerManager::Activated()\r
1149 {\r
1150   emit currentImageChanged(mId);\r
1151 }\r
1152 //----------------------------------------------------------------------------\r
1153 \r
1154 \r
1155 //----------------------------------------------------------------------------\r
1156 void vvSlicerManager::Picked()\r
1157 {\r
1158   emit currentPickedImageChanged(mId);\r
1159 }\r
1160 //----------------------------------------------------------------------------\r
1161 \r
1162 \r
1163 //----------------------------------------------------------------------------\r
1164 void vvSlicerManager::UpdateWindowLevel()\r
1165 {\r
1166   emit WindowLevelChanged();\r
1167 }\r
1168 //----------------------------------------------------------------------------\r
1169 \r
1170 \r
1171 //----------------------------------------------------------------------------\r
1172 void vvSlicerManager::UpdateSlice(int slicer)\r
1173 {\r
1174   if (mPreviousSlice[slicer] == mSlicers[slicer]->GetSlice()) {\r
1175     //DD("============= NOTHING");\r
1176     return;\r
1177   }\r
1178   //std::cout << "vvSlicerManager::UpdateSlice " << slicer << " " << mSlicers[slicer]->GetSlice() << std::endl;\r
1179   emit UpdateSlice(slicer, mSlicers[slicer]->GetSlice());\r
1180   mSlicers[slicer]->Render(); // DS <-- I add this, this could/must be the only Render ...\r
1181   mPreviousSlice[slicer] = mSlicers[slicer]->GetSlice();\r
1182 }\r
1183 //----------------------------------------------------------------------------\r
1184 \r
1185 \r
1186 //----------------------------------------------------------------------------\r
1187 void vvSlicerManager::UpdateTSlice(int slicer)\r
1188 {\r
1189   int slice = mSlicers[slicer]->GetSlice();\r
1190 \r
1191   int tslice = mSlicers[slicer]->GetMaxCurrentTSlice();\r
1192   //if (this->IsInvolvedInFusionSequence()) tslice = mSlicers[slicer]->GetTSlice(); //actually, this is handled by the Slicer\r
1193 \r
1194   if (mPreviousSlice[slicer] == slice) {\r
1195     if (mPreviousTSlice[slicer] == tslice) {\r
1196       //      DD("************** NOTHING ***********");\r
1197       return;\r
1198     }\r
1199   }\r
1200   mPreviousSlice[slicer] = slice;\r
1201   mPreviousTSlice[slicer] = tslice;\r
1202 \r
1203   emit UpdateTSlice(slicer, tslice, mFusionSequenceInvolvementCode);\r
1204 }\r
1205 //----------------------------------------------------------------------------\r
1206 \r
1207 \r
1208 //----------------------------------------------------------------------------\r
1209 void vvSlicerManager::UpdateSliceRange(int slicer)\r
1210 {\r
1211   emit UpdateSliceRange(slicer,\r
1212                         mSlicers[slicer]->GetSliceRange()[0], mSlicers[slicer]->GetSliceRange()[1],\r
1213                         0,mSlicers[slicer]->GetTMax());\r
1214 }\r
1215 //----------------------------------------------------------------------------\r
1216 \r
1217 //----------------------------------------------------------------------------\r
1218 void vvSlicerManager::SetSlicingPreset(SlicingPresetType preset)\r
1219 {\r
1220   if(mSlicingPreset==preset)\r
1221     return;\r
1222 \r
1223   vtkMatrix4x4 *imageTransformInverse = vtkMatrix4x4::New();\r
1224   mImage->GetTransform()[this->GetTSlice()]->GetInverse(imageTransformInverse);\r
1225 \r
1226   for(int i=0; i< this->GetNumberOfSlicers(); i++){\r
1227     vvSlicer *s = this->GetSlicer(i);\r
1228     switch(preset)\r
1229     {\r
1230     case WORLD_SLICING:\r
1231       s->GetSlicingTransform()->Identity();\r
1232       break;\r
1233     case VOXELS_SLICING:\r
1234       s->GetSlicingTransform()->SetMatrix(imageTransformInverse);\r
1235       break;\r
1236     default:\r
1237       imageTransformInverse->Delete();\r
1238       return;\r
1239     }\r
1240     s->ForceUpdateDisplayExtent();\r
1241     s->SetSlice((s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2+1]\r
1242                 +s->GetInput()->GetWholeExtent()[s->GetSliceOrientation()*2])/2.0);\r
1243     s->ResetCamera();\r
1244     s->Render();\r
1245   }\r
1246 \r
1247   imageTransformInverse->Delete();\r
1248   mSlicingPreset = preset;\r
1249 }\r
1250 \r
1251 //----------------------------------------------------------------------------\r
1252 \r
1253 //----------------------------------------------------------------------------\r
1254 void vvSlicerManager::SetPreset(int preset)\r
1255 {\r
1256 \r
1257   //vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());\r
1258   double window = mSlicers[0]->GetColorWindow();\r
1259   double level = mSlicers[0]->GetColorLevel();\r
1260 \r
1261   std::string component_type=mImage->GetScalarTypeAsITKString();\r
1262   switch (preset) {\r
1263   case WL_AUTO:\r
1264     double range[2];\r
1265     mImage->GetScalarRange(range);\r
1266     window = range[1] - range[0];\r
1267     level = (range[1] + range[0])* 0.5;\r
1268     break;\r
1269   case WL_HOUNSFIELD:\r
1270     window = 2000;\r
1271     level = 0;\r
1272     break;\r
1273   case WL_SOFTTISSUE:\r
1274     window = 400;\r
1275     level = 20;\r
1276     break;\r
1277   case WL_LUNGS: // lungs (same as FOCAL)\r
1278     window = 1700;\r
1279     level = -300;\r
1280     break;\r
1281   case WL_BONES:\r
1282     window = 1000;\r
1283     level = 500;\r
1284     break;\r
1285   case WL_HEAD:\r
1286     window = 200;\r
1287     level = 70;\r
1288     break;\r
1289   case WL_BINARY:\r
1290     window = 1;\r
1291     level = 0.5;\r
1292     break;\r
1293   case WL_USER:\r
1294     break;\r
1295   case WL_VENTILATION:\r
1296     window=1.;\r
1297     level=0.;\r
1298     break;\r
1299   }\r
1300   mPreset = preset;\r
1301   this->SetColorWindow(window);\r
1302   this->SetColorLevel(level);\r
1303 \r
1304   //if (LUT)\r
1305   //{\r
1306   //    SetColorMap(-1);\r
1307   //}\r
1308 }\r
1309 //----------------------------------------------------------------------------\r
1310 \r
1311 \r
1312 //----------------------------------------------------------------------------\r
1313 void vvSlicerManager::SetLocalColorWindowing(const int slicer, const bool bCtrlKey)\r
1314 {\r
1315   double min, max;\r
1316   if(bCtrlKey && this->mSlicers[slicer]->GetFusion()) {\r
1317     int t = mSlicers[slicer]->GetFusionTSlice();\r
1318     this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
1319                                                           this->mSlicers[slicer]->GetFusion()->GetVTKImages()[t],\r
1320                                                           this->mSlicers[slicer]->GetConcatenatedFusionTransform());\r
1321     this->SetFusionWindow(max-min);\r
1322     this->SetFusionLevel(0.5*(min+max));\r
1323     this->SetColorMap(mColorMap);\r
1324   }\r
1325   else if(bCtrlKey && this->mSlicers[slicer]->GetOverlay()) {\r
1326     int t = mSlicers[slicer]->GetOverlayTSlice();\r
1327     this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
1328                                                           this->mSlicers[slicer]->GetOverlay()->GetVTKImages()[t],\r
1329                                                           this->mSlicers[slicer]->GetConcatenatedOverlayTransform());\r
1330     if(this->mSlicers[slicer]->GetLinkOverlayWindowLevel()){\r
1331       this->SetColorWindow(max-min);\r
1332       this->SetColorLevel(0.5*(min+max));\r
1333     } else {\r
1334       this->SetOverlayColorWindow(max-min);\r
1335       this->SetOverlayColorLevel(0.5*(min+max));\r
1336     }\r
1337   }\r
1338   else {\r
1339     int t = this->GetTSlice();\r
1340     this->mSlicers[slicer]->GetExtremasAroundMousePointer(min, max,\r
1341                                                           this->mSlicers[slicer]->GetImage()->GetVTKImages()[t],\r
1342                                                           this->mSlicers[slicer]->GetConcatenatedTransform());\r
1343     this->SetColorWindow(max-min);\r
1344     this->SetColorLevel(0.5*(min+max));\r
1345     this->SetPreset(WL_USER);\r
1346   }\r
1347   this->Render();\r
1348   this->UpdateWindowLevel();\r
1349 }\r
1350 //----------------------------------------------------------------------------\r
1351 \r
1352 \r
1353 //----------------------------------------------------------------------------\r
1354 void vvSlicerManager::SetColorMap(int colormap)\r
1355 {\r
1356   double range[2];\r
1357 \r
1358   range[0] = mSlicers[0]->GetInput()->GetScalarRange()[0];\r
1359   range[1] = mSlicers[0]->GetInput()->GetScalarRange()[1];\r
1360 \r
1361   double window = mSlicers[0]->GetWindowLevel()->GetWindow();\r
1362   double level = mSlicers[0]->GetWindowLevel()->GetLevel();\r
1363 \r
1364   vtkLookupTable* LUT = static_cast<vtkLookupTable*>(mSlicers[0]->GetWindowLevel()->GetLookupTable());\r
1365   switch (colormap) {\r
1366   case -1:\r
1367     break;\r
1368   case 0:\r
1369     LUT = NULL;\r
1370     break;\r
1371   case 1:\r
1372     if (LUT == NULL)\r
1373       LUT = vtkLookupTable::New();\r
1374     LUT->SetValueRange(0,1);\r
1375     LUT->SetSaturationRange(1,1);\r
1376     LUT->SetHueRange(0,0.18);\r
1377     break;\r
1378   case 2:\r
1379     if (LUT == NULL)\r
1380       LUT = vtkLookupTable::New();\r
1381     LUT->SetValueRange(0,1);\r
1382     LUT->SetSaturationRange(1,1);\r
1383     LUT->SetHueRange(0.4,0.80);\r
1384     break;\r
1385   case 3:\r
1386     if (LUT == NULL)\r
1387       LUT = vtkLookupTable::New();\r
1388     LUT->SetValueRange(0.5,1);\r
1389     LUT->SetSaturationRange(1,1);\r
1390     LUT->SetHueRange(0.666,0);\r
1391     break;\r
1392   case 4:\r
1393     if (LUT == NULL)\r
1394       LUT = vtkLookupTable::New();\r
1395     LUT->SetValueRange(1,1);\r
1396     LUT->SetSaturationRange(1,1);\r
1397     LUT->SetHueRange(0,1);\r
1398     LUT->SetAlphaRange(1, 1);\r
1399     break;\r
1400   case 5:\r
1401     if (LUT == NULL)\r
1402       LUT = vtkLookupTable::New();\r
1403     LUT->SetValueRange(1,1);\r
1404     LUT->SetSaturationRange(1,1);\r
1405     LUT->SetHueRange(1,0.1);\r
1406     //LUT->SetRampToLinear();\r
1407     break;\r
1408   }\r
1409   if (LUT) {\r
1410     LUT->SetTableRange(level-fabs(window)/2,level+fabs(window)/2);\r
1411     LUT->Build();\r
1412   }\r
1413   vtkWindowLevelLookupTable* fusLUT = NULL;\r
1414 \r
1415   //FUSION / FUSION SEQUENCE\r
1416   if (mSlicers[0]->GetFusion()) { // && mFusionColorMap >= 0) {\r
1417     fusLUT = vtkWindowLevelLookupTable::New();\r
1418     double fusRange [2];\r
1419     fusRange[0] = mFusionLevel - mFusionWindow/2;\r
1420     fusRange[1] = mFusionLevel + mFusionWindow/2;\r
1421 \r
1422     //check whether it is actually a fusionSequence or a fusion, before invoking mFusionReader...\r
1423     double* frange;\r
1424     if (this->IsInvolvedInFusionSequence()) \r
1425       frange = mFusionSequenceReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
1426     else\r
1427       frange = mFusionReader->GetOutput()->GetVTKImages()[0]->GetScalarRange();\r
1428 \r
1429     fusLUT->SetTableRange(frange);\r
1430     fusLUT->SetValueRange(1,1);\r
1431     fusLUT->SetSaturationRange(1,1);\r
1432     fusLUT->SetAlphaRange(1, 1);\r
1433     fusLUT->SetWindow(mFusionWindow);\r
1434     fusLUT->SetLevel(mFusionLevel);\r
1435     if (mFusionColorMap == 1)\r
1436       fusLUT->SetHueRange(0,0.18);\r
1437     else if (mFusionColorMap == 2)\r
1438       fusLUT->SetHueRange(0.4,0.80);\r
1439     else if (mFusionColorMap == 3)\r
1440     {\r
1441       fusLUT->SetHueRange(0.666, 0);\r
1442       fusLUT->SetValueRange(0.5, 1);\r
1443     }\r
1444     else if (mFusionColorMap == 4)\r
1445       fusLUT->SetHueRange(0,1);\r
1446     else if (mFusionColorMap <= 0)\r
1447     {\r
1448       fusLUT->SetValueRange(0,1);\r
1449       fusLUT->SetSaturationRange(0,0);\r
1450     }\r
1451 \r
1452     fusLUT->ForceBuild();\r
1453     double v[4];\r
1454 \r
1455     // set color table transparency\r
1456     //double alpha_range=(double)mFusionThresOpacity/10;\r
1457     double range_end = fusRange[0] + (double)mFusionThresOpacity*(fusRange[1] - fusRange[0])/100;\r
1458     double curr_value = fusRange[0];\r
1459     int nvalues = fusLUT->GetNumberOfTableValues();\r
1460     for (double i = 0; curr_value < range_end; i++) {  \r
1461       fusLUT->GetTableValue(i, v);\r
1462       v[3] = 0;\r
1463       //if (curr_value >= -alpha_range && curr_value <= alpha_range) v[3] = pow(fabs(curr_value/alpha_range),2);\r
1464       //else v[3] = 1;\r
1465       fusLUT->SetTableValue(i, v);\r
1466       curr_value += (fusRange[1] - fusRange[0])/nvalues;\r
1467     }\r
1468   }\r
1469   for ( unsigned int i = 0; i < mSlicers.size(); i++) {\r
1470 \r
1471     if (mSlicers[i]->GetOverlay()) {\r
1472       vtkLookupTable* supLUT = vtkLookupTable::New();\r
1473       supLUT->SetTableRange(range[0],range[1]);\r
1474       supLUT->SetValueRange(1,1);\r
1475       supLUT->SetSaturationRange(1,1);\r
1476       supLUT->SetHueRange(double(mOverlayColor)/360,double(mOverlayColor)/360);\r
1477       supLUT->Build();\r
1478       vtkLookupTable* invLUT = vtkLookupTable::New();\r
1479       invLUT->SetTableRange(range[0],range[1]);\r
1480       invLUT->SetValueRange(1,1);\r
1481       invLUT->SetSaturationRange(1,1);\r
1482       invLUT->SetHueRange(double((mOverlayColor+180)%360)/360,double((mOverlayColor+180)%360)/360);\r
1483       invLUT->Build();\r
1484       mSlicers[i]->GetWindowLevel()->SetLookupTable(supLUT);\r
1485       mSlicers[i]->GetOverlayMapper()->SetLookupTable(invLUT);\r
1486       invLUT->Delete();\r
1487       supLUT->Delete();\r
1488     } else if (mSlicers[i]->GetOverlay()) {\r
1489       mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);\r
1490     } else {\r
1491       mSlicers[i]->GetWindowLevel()->SetLookupTable(LUT);\r
1492     }\r
1493 \r
1494     if (mSlicers[i]->GetFusion()) {\r
1495       mSlicers[i]->ShowFusionLegend(mFusionShowLegend);\r
1496       mSlicers[i]->GetFusionMapper()->SetLookupTable(fusLUT);\r
1497       mSlicers[i]->GetFusionActor()->SetOpacity(double(mFusionOpacity)/100);\r
1498     }\r
1499   }\r
1500   if (fusLUT)\r
1501     fusLUT->Delete();\r
1502   if (colormap >= 0)\r
1503     mColorMap = colormap;\r
1504 }\r
1505 //----------------------------------------------------------------------------\r
1506 \r
1507 \r
1508 //----------------------------------------------------------------------------\r
1509 vvLandmarks* vvSlicerManager::GetLandmarks()\r
1510 {\r
1511   if (mLandmarks == NULL) {\r
1512     mLandmarks = new vvLandmarks(mSlicers[0]->GetTMax()+1);\r
1513     for (unsigned int i = 0; i < mSlicers.size(); i++)\r
1514       mSlicers[i]->SetLandmarks(mLandmarks);\r
1515   }\r
1516   return mLandmarks;\r
1517 }\r
1518 //----------------------------------------------------------------------------\r
1519 \r
1520 \r
1521 //----------------------------------------------------------------------------\r
1522 void vvSlicerManager::AddLandmark(float x,float y,float z,float t)\r
1523 {\r
1524   double x_index = (x - mSlicers[0]->GetInput()->GetOrigin()[0])/mSlicers[0]->GetInput()->GetSpacing()[0];\r
1525   double y_index = (y - mSlicers[0]->GetInput()->GetOrigin()[1])/mSlicers[0]->GetInput()->GetSpacing()[1];\r
1526   double z_index = (z - mSlicers[0]->GetInput()->GetOrigin()[2])/mSlicers[0]->GetInput()->GetSpacing()[2];\r
1527   if (x_index >= mSlicers[0]->GetInput()->GetWholeExtent()[0]-0.5 &&\r
1528       x_index <= mSlicers[0]->GetInput()->GetWholeExtent()[1]+0.5 &&\r
1529       y_index >= mSlicers[0]->GetInput()->GetWholeExtent()[2]-0.5 &&\r
1530       y_index <= mSlicers[0]->GetInput()->GetWholeExtent()[3]+0.5 &&\r
1531       z_index >= mSlicers[0]->GetInput()->GetWholeExtent()[4]-0.5 &&\r
1532       z_index <= mSlicers[0]->GetInput()->GetWholeExtent()[5]+0.5) {\r
1533     double value = this->GetScalarComponentAsDouble(mSlicers[0]->GetInput(), x_index, y_index, z_index);\r
1534     this->GetLandmarks()->AddLandmark(x,y,z,t,value);\r
1535     emit LandmarkAdded();\r
1536   }\r
1537 }\r
1538 //----------------------------------------------------------------------------\r
1539 \r
1540 //----------------------------------------------------------------------------\r
1541 void vvSlicerManager::PrevImage(int slicer)\r
1542 {\r
1543   emit ChangeImageWithIndexOffset(this, slicer, -1);\r
1544 }\r
1545 //----------------------------------------------------------------------------\r
1546 \r
1547 //----------------------------------------------------------------------------\r
1548 void vvSlicerManager::NextImage(int slicer)\r
1549 {\r
1550   emit ChangeImageWithIndexOffset(this, slicer,  1);\r
1551 }\r
1552 //----------------------------------------------------------------------------\r
1553 \r
1554 //----------------------------------------------------------------------------\r
1555 void vvSlicerManager::VerticalSliderHasChanged(int slicer, int slice)\r
1556 {\r
1557   emit AVerticalSliderHasChanged(slicer, slice);\r
1558 }\r
1559 \r
1560 //----------------------------------------------------------------------------\r
1561 \r
1562 //----------------------------------------------------------------------------\r
1563 double vvSlicerManager::GetScalarComponentAsDouble(vtkImageData *image, double X, double Y, double Z, int component)\r
1564 {\r
1565   int ix, iy, iz;\r
1566   return mSlicers[0]->GetScalarComponentAsDouble(image, X, Y, Z, ix, iy, iz, component);\r
1567 }\r
1568 //----------------------------------------------------------------------------\r