]> Creatis software - clitk.git/blob - vv/vvROIActor.cxx
- now work in 3D with
[clitk.git] / vv / vvROIActor.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 // vv
20 #include "vvROIActor.h"
21 #include "vvImageContour.h"
22 #include "vvSlicerManager.h"
23 #include "vvBinaryImageOverlayActor.h"
24
25 // vtk
26 #include <vtkImageActor.h>
27 #include <vtkCamera.h>
28 #include <vtkRenderer.h>
29 #include <vtkMarchingSquares.h>
30 #include <vtkImageClip.h>
31 #include <vtkImageData.h>
32 #include <vtkPolyDataMapper.h>
33 #include <vtkProperty.h>
34
35 //------------------------------------------------------------------------------
36 vvROIActor::vvROIActor()
37 {
38   mImageContour.clear();
39   mOverlayActors.clear();
40   mIsVisible = true;
41   mIsContourVisible = false;
42   mOpacity = 0.7;
43   mIsSelected = false;
44   mContourWidth = 1;
45   mContourColor.resize(3);
46 }
47 //------------------------------------------------------------------------------
48
49
50 //------------------------------------------------------------------------------
51 vvROIActor::~vvROIActor()
52 {
53 }
54 //------------------------------------------------------------------------------
55
56
57 //------------------------------------------------------------------------------
58 void vvROIActor::SetROI(clitk::DicomRT_ROI * s)
59 {
60   mROI = s;
61 }
62 //------------------------------------------------------------------------------
63
64
65 //------------------------------------------------------------------------------
66 void vvROIActor::SetContourWidth(int n) {
67   mContourWidth = n;
68 }
69 //------------------------------------------------------------------------------
70
71
72 //------------------------------------------------------------------------------
73 void vvROIActor::SetSlicerManager(vvSlicerManager * s) {
74   mSlicerManager = s;
75 }
76 //------------------------------------------------------------------------------
77
78
79 //------------------------------------------------------------------------------
80 void vvROIActor::UpdateImage()
81 {
82   for(unsigned int i= 0; i<mOverlayActors.size(); i++) {
83     mOverlayActors[i]->HideActors();
84     delete mOverlayActors[i];
85   }
86   for(unsigned int i= 0; i<mImageContour.size(); i++) {
87     mImageContour[i]->HideActors();
88     delete mImageContour[i];
89   }
90   Initialize();
91   Update(); // No Render
92 }
93 //------------------------------------------------------------------------------
94
95
96 //------------------------------------------------------------------------------
97 void vvROIActor::SetVisible(bool b)
98 {
99   mIsVisible = b;
100   if (!b) { // remove actor
101     for(unsigned int i= 0; i<mOverlayActors.size(); i++)
102       mOverlayActors[i]->HideActors();
103   } else {
104     for(unsigned int i= 0; i<mOverlayActors.size(); i++)
105       mOverlayActors[i]->ShowActors();
106   }
107   Update(); // No Render
108 }
109 //------------------------------------------------------------------------------
110
111
112 //------------------------------------------------------------------------------
113 void vvROIActor::SetContourVisible(bool b) {
114   mIsContourVisible = b;
115   if (!b) { // remove actor
116     for(unsigned int i= 0; i<mImageContour.size(); i++) {
117       mImageContour[i]->HideActors();
118     }
119   }
120   else {
121     for(unsigned int i= 0; i<mImageContour.size(); i++) {
122       mImageContour[i]->ShowActors();
123     }
124   }
125   Update(); // No Render
126 }
127 //------------------------------------------------------------------------------
128
129
130 //------------------------------------------------------------------------------
131 bool vvROIActor::IsVisible() {
132   return mIsVisible;
133 }
134 //------------------------------------------------------------------------------
135
136
137 //------------------------------------------------------------------------------
138 bool vvROIActor::IsContourVisible() {
139   return mIsContourVisible;
140 }
141 //------------------------------------------------------------------------------
142
143
144 //------------------------------------------------------------------------------
145 void vvROIActor::Initialize() {
146   if (mROI->GetImage()) {
147     mImageContour.clear();
148     mOverlayActors.clear();
149     for(int i=0; i<mSlicerManager->NumberOfSlicers(); i++) {
150       mImageContour.push_back(new vvImageContour);
151       mImageContour[i]->SetSlicer(mSlicerManager->GetSlicer(i));
152       mImageContour[i]->SetImage(mROI->GetImage());
153       mContourColor[0] = mROI->GetDisplayColor()[0];
154       mContourColor[1] = mROI->GetDisplayColor()[1];
155       mContourColor[2] = mROI->GetDisplayColor()[2];
156       mImageContour[i]->SetColor(mContourColor[0], mContourColor[1], mContourColor[2]);
157       mImageContour[i]->SetLineWidth(mContourWidth);
158       mImageContour[i]->SetPreserveMemoryModeEnabled(true);
159       mImageContour[i]->SetSlicer(mSlicerManager->GetSlicer(i));
160       mImageContour[i]->HideActors();
161       
162       mOverlayActors.push_back(new vvBinaryImageOverlayActor);
163       mOverlayActors[i]->SetImage(mROI->GetImage(), mROI->GetBackgroundValueLabelImage());
164       mOverlayActors[i]->SetColor(mROI->GetDisplayColor()[0],
165                                   mROI->GetDisplayColor()[1],
166                                   mROI->GetDisplayColor()[2]);
167       mOverlayActors[i]->SetOpacity(mOpacity);
168       mOverlayActors[i]->SetSlicer(mSlicerManager->GetSlicer(i));
169       mOverlayActors[i]->Initialize();
170     }
171
172     connect(mSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
173     //connect(mSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
174     connect(mSlicerManager, SIGNAL(AVerticalSliderHasChanged(int, int)), SLOT(UpdateSlice(int, int)));
175   }
176 }
177 //------------------------------------------------------------------------------
178
179
180 //------------------------------------------------------------------------------
181 void vvROIActor::Update()
182 {
183   for(int i=0; i<mSlicerManager->NumberOfSlicers(); i++) {
184     UpdateSlice(i, mSlicerManager->GetSlicer(i)->GetSlice());
185   }
186 }
187 //------------------------------------------------------------------------------
188
189
190 //------------------------------------------------------------------------------
191 void vvROIActor::UpdateSlice(int slicer, int slices)
192 {
193   if (!mROI->GetImage())  return;
194   if ((!mIsVisible) && (!mIsContourVisible)) return; 
195   if (!mSlicerManager) {
196     std::cerr << "Error. No mSlicerManager ?" << std::endl;
197     exit(0);
198   }
199
200   if (mIsContourVisible) {
201     mImageContour[slicer]->Update(mROI->GetBackgroundValueLabelImage()+1); 
202   }
203
204   // Refresh overlays
205   mOverlayActors[slicer]->UpdateSlice(slicer, slices);
206 }
207 //------------------------------------------------------------------------------
208
209
210 //------------------------------------------------------------------------------
211 void vvROIActor::SetOpacity(double d)
212 {
213   mOpacity = d;
214 }
215 //------------------------------------------------------------------------------
216
217
218 //------------------------------------------------------------------------------
219 void vvROIActor::SetContourColor(double r, double v, double b) {
220   mContourColor[0] = r;
221   mContourColor[1] = v;
222   mContourColor[2] = b;  
223 }
224 //------------------------------------------------------------------------------
225
226
227 //------------------------------------------------------------------------------
228 std::vector<double> & vvROIActor::GetContourColor() { 
229   return mContourColor; 
230 }
231 //------------------------------------------------------------------------------
232
233
234 //------------------------------------------------------------------------------
235 void vvROIActor::UpdateColor() {
236   for(unsigned int i=0; i<mOverlayActors.size(); i++) {
237     mOverlayActors[i]->SetOpacity(mOpacity);
238     mOverlayActors[i]->SetColor(mROI->GetDisplayColor()[0],
239                                 mROI->GetDisplayColor()[1],
240                                 mROI->GetDisplayColor()[2]);
241     mOverlayActors[i]->UpdateColor();
242   }
243   for(unsigned int i=0; i<mImageContour.size(); i++) {
244     mImageContour[i]->SetLineWidth(mContourWidth);
245     mImageContour[i]->SetColor(mContourColor[0], mContourColor[1], mContourColor[2]);
246     if (mIsContourVisible)
247       mImageContour[i]->Update(mROI->GetBackgroundValueLabelImage()+1);
248   }
249 }
250 //------------------------------------------------------------------------------
251
252
253 //------------------------------------------------------------------------------
254 double vvROIActor::GetOpacity()
255 {
256   return mOpacity;
257 }
258 //------------------------------------------------------------------------------
259
260
261 //------------------------------------------------------------------------------
262 void vvROIActor::SetSelected(bool b)
263 {
264   DD(" Not used yet");
265   mIsSelected = b;
266   if (b) {
267     for(int i=0; i<mSlicerManager->NumberOfSlicers(); i++) {
268       mImageContour[i]->SetLineWidth(3.0);
269       mImageContour[i]->ShowActors();
270     }
271   } else {
272     for(int i=0; i<mSlicerManager->NumberOfSlicers(); i++) {
273       mImageContour[i]->HideActors();
274     }
275   }
276 }
277 //------------------------------------------------------------------------------
278