]> Creatis software - clitk.git/blob - vv/vvROIActor.cxx
1b3585d1081268eab6eaae4d06ec0fb8b247a3e6
[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 #include "vvROIActor.h"
20 #include "vvImageContour.h"
21 #include "vvSlicerManager.h"
22 #include "vvBinaryImageOverlayActor.h"
23 #include <vtkImageActor.h>
24 #include <vtkCamera.h>
25 #include <vtkRenderer.h>
26 //#include <vtkRenderWindow.h>
27 #include <vtkMarchingSquares.h>
28 #include <vtkImageClip.h>
29 #include <vtkImageData.h>
30 #include <vtkPolyDataMapper.h>
31 #include <vtkProperty.h>
32
33 //------------------------------------------------------------------------------
34 vvROIActor::vvROIActor() {
35   mImageContour.clear();
36   mOverlayActors.clear();
37   mIsVisible = true;
38   mOpacity = 0.7;
39   mIsSelected = false;
40 }
41 //------------------------------------------------------------------------------
42
43
44 //------------------------------------------------------------------------------
45 vvROIActor::~vvROIActor() {
46 }
47 //------------------------------------------------------------------------------
48
49
50 //------------------------------------------------------------------------------
51 void vvROIActor::SetROI(clitk::DicomRT_ROI * s) {
52   mROI = s;
53 }
54 //------------------------------------------------------------------------------
55
56
57 //------------------------------------------------------------------------------
58 void vvROIActor::SetSlicerManager(vvSlicerManager * s) {
59   mSlicerManager = s;
60 }
61 //------------------------------------------------------------------------------
62
63
64 //------------------------------------------------------------------------------
65 void vvROIActor::SetVisible(bool b) {
66   mIsVisible = b;
67   if (!b) { // remove actor
68     for(unsigned int i= 0; i<mOverlayActors.size(); i++) 
69       mOverlayActors[i]->HideActors();
70   }
71   else {
72     for(unsigned int i= 0; i<mOverlayActors.size(); i++) 
73       mOverlayActors[i]->ShowActors();
74   }
75   Update();
76 }
77 //------------------------------------------------------------------------------
78
79
80 //------------------------------------------------------------------------------
81 bool vvROIActor::IsVisible() {
82   return mIsVisible;
83 }
84 //------------------------------------------------------------------------------
85
86
87 //------------------------------------------------------------------------------
88 void vvROIActor::Initialize() {
89   if (mROI->GetImage()) {
90     mImageContour.clear();
91     mOverlayActors.clear();
92     for(int i=0;i<mSlicerManager->NumberOfSlicers(); i++) {
93       mImageContour.push_back(new vvImageContour);
94       mImageContour[i]->setSlicer(mSlicerManager->GetSlicer(i));
95       mImageContour[i]->setImage(mROI->GetImage());
96       //mImageContour[i]->setColor(1.0, 0.0, 0.0);
97       mImageContour[i]->setColor(1.0-mROI->GetDisplayColor()[0], 
98                                  1.0-mROI->GetDisplayColor()[1], 
99                                  1.0-mROI->GetDisplayColor()[2]);
100       mImageContour[i]->setPreserveMemoryModeEnabled(true);
101       mImageContour[i]->setSlicer(mSlicerManager->GetSlicer(i));
102       
103       mOverlayActors.push_back(new vvBinaryImageOverlayActor);
104       mOverlayActors[i]->SetImage(mROI->GetImage(), mROI->GetBackgroundValueLabelImage());
105       mOverlayActors[i]->SetColor(mROI->GetDisplayColor()[0], 
106                                   mROI->GetDisplayColor()[1], 
107                                   mROI->GetDisplayColor()[2]);
108       mOverlayActors[i]->SetOpacity(mOpacity);
109       mOverlayActors[i]->SetSlicer(mSlicerManager->GetSlicer(i));
110       mOverlayActors[i]->Initialize();
111     }
112     
113     connect(mSlicerManager,SIGNAL(UpdateSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
114     //connect(mSlicerManager,SIGNAL(UpdateTSlice(int,int)),this,SLOT(UpdateSlice(int, int)));
115     connect(mSlicerManager, SIGNAL(AVerticalSliderHasChanged(int, int)), SLOT(UpdateSlice(int, int)));
116   }
117 }
118 //------------------------------------------------------------------------------
119
120
121 //------------------------------------------------------------------------------
122 void vvROIActor::Update() {
123   for(int i=0; i<mSlicerManager->NumberOfSlicers(); i++) {
124     UpdateSlice(i, mSlicerManager->GetSlicer(i)->GetSlice());
125   }
126 }
127 //------------------------------------------------------------------------------
128
129
130 //------------------------------------------------------------------------------
131 void vvROIActor::UpdateSlice(int slicer, int slices) {
132   if (!mROI->GetImage())  return;
133   
134   if (!mIsVisible) return;
135
136   if (!mSlicerManager) {
137     std::cerr << "Error. No mSlicerManager ?" << std::endl;
138     exit(0);
139   }
140
141   // CONTOUR HERE 
142   DD("vvROIActor::UpdateSlice");
143   DD(mROI->GetName());
144   DD(mIsSelected);
145   DD(mROI->GetBackgroundValueLabelImage());
146   if (mIsSelected) {
147     mImageContour[slicer]->update(1.0);//mROI->GetBackgroundValueLabelImage()); 
148     //    mImageContour[slicer]->showActors();
149   }
150
151   // Refresh overlays
152   mOverlayActors[slicer]->UpdateSlice(slicer, slices);
153
154   // Do not used the following line : TOO SLOW.
155   // mSlicerManager->GetSlicer(slicer)->GetRenderWindow()->Render(); 
156 }
157 //------------------------------------------------------------------------------
158
159
160 //------------------------------------------------------------------------------
161 // void vvROIActor::UpdateOpacity(double d) {
162 //   if (d == mOpacity) return;
163 //   mOpacity = d; 
164 //   for(unsigned int i=0; i<mOverlayActors.size(); i++) {
165 //     mOverlayActors[i]->SetOpacity(d);
166 //     mOverlayActors[i]->UpdateColor();
167 //   }
168 //   mSlicerManager->Render(); 
169 // }
170 //------------------------------------------------------------------------------
171
172
173 //------------------------------------------------------------------------------
174 void vvROIActor::SetOpacity(double d) {
175   mOpacity = d; 
176 }
177 //------------------------------------------------------------------------------
178
179
180 //------------------------------------------------------------------------------
181 void vvROIActor::UpdateColor() {
182   for(unsigned int i=0; i<mOverlayActors.size(); i++) {
183     mOverlayActors[i]->SetOpacity(mOpacity);
184     mOverlayActors[i]->SetColor(mROI->GetDisplayColor()[0], 
185                                 mROI->GetDisplayColor()[1], 
186                                 mROI->GetDisplayColor()[2]);
187     mOverlayActors[i]->UpdateColor();
188   }
189 }
190 //------------------------------------------------------------------------------
191
192
193 //------------------------------------------------------------------------------
194 double vvROIActor::GetOpacity() {
195   return mOpacity;
196 }
197 //------------------------------------------------------------------------------
198
199
200 //------------------------------------------------------------------------------
201 void vvROIActor::SetSelected(bool b) {
202   mIsSelected = b;
203   if (b) {
204     for(int i=0; i<mSlicerManager->NumberOfSlicers(); i++) {
205       mImageContour[i]->SetLineWidth(3.0);
206       mImageContour[i]->showActors();
207     }
208   }
209   else {
210     for(int i=0; i<mSlicerManager->NumberOfSlicers(); i++) {
211       mImageContour[i]->hideActors();
212     }
213   } 
214 }
215 //------------------------------------------------------------------------------
216