]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracasIRMViewManager.cxx
*** empty log message ***
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / wxMaracasIRMViewManager.cxx
1 /*=========================================================================
2
3   Program:   wxMaracas
4   Module:    $RCSfile: wxMaracasIRMViewManager.cxx,v $
5   Language:  C++
6   Date:      $Date: 2009/04/09 13:58:38 $
7   Version:   $Revision: 1.2 $
8
9   Copyright: (c) 2002, 2003
10   License:
11
12      This software is distributed WITHOUT ANY WARRANTY; without even
13      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14      PURPOSE.  See the above copyright notice for more information.
15
16 =========================================================================*/
17 #include "wxMaracasIRMViewManager.h"
18
19 /**
20 **      Start of the manager class
21 **/
22 wxMaracasIRMViewManager::wxMaracasIRMViewManager(){
23         _renderer = NULL;
24         _idCount=0;
25 }
26 wxMaracasIRMViewManager::~wxMaracasIRMViewManager(){
27 }
28
29 /**
30 **      Sets the renderer to manage the prop3D from the view
31 **/
32 void wxMaracasIRMViewManager::setRenderer(vtkRenderer*  renderer){
33         _renderer = renderer;
34 }
35 /**
36 **      Adds a prop3D to the manager and returns the identifier
37 **/
38 int wxMaracasIRMViewManager::addProp3D(vtkProp3D* prop3D, std::string dataname)  throw(...){
39         checkInvariant();
40         if(prop3D != NULL){
41                 wxMaracasIRMViewManagerData* data = new wxMaracasIRMViewManagerData(prop3D, dataname);
42                 prop3Dvect.push_back(data);             
43                 _renderer->AddActor(data->getProp3D());
44                 data->setId(_idCount);
45                 _idCount++;
46                 return data->getId();
47         }else{
48                 throw "Check vtkProp3D file or input";
49         }
50         return -1;
51 }
52 int wxMaracasIRMViewManager::addPropMHD(vtkImageData* imagedata, std::string dataname){
53
54         checkInvariant();
55         if(imagedata != NULL){
56                 wxMaracasIRMViewManagerData* data = new wxMaracasIRMViewManagerData(imagedata, dataname);
57                 prop3Dvect.push_back(data);             
58                 _renderer->AddActor(data->getProp3D());
59                 data->setId(_idCount);
60                 _idCount++;
61                 return data->getId();
62         }else{
63                 throw "Check ImageData file or input";
64         }
65         return -1;
66
67 }
68 /**
69 **      adds or removes an actor depending of the bool value
70 **/
71 void wxMaracasIRMViewManager::addRemoveActor(int propid, bool addremove)  throw(...){
72         checkInvariant();
73         
74         wxMaracasIRMViewManagerData* data = this->getViewData(propid);          
75         if(data->getProp3D()!=NULL){
76                 if(addremove){
77                         _renderer->AddViewProp(data->getProp3D());
78                 }else{
79                         _renderer->RemoveViewProp(data->getProp3D());
80                 }
81                 _renderer->Render();
82         }
83         
84 }
85 /**
86 **      Changes the opacity in a prop3D
87 **/
88 void wxMaracasIRMViewManager::changeOpacity(int propid, int value)  throw(...){
89         checkInvariant();       
90
91
92         this->getViewData(propid)->changeOpacity(value);
93         
94         _renderer->Render();
95
96 }
97
98 /**
99 **      changes the isovalue in a prop3D
100 **/
101 void wxMaracasIRMViewManager::changeIsoValue(int propid, int value )throw (...){
102         checkInvariant();       
103
104         wxMaracasIRMViewManagerData* data = this->getViewData(propid);          
105
106         _renderer->RemoveViewProp(data->getProp3D());
107         data->changeIsoValue(value);
108         _renderer->AddViewProp(data->getProp3D());
109
110         _renderer->Render();
111 }
112
113 vtkProp3D* wxMaracasIRMViewManager:: getProp3D(std::string filename){
114         if(filename.compare("")!= 0){
115                 vtkSTLReader *STLReader=vtkSTLReader::New();
116                 STLReader->SetFileName(filename.c_str());
117                 STLReader->Update();
118                 vtkPolyDataMapper* dataMapper = vtkPolyDataMapper::New();
119                 dataMapper->SetInput(STLReader->GetOutput());
120                 
121                 vtkActor* dataActor = vtkActor::New();
122                 dataActor->SetMapper(dataMapper);       
123                 dataActor->GetProperty()->SetOpacity(1);
124                 
125                 return dataActor;
126         }       
127         return NULL;
128 }
129
130 vtkImageData* wxMaracasIRMViewManager::getImageData(std::string filename){
131         if(filename.compare("")!= 0){   
132                 
133                 
134                 vtkMetaImageReader* reader =  vtkMetaImageReader::New();        
135                 reader->SetFileName(filename.c_str());
136                 reader->Update();
137                 vtkImageData* img = reader->GetOutput();
138                 //reader->Delete();
139                 return img;
140         }       
141         return NULL;
142 }
143
144 void wxMaracasIRMViewManager::checkInvariant()  throw(...){
145         if(this->_renderer==NULL){
146                 throw "Renderer not set";
147         }
148 }
149
150 wxMaracasIRMViewManagerData* wxMaracasIRMViewManager::getViewData(int id) throw(...){
151     int i;
152         for(i = 0; i < prop3Dvect.size();i++){
153                 if(prop3Dvect[i]->getId() == id){
154                         return prop3Dvect[i];
155                 }
156         }
157         throw "id not found in the data";
158
159         return NULL;
160 }
161
162 int wxMaracasIRMViewManager::getMaxIsoValue(int propid){
163         
164         return this->getViewData(propid)->getMaxGreyLevel();
165
166 }
167
168 void wxMaracasIRMViewManager::changeColor(int propid, double red, double green, double blue) throw (...){
169         checkInvariant();       
170         this->getViewData(propid)->changeColor(red, green, blue);
171
172 }
173
174 /********************************************************************************************
175 ** Start of data viewmanagerData
176 *********************************************************************************************/
177
178 wxMaracasIRMViewManagerData::wxMaracasIRMViewManagerData(vtkProp3D* prop3Dvect, std::string dataname){
179
180         _prop3D = prop3Dvect;
181         _dataname = dataname;
182         _maxgreylevel=-1;
183 }
184 wxMaracasIRMViewManagerData::wxMaracasIRMViewManagerData(vtkImageData* imagedata, std::string dataname){
185
186         this->setVtkImageData(imagedata);
187         _dataname = dataname;
188         
189         _maxgreylevel = getMaxLevel(imagedata);
190         _prop3D=NULL;                   
191
192         this->changeIsoValue(this->_maxgreylevel);
193 }
194 /**
195 **      changes the isovalue in a prop3D
196 **/
197 void wxMaracasIRMViewManagerData::changeIsoValue(int value){    
198         
199
200         if(_prop3D!=NULL){
201                 _prop3D->Delete();
202                 _polydata->Delete();
203                 _dataMapper->Delete();
204         }
205
206         vtkMarchingCubes *cubesFilter = vtkMarchingCubes::New();
207     cubesFilter->SetInput(this->_imagedata);
208     cubesFilter->SetValue(0,value);
209         cubesFilter->ComputeGradientsOn ();
210     cubesFilter->ComputeScalarsOn ();
211         cubesFilter->SetNumberOfContours( 1 );
212         
213         // Unir puntos duplicados y remover primitivas degeneradas
214         vtkCleanPolyData *cleanFilter = vtkCleanPolyData::New();
215     cleanFilter->SetInput ( cubesFilter->GetOutput() );
216         cleanFilter->Update();
217
218         _polydata = vtkPolyData::New();
219         _polydata->DeepCopy(cleanFilter->GetOutput());
220
221         cubesFilter->Delete();
222         cleanFilter->Delete();
223
224
225         _dataMapper = vtkPolyDataMapper::New();
226         _dataMapper->SetInput(_polydata);
227
228         vtkActor* dataActor = vtkActor::New();
229         dataActor->SetMapper(_dataMapper);      
230         _prop3D = dataActor;    
231         
232         
233 }
234 int wxMaracasIRMViewManagerData::getMaxGreyLevel(){
235         return _maxgreylevel;
236 }
237 wxMaracasIRMViewManagerData::~wxMaracasIRMViewManagerData(){
238 }
239 /**
240 **      Adds a prop3D to the world of the application
241 **/
242 /**
243         ** Get's the max grey level of the image
244         **/
245 int wxMaracasIRMViewManagerData::getMaxLevel(vtkImageData* img){
246
247         int ext[6], i, j, k,max=0;
248         img->GetExtent(ext);
249
250         for(i = ext[0]; i < ext[1];i++){
251                 for(j = ext[2]; j < ext[3];j++){
252                         for(k = ext[4]; k < ext[5];k++){
253                 unsigned short* ptr = (unsigned short*)img->GetScalarPointer(i,j,k);
254                                 int temp = (int)*ptr;
255                                 if(temp > max){
256                     max = temp;
257                                 }
258                         }
259                 }
260         }
261         return max;
262
263
264 }
265 void wxMaracasIRMViewManagerData::setVtkImageData(vtkImageData* imagedata){
266         _imagedata = imagedata;
267 }
268 /**
269 **      Adds a prop3D to the world of the application
270 **/
271 void wxMaracasIRMViewManagerData::setProp3D(vtkProp3D* prop3D){
272         _prop3D = prop3D;
273 }
274 /**
275 **      Changes the opacity in a prop3D
276 **/
277 void wxMaracasIRMViewManagerData::changeOpacity(int value){
278         vtkActor* actor = (vtkActor*)_prop3D;
279         actor->GetProperty()->SetOpacity((double)value/100.0);
280 }
281
282 /**
283 **      Check if the variables are setted correctly
284 **/
285 void wxMaracasIRMViewManagerData::checkInvariant(){
286
287 }
288 /**
289 **      get the prop3D 
290 **/
291 vtkProp3D* wxMaracasIRMViewManagerData::getProp3D(){
292         return _prop3D;
293 }
294 /**
295 **      return the id from the daat
296 **/
297 int wxMaracasIRMViewManagerData::getId(){
298         return _id;
299 }
300 /**
301 **      set data id
302 **/
303 void wxMaracasIRMViewManagerData::setId(int propid){
304         _id = propid;
305 }
306
307 /**
308 **      Get the filanme
309 **/
310 std::string wxMaracasIRMViewManagerData::getDataname(){
311         return _dataname;
312 }
313 /**
314 ** Set the filanme
315 **/
316 void wxMaracasIRMViewManagerData::setDataname(std::string dataname){
317         _dataname = dataname;
318 }
319
320 void wxMaracasIRMViewManagerData::changeColor(double red, double green, double blue){
321     vtkActor* actor = (vtkActor*)_prop3D;       
322         actor->GetProperty()->SetColor(red,green,blue);
323 }