]> Creatis software - clitk.git/blob - vv/vvImageContour.cxx
added the new headers
[clitk.git] / vv / vvImageContour.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 #include "vvImageContour.h"
19 #include <vtkImageActor.h>
20 #include <vtkCamera.h>
21 #include <vtkRenderer.h>
22 #include <vtkMarchingSquares.h>
23 #include <vtkImageClip.h>
24 #include <vtkImageData.h>
25 #include <vtkPolyDataMapper.h>
26 #include <vtkProperty.h>
27
28 //------------------------------------------------------------------------------
29 vvImageContour::vvImageContour() {
30   mTSlice = -1;
31   mSlice = 0;
32 }
33 //------------------------------------------------------------------------------
34
35
36 //------------------------------------------------------------------------------
37 vvImageContour::~vvImageContour() {
38   for (unsigned int i = 0; i < mSlicer->GetImage()->GetVTKImages().size(); i++) {
39     mSlicer->GetRenderer()->RemoveActor(mSquaresActorList[i]);
40   }
41   mSquaresActorList.clear();
42   mSquaresList.clear();
43   mClipperList.clear();
44 }
45 //------------------------------------------------------------------------------
46
47
48 //------------------------------------------------------------------------------
49 void vvImageContour::setSlicer(vvSlicer * slicer) {
50   mSlicer = slicer;  
51
52   for (unsigned int numImage = 0; numImage < mSlicer->GetImage()->GetVTKImages().size(); numImage++) {
53     vtkImageClip * mClipper = vtkImageClip::New();
54     vtkMarchingSquares * mSquares = vtkMarchingSquares::New();
55     vtkPolyDataMapper * mSquaresMapper = vtkPolyDataMapper::New();
56     vtkActor * mSquaresActor = vtkActor::New();
57
58     mClipper->SetInput(mSlicer->GetImage()->GetVTKImages()[numImage]);
59     mSquares->SetInput(mClipper->GetOutput());
60     mSquaresMapper->SetInput(mSquares->GetOutput());
61     mSquaresMapper->ScalarVisibilityOff();
62     mSquaresActor->SetMapper(mSquaresMapper);
63     mSquaresActor->GetProperty()->SetColor(1.0,0,0);
64     mSquaresActor->SetPickable(0);
65     mSquaresActor->VisibilityOff();
66     mSlicer->GetRenderer()->AddActor(mSquaresActor);
67     
68     mSquaresActorList.push_back(mSquaresActor);
69     mSquaresList.push_back(mSquares);
70     mClipperList.push_back(mClipper);
71   }
72 }
73 //------------------------------------------------------------------------------
74
75
76 //------------------------------------------------------------------------------
77 void vvImageContour::setColor(double r, double g, double b) {
78   for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
79     mSquaresActorList[i]->GetProperty()->SetColor(r,g,b);
80   }
81 }
82 //------------------------------------------------------------------------------
83
84
85 //------------------------------------------------------------------------------
86 void vvImageContour::hideActors() {
87   if (!mSlicer) return;
88   mSlice = mSlicer->GetSlice();
89   for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
90     mSquaresActorList[i]->VisibilityOff();
91   }
92 }
93 //------------------------------------------------------------------------------
94
95   
96 //------------------------------------------------------------------------------
97 void vvImageContour::showActors() {
98   if (!mSlicer) return;
99   mSlice = mSlicer->GetSlice();
100   mTSlice = mSlicer->GetTSlice();
101   //  for(unsigned int i=0; i<mSquaresActorList.size(); i++) {
102   mSquaresActorList[mTSlice]->VisibilityOn();
103   update(mValue);
104   //}
105 }
106 //------------------------------------------------------------------------------
107
108   
109 //------------------------------------------------------------------------------
110 void vvImageContour::update(double value) {
111   mValue= value;
112   if (!mSlicer) return;
113
114   // how to not update if not visible ?
115
116   mSlice = mSlicer->GetSlice();
117   // Only change actor visibility if tslice change
118   if (mTSlice != mSlicer->GetTSlice()) {
119     if (mTSlice != -1) 
120       mSquaresActorList[mTSlice]->VisibilityOff();
121     mTSlice = mSlicer->GetTSlice();
122     mSquaresActorList[mTSlice]->VisibilityOn();
123   }
124   
125   vtkMarchingSquares * mSquares = mSquaresList[mTSlice];
126   vtkImageClip * mClipper = mClipperList[mTSlice];
127   vtkActor * mSquaresActor = mSquaresActorList[mTSlice];
128
129   // Do it
130   mSquares->SetValue(0,value);
131
132   int* extent = mSlicer->GetImageActor()->GetDisplayExtent();
133   mClipper->SetOutputWholeExtent(extent[0],extent[1],extent[2],
134                                  extent[3],extent[4],extent[5]);
135   int i;
136   for (i = 0; i < 6;i = i+2) {
137     if (extent[i] == extent[i+1]) {
138       break;
139     }
140   }
141   
142   switch (i)
143     {
144     case 0:
145       if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[0] > mSlice)
146         {
147           mSquaresActor->SetPosition(1,0,0);
148         }
149       else
150         {
151           mSquaresActor->SetPosition(-1,0,0);
152         }
153       break;
154     case 2:
155       if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[1] > mSlice)
156         {
157           mSquaresActor->SetPosition(0,1,0);
158         }
159       else
160         {
161           mSquaresActor->SetPosition(0,-1,0);
162         }
163       break;
164     case 4:
165       if (mSlicer->GetRenderer()->GetActiveCamera()->GetPosition()[2] > mSlice)
166         {
167           mSquaresActor->SetPosition(0,0,1);
168         }
169       else
170         {
171           mSquaresActor->SetPosition(0,0,-1);
172         }
173       break;
174     }
175   mSquares->Update();
176 }
177 //------------------------------------------------------------------------------
178