]> Creatis software - clitk.git/blob - vv/vvBinaryImageOverlayActor.cxx
- default window level for [0:1] binary image
[clitk.git] / vv / vvBinaryImageOverlayActor.cxx
1 /*=========================================================================
2   Program:   vv                     http://www.creatis.insa-lyon.fr/rio/vv
3
4   Authors belong to: 
5   - University of LYON              http://www.universite-lyon.fr/
6   - Léon Bérard cancer center       http://oncora1.lyon.fnclcc.fr
7   - CREATIS CNRS laboratory         http://www.creatis.insa-lyon.fr
8
9   This software is distributed WITHOUT ANY WARRANTY; without even
10   the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11   PURPOSE.  See the copyright notices for more information.
12
13   It is distributed under dual licence
14
15   - BSD        See included LICENSE.txt file
16   - CeCILL-B   http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17   ======================================================================-====*/
18
19 #include "vvBinaryImageOverlayActor.h"
20 #include "vvImage.h"
21 #include <vtkImageActor.h>
22 #include <vtkCamera.h>
23 #include <vtkRenderer.h>
24 #include <vtkMarchingSquares.h>
25 #include <vtkImageClip.h>
26 #include <vtkImageData.h>
27 #include <vtkPolyDataMapper.h>
28 #include <vtkProperty.h>
29 #include <vtkImageMapToRGBA.h>
30 #include <vtkLookupTable.h>
31
32 //------------------------------------------------------------------------------
33 vvBinaryImageOverlayActor::vvBinaryImageOverlayActor() {
34   mTSlice = -1;
35   mSlice = 0;
36   mColor.resize(3);
37   mAlpha = 0.6;
38   mImage = 0;
39   mSlicer = 0;
40 }
41 //------------------------------------------------------------------------------
42
43
44 //------------------------------------------------------------------------------
45 vvBinaryImageOverlayActor::~vvBinaryImageOverlayActor() {
46   for (unsigned int i = 0; i < mSlicer->GetImage()->GetVTKImages().size(); i++) {
47     mSlicer->GetRenderer()->RemoveActor(mImageActorList[i]);
48   }
49   mImageActorList.clear();
50   mMapperList.clear();
51 }
52 //------------------------------------------------------------------------------
53
54
55 //------------------------------------------------------------------------------
56 void vvBinaryImageOverlayActor::setColor(double r, double g, double b) {
57   mColor[0] = r;
58   mColor[1] = g;
59   mColor[2] = b;
60 }
61 //------------------------------------------------------------------------------
62
63
64
65 //------------------------------------------------------------------------------
66 void vvBinaryImageOverlayActor::setSlicer(vvSlicer * slicer) {
67   mSlicer = slicer;
68 }
69 //------------------------------------------------------------------------------
70
71
72 //------------------------------------------------------------------------------
73 void vvBinaryImageOverlayActor::initialize() {
74   if (!mSlicer) {
75     std::cerr << "ERROR. Please use setSlicer before setSlicer in vvBinaryImageOverlayActor." << std::endl;
76     exit(0);
77   }
78   
79   if (!mImage) {
80     std::cerr << "ERROR. Please use setImage before setSlicer in vvBinaryImageOverlayActor." << std::endl;
81     exit(0);
82   }
83   // Create an actor for each time slice
84   for (unsigned int numImage = 0; numImage < mSlicer->GetImage()->GetVTKImages().size(); numImage++) {
85     DD(numImage);
86     vtkImageMapToRGBA * mOverlayMapper = vtkImageMapToRGBA::New();
87     mOverlayMapper->SetInput(mImage->GetVTKImages()[0]); // DS TODO : to change if it is 4D !!!
88     vtkLookupTable * lut = vtkLookupTable::New();
89     DD(lut->IsOpaque ());
90     lut->SetRange(0,1);
91     lut->SetNumberOfTableValues(2);
92     lut->SetTableValue(0, 0, 0, 0, 0.0);   // BG
93     lut->SetTableValue(1, mColor[0], mColor[1], mColor[2], mAlpha); // FG
94     DD(mColor[0]);
95     mOverlayMapper->SetLookupTable(lut);
96     
97     vtkImageActor * mOverlayActor = vtkImageActor::New();
98     mOverlayActor->SetInput(mOverlayMapper->GetOutput());
99     mOverlayActor->SetPickable(0);
100     mOverlayActor->SetVisibility(true);
101     //mOverlayActor->SetOpacity(1.0);
102
103     mMapperList.push_back(mOverlayMapper);
104     mImageActorList.push_back(mOverlayActor);
105     mSlicer->GetRenderer()->AddActor(mOverlayActor);  
106   }
107 }
108 //------------------------------------------------------------------------------
109
110
111 //------------------------------------------------------------------------------
112 void vvBinaryImageOverlayActor::setImage(vvImage::Pointer image) {
113   mImage = image;
114 }
115 //------------------------------------------------------------------------------
116
117
118 //------------------------------------------------------------------------------
119 void vvBinaryImageOverlayActor::hideActors() {
120   if (!mSlicer) return;
121   mSlice = mSlicer->GetSlice();
122   for(unsigned int i=0; i<mImageActorList.size(); i++) {
123     mImageActorList[i]->VisibilityOff();
124   }
125 }
126 //------------------------------------------------------------------------------
127
128   
129 //------------------------------------------------------------------------------
130 void vvBinaryImageOverlayActor::showActors() {
131   if (!mSlicer) return;
132   mSlice = mSlicer->GetSlice();
133   mTSlice = mSlicer->GetTSlice();
134   //  for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
135   mImageActorList[mTSlice]->VisibilityOn();
136   update(0, mSlice);
137   //}
138 }
139 //------------------------------------------------------------------------------
140
141   
142 //------------------------------------------------------------------------------
143 void vvBinaryImageOverlayActor::update(int slicer, int slice) {
144   // DD("update");
145   // DD(slicer);
146   // DD(slice);
147   if (!mSlicer) return;
148   // DD(mSlicer->GetSlice());
149   // DD(mSlicer->GetTSlice());
150
151   if (mPreviousSlice == mSlicer->GetSlice()) {
152     if (mPreviousTSlice == mSlicer->GetTSlice()) {
153       DD("=========== NOTHING");
154       return; // Nothing to do
155     }
156   }
157
158   // Get current slice
159   mSlice = mSlicer->GetSlice();
160   mTSlice = mSlicer->GetTSlice();
161
162   // Update extent
163   //  DD("Update extent");
164
165   /*
166 1 - get extent
167 2 - orientation
168 3 - compute new extent : ComputeImageDisplayedExtent
169 4 - ClipDisplayedExtent
170 5 - actor SetDisplayExtent
171
172 ==> à mettre dans slicer.
173   ==> fct (image input, image à overl)
174   */
175   int * imageExtent = mSlicer->GetExtent();
176   int orientation = mSlicer->GetOrientation();
177   int maskExtent[6];
178   ComputeExtent(orientation, mSlice, imageExtent, maskExtent);
179   //ComputeExtent(imageExtent, maskExtent, mSlicer->GetImage()->GetFirstVTKImageData(), mImage->GetFirstVTKImageData());
180   ComputeExtent(maskExtent, maskExtent, mSlicer->GetImage()->GetFirstVTKImageData(), mImage->GetFirstVTKImageData());
181   // std::cout << "maskExtent = " << maskExtent[0] << " " << maskExtent[1] << " " << maskExtent[2] << " " 
182   //        << maskExtent[3] << " " << maskExtent[4] << " " << maskExtent[5] << std::endl;
183   mSlicer->ClipDisplayedExtent(maskExtent, mMapperList[mTSlice]->GetInput()->GetWholeExtent());
184   // std::cout << "maskExtent = " << maskExtent[0] << " " << maskExtent[1] << " " << maskExtent[2] << " " 
185   //        << maskExtent[3] << " " << maskExtent[4] << " " << maskExtent[5] << std::endl;
186   SetDisplayExtentAndCameraPosition(orientation, mSlice, maskExtent, mImageActorList[mTSlice], 0.0);
187   
188   // TOO SLOW ? 
189   //mSlicer->Render();
190
191   //
192   mPreviousTSlice = mSlicer->GetTSlice();
193   mPreviousSlice  = mSlicer->GetSlice();
194 }
195 //------------------------------------------------------------------------------
196
197
198 //------------------------------------------------------------------------------
199 void vvBinaryImageOverlayActor::ComputeExtent(int orientation, 
200                                               int slice, 
201                                               int * inExtent,
202                                               int * outExtent) {
203   //  std::cout << "InExtent = " << inExtent[0] << " " << inExtent[1] << " " << inExtent[2] << " " 
204   //        << inExtent[3] << " " << inExtent[4] << " " << inExtent[5] << std::endl;
205   //  DD(orientation);
206   switch (orientation) {
207   case vtkImageViewer2::SLICE_ORIENTATION_XY:
208     for(int i=0; i<4; i++) outExtent[i] = inExtent[i];
209     outExtent[4] = outExtent[5] = slice; 
210     break;
211   case vtkImageViewer2::SLICE_ORIENTATION_XZ:
212     for(int i=0; i<2; i++) outExtent[i] = inExtent[i];
213     for(int i=4; i<6; i++) outExtent[i] = inExtent[i];
214     outExtent[2] = outExtent[3] = slice; 
215     break;
216   case vtkImageViewer2::SLICE_ORIENTATION_YZ:
217     for(int i=2; i<6; i++) outExtent[i] = inExtent[i];
218     outExtent[0] = outExtent[1] = slice; 
219     break;
220   }
221   // std::cout << "OutExtent = " << outExtent[0] << " " << outExtent[1] << " " << outExtent[2] << " " 
222   //        << outExtent[3] << " " << outExtent[4] << " " << outExtent[5] << std::endl;
223 }
224 //------------------------------------------------------------------------------
225
226
227 //----------------------------------------------------------------------------
228 void vvBinaryImageOverlayActor::ComputeExtent(int * inExtent, int * outExtent, vtkImageData * image, vtkImageData * overlay)
229 {
230   outExtent[0] = (( image->GetOrigin()[0] + inExtent[0]*image->GetSpacing()[0] ) - overlay->GetOrigin()[0]) /
231     overlay->GetSpacing()[0];
232   outExtent[1] = (( image->GetOrigin()[0] + inExtent[1]*image->GetSpacing()[0] ) - overlay->GetOrigin()[0]) /
233     overlay->GetSpacing()[0];
234   outExtent[2] = (( image->GetOrigin()[1] + inExtent[2]*image->GetSpacing()[1] ) - overlay->GetOrigin()[1]) /
235     overlay->GetSpacing()[1];
236   outExtent[3] = (( image->GetOrigin()[1] + inExtent[3]*image->GetSpacing()[1] ) - overlay->GetOrigin()[1]) /
237     overlay->GetSpacing()[1];
238   outExtent[4] = (( image->GetOrigin()[2] + inExtent[4]*image->GetSpacing()[2] ) - overlay->GetOrigin()[2]) /
239     overlay->GetSpacing()[2];
240   outExtent[5] = (( image->GetOrigin()[2] + inExtent[5]*image->GetSpacing()[2] ) - overlay->GetOrigin()[2]) /
241     overlay->GetSpacing()[2];
242 }
243 //----------------------------------------------------------------------------
244
245
246 //------------------------------------------------------------------------------
247 void vvBinaryImageOverlayActor::SetDisplayExtentAndCameraPosition(int orientation, 
248                                                                   int slice, 
249                                                                   int * extent, 
250                                                                   vtkImageActor * actor, 
251                                                                   double position) {
252   //  DD("SetDisplayExtentAndCameraPosition");
253   //DD(orientation);
254   //DD(slice);
255   actor->SetDisplayExtent(extent);
256   
257
258   if (orientation == vtkImageViewer2::SLICE_ORIENTATION_XY) {
259     if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
260       actor->SetPosition(0,0, position);
261     else
262       actor->SetPosition(0,0, -position);    
263   }
264   if (orientation == vtkImageViewer2::SLICE_ORIENTATION_XZ) {
265     if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice)
266       actor->SetPosition(0,position,0);
267     else
268       actor->SetPosition(0,-position,0);    
269   }
270   if (orientation == vtkImageViewer2::SLICE_ORIENTATION_YZ) {
271     if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice)
272       actor->SetPosition(position,0, 0);
273     else
274       actor->SetPosition(-position,0, 0);    
275   }
276   
277 }
278 //------------------------------------------------------------------------------
279
280
281
282