]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracasSurfaceRenderingManager.cxx
e2b114716094e351d1d1b6fb8412327c860d3a8c
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / wxMaracasSurfaceRenderingManager.cxx
1 /*=========================================================================
2
3   Program:   wxMaracas
4   Module:    $RCSfile: wxMaracasSurfaceRenderingManager.cxx,v $
5   Language:  C++
6   Date:      $Date: 2009/11/13 09:34:10 $
7   Version:   $Revision: 1.4 $
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 "wxMaracasSurfaceRenderingManager.h"
18 #include "wxMaracasSurfaceRenderingManagerDataMhd.h"
19
20 /**
21 **      Start of the manager class
22 **/
23 wxMaracasSurfaceRenderingManager::wxMaracasSurfaceRenderingManager(){
24         _renderer = NULL;
25         _idCount=0;
26 }
27 wxMaracasSurfaceRenderingManager::~wxMaracasSurfaceRenderingManager(){
28 }
29
30 /**
31 **      Sets the renderer to manage the prop3D from the surface render
32 **/
33 void wxMaracasSurfaceRenderingManager::setRenderer(vtkRenderer*  renderer){
34         _renderer = renderer;
35 }
36
37 /**
38 ** Gets the renderer to manage the prop3D from the surface render
39 **/
40 vtkRenderer* wxMaracasSurfaceRenderingManager::getRenderer(){
41         return _renderer;
42 }
43
44 /**
45 ** Updates volume
46 **/
47 void wxMaracasSurfaceRenderingManager::Update(int pid)throw(char*){
48         wxMaracasSurfaceRenderingManagerData* data = this->getViewData(pid);    
49         ((wxMaracasSurfaceRenderingManagerDataMhd*)data)->UpdateSurface();
50         _renderer->Render();
51 }
52
53 /**
54 **      Adds a prop3D to the manager and returns the identifier
55 **/
56 int wxMaracasSurfaceRenderingManager::addProp3D(vtkProp3D* prop3D, std::string dataname)  throw(char*){
57         checkInvariant();
58         if(prop3D != NULL){
59                 wxMaracasSurfaceRenderingManagerData* data = new wxMaracasSurfaceRenderingManagerData(prop3D, dataname);
60                 prop3Dvect.push_back(data);
61                 _renderer->AddActor(data->getProp3D());
62                 data->setId(_idCount);
63                 _idCount++;
64                 return data->getId();
65         }else{
66                 throw "Check vtkProp3D file or input";
67         }
68         return -1;
69 }
70 int wxMaracasSurfaceRenderingManager::addPropMHD(vtkImageData* imagedata, std::string dataname) throw(char*){
71         checkInvariant();
72         if(imagedata != NULL){
73                 image = imagedata;
74                 wxMaracasSurfaceRenderingManagerData* data = new wxMaracasSurfaceRenderingManagerDataMhd(imagedata, dataname);
75                 prop3Dvect.push_back(data);     
76                 _renderer->AddActor(data->getProp3D());
77                 data->setId(_idCount);
78                 _idCount++;
79                 return data->getId();
80         }else{
81                 throw "Check ImageData file or input";
82         }
83         return -1;
84
85 }
86 /**
87 **      adds or removes an actor depending of the bool value
88 **/
89 void wxMaracasSurfaceRenderingManager::addRemoveActor(int propid, bool addremove)  throw(char*){
90         checkInvariant();
91         
92         wxMaracasSurfaceRenderingManagerData* data = this->getViewData(propid);         
93         if(data->getProp3D()!=NULL){
94                 if(addremove){
95                         _renderer->AddViewProp(data->getProp3D());
96                 }else{
97                         _renderer->RemoveViewProp(data->getProp3D());
98                 }
99                 _renderer->Render();
100         }
101 }
102 /**
103 **      Changes the opacity in a prop3D
104 **/
105 void wxMaracasSurfaceRenderingManager::changeOpacity(int propid, int value)  throw(char*){
106         checkInvariant();       
107
108
109         this->getViewData(propid)->changeOpacity(value);
110         
111         _renderer->Render();
112
113 }
114
115 /**
116 **      changes the isovalue in a prop3D
117 **/
118 void wxMaracasSurfaceRenderingManager::changeIsoValue(int propid, double value )throw(char*){
119         checkInvariant();       
120
121         wxMaracasSurfaceRenderingManagerData* data = this->getViewData(propid);         
122
123         //_renderer->RemoveActor(data->getProp3D());
124         ((wxMaracasSurfaceRenderingManagerDataMhd*)data)->changeIsoValue(value);
125         //_renderer->AddActor(data->getProp3D());
126
127         _renderer->Render();
128 }
129
130 vtkProp3D* wxMaracasSurfaceRenderingManager:: getProp3D(std::string filename){
131         if(filename.compare("")!= 0){
132                 vtkSTLReader *STLReader=vtkSTLReader::New();
133                 STLReader->SetFileName(filename.c_str());
134                 STLReader->Update();
135                 vtkPolyDataMapper* dataMapper = vtkPolyDataMapper::New();
136                 dataMapper->SetInput(STLReader->GetOutput());
137                 
138                 vtkActor* dataActor = vtkActor::New();
139                 dataActor->SetMapper(dataMapper);       
140                 dataActor->GetProperty()->SetOpacity(1);
141                 
142                 return dataActor;
143         }       
144         return NULL;
145 }
146
147 vtkImageData* wxMaracasSurfaceRenderingManager::getImageData(std::string filename){
148         if(filename.compare("")!= 0){   
149                 
150                 vtkMetaImageReader* reader =  vtkMetaImageReader::New();        
151                 reader->SetFileName(filename.c_str());
152                 reader->Update();
153                 vtkImageData* img = reader->GetOutput();
154                 //reader->Delete();
155                 return img;
156         }       
157         return NULL;
158 }
159
160 vtkImageData* wxMaracasSurfaceRenderingManager::getImageData(){
161         return image;
162 }
163
164 void wxMaracasSurfaceRenderingManager::checkInvariant()  throw(char*){
165         if(this->_renderer==NULL){
166                 throw "Renderer not set";
167         }
168 }
169
170 wxMaracasSurfaceRenderingManagerData* wxMaracasSurfaceRenderingManager::getViewData(int id) throw(char*){
171     int i;
172         for(i = 0; i < (int)(prop3Dvect.size());i++){
173                 if(prop3Dvect[i]->getId() == id){
174                         return prop3Dvect[i];
175                 }
176         }
177         throw "id not found in the data";
178
179         return NULL;
180 }
181
182 int wxMaracasSurfaceRenderingManager::getMaxIsoValue(int propid) throw(char*){
183         
184         return ((wxMaracasSurfaceRenderingManagerDataMhd*)this->getViewData(propid))->getMaxGreyLevel();
185
186 }
187
188 void wxMaracasSurfaceRenderingManager::changeColor(int propid, double red, double green, double blue) throw(char*){
189         checkInvariant();       
190         this->getViewData(propid)->changeColor(red, green, blue);
191
192         _renderer->Render();
193 }
194
195 void wxMaracasSurfaceRenderingManager::deleteActor(int propid) throw (char *){
196         checkInvariant();       
197
198         this->addRemoveActor(propid, false);
199
200         int i,n;
201         bool exit = false;
202         for(i = 0; i < (int)(prop3Dvect.size())&&!exit;i++){
203                 if(prop3Dvect[i]->getId() == propid){                   
204                         n=i;
205                         exit = true;
206                 }
207         }
208         if(exit){
209                 wxMaracasSurfaceRenderingManagerData* data = prop3Dvect[n];                     
210                 int j;
211                 for(j = i; j < (int)(prop3Dvect.size())-1;j++){
212                         prop3Dvect[j] = prop3Dvect[j+1];
213                 }               
214                 delete data;
215                 prop3Dvect.pop_back();
216         }else{
217
218                 throw "id not found in the data";
219         }   
220 }
221
222 void wxMaracasSurfaceRenderingManager::Transform(vtkMatrix4x4* tmatrix){
223         
224 }
225