1 /*=========================================================================
2 Program: vv http://www.creatis.insa-lyon.fr/rio/vv
5 - University of LYON http://www.universite-lyon.fr/
6 - Léon Bérard cancer center http://oncora1.lyon.fnclcc.fr
7 - CREATIS CNRS laboratory http://www.creatis.insa-lyon.fr
9 This software is distributed WITHOUT ANY WARRANTY; without even
10 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
11 PURPOSE. See the copyright notices for more information.
13 It is distributed under dual licence
15 - BSD See included LICENSE.txt file
16 - CeCILL-B http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
17 ======================================================================-====*/
19 #include "vvBinaryImageOverlayActor.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>
32 //------------------------------------------------------------------------------
33 vvBinaryImageOverlayActor::vvBinaryImageOverlayActor() {
41 //------------------------------------------------------------------------------
44 //------------------------------------------------------------------------------
45 vvBinaryImageOverlayActor::~vvBinaryImageOverlayActor() {
46 for (unsigned int i = 0; i < mSlicer->GetImage()->GetVTKImages().size(); i++) {
47 mSlicer->GetRenderer()->RemoveActor(mImageActorList[i]);
49 mImageActorList.clear();
52 //------------------------------------------------------------------------------
55 //------------------------------------------------------------------------------
56 void vvBinaryImageOverlayActor::setColor(double r, double g, double b) {
61 //------------------------------------------------------------------------------
65 //------------------------------------------------------------------------------
66 void vvBinaryImageOverlayActor::setSlicer(vvSlicer * slicer) {
69 //------------------------------------------------------------------------------
72 //------------------------------------------------------------------------------
73 void vvBinaryImageOverlayActor::initialize() {
75 std::cerr << "ERROR. Please use setSlicer before setSlicer in vvBinaryImageOverlayActor." << std::endl;
80 std::cerr << "ERROR. Please use setImage before setSlicer in vvBinaryImageOverlayActor." << std::endl;
83 // Create an actor for each time slice
84 for (unsigned int numImage = 0; numImage < mSlicer->GetImage()->GetVTKImages().size(); 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();
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
95 mOverlayMapper->SetLookupTable(lut);
97 vtkImageActor * mOverlayActor = vtkImageActor::New();
98 mOverlayActor->SetInput(mOverlayMapper->GetOutput());
99 mOverlayActor->SetPickable(0);
100 mOverlayActor->SetVisibility(true);
101 //mOverlayActor->SetOpacity(1.0);
103 mMapperList.push_back(mOverlayMapper);
104 mImageActorList.push_back(mOverlayActor);
105 mSlicer->GetRenderer()->AddActor(mOverlayActor);
108 //------------------------------------------------------------------------------
111 //------------------------------------------------------------------------------
112 void vvBinaryImageOverlayActor::setImage(vvImage::Pointer image) {
115 //------------------------------------------------------------------------------
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();
126 //------------------------------------------------------------------------------
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();
139 //------------------------------------------------------------------------------
142 //------------------------------------------------------------------------------
143 void vvBinaryImageOverlayActor::update(int slicer, int slice) {
147 if (!mSlicer) return;
148 // DD(mSlicer->GetSlice());
149 // DD(mSlicer->GetTSlice());
151 if (mPreviousSlice == mSlicer->GetSlice()) {
152 if (mPreviousTSlice == mSlicer->GetTSlice()) {
153 DD("=========== NOTHING");
154 return; // Nothing to do
159 mSlice = mSlicer->GetSlice();
160 mTSlice = mSlicer->GetTSlice();
163 // DD("Update extent");
168 3 - compute new extent : ComputeImageDisplayedExtent
169 4 - ClipDisplayedExtent
170 5 - actor SetDisplayExtent
172 ==> à mettre dans slicer.
173 ==> fct (image input, image à overl)
175 int * imageExtent = mSlicer->GetExtent();
176 int orientation = mSlicer->GetOrientation();
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);
192 mPreviousTSlice = mSlicer->GetTSlice();
193 mPreviousSlice = mSlicer->GetSlice();
195 //------------------------------------------------------------------------------
198 //------------------------------------------------------------------------------
199 void vvBinaryImageOverlayActor::ComputeExtent(int orientation,
203 // std::cout << "InExtent = " << inExtent[0] << " " << inExtent[1] << " " << inExtent[2] << " "
204 // << inExtent[3] << " " << inExtent[4] << " " << inExtent[5] << std::endl;
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;
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;
216 case vtkImageViewer2::SLICE_ORIENTATION_YZ:
217 for(int i=2; i<6; i++) outExtent[i] = inExtent[i];
218 outExtent[0] = outExtent[1] = slice;
221 // std::cout << "OutExtent = " << outExtent[0] << " " << outExtent[1] << " " << outExtent[2] << " "
222 // << outExtent[3] << " " << outExtent[4] << " " << outExtent[5] << std::endl;
224 //------------------------------------------------------------------------------
227 //----------------------------------------------------------------------------
228 void vvBinaryImageOverlayActor::ComputeExtent(int * inExtent, int * outExtent, vtkImageData * image, vtkImageData * overlay)
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];
243 //----------------------------------------------------------------------------
246 //------------------------------------------------------------------------------
247 void vvBinaryImageOverlayActor::SetDisplayExtentAndCameraPosition(int orientation,
250 vtkImageActor * actor,
252 // DD("SetDisplayExtentAndCameraPosition");
255 actor->SetDisplayExtent(extent);
258 if (orientation == vtkImageViewer2::SLICE_ORIENTATION_XY) {
259 if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2] > slice)
260 actor->SetPosition(0,0, position);
262 actor->SetPosition(0,0, -position);
264 if (orientation == vtkImageViewer2::SLICE_ORIENTATION_XZ) {
265 if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[1] > slice)
266 actor->SetPosition(0,position,0);
268 actor->SetPosition(0,-position,0);
270 if (orientation == vtkImageViewer2::SLICE_ORIENTATION_YZ) {
271 if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[0] > slice)
272 actor->SetPosition(position,0, 0);
274 actor->SetPosition(-position,0, 0);
278 //------------------------------------------------------------------------------