]> Creatis software - creaMaracasVisu.git/blob - lib/Kernel/VTKObjects/VolumeRenderer/volumerenderermanager.cxx
no message
[creaMaracasVisu.git] / lib / Kernel / VTKObjects / VolumeRenderer / volumerenderermanager.cxx
1 #include "volumerenderermanager.h"
2
3 /*=========================================================================
4
5   Program:   wxMaracas
6   Module:    $RCSfile: volumerenderermanager.cxx,v $
7   Language:  C++
8   Date:      $Date: 2011/05/31 19:03:03 $
9   Version:   $Revision: 1.1 $
10
11   Copyright: (c) 2002, 2003
12   License:
13
14      This software is distributed WITHOUT ANY WARRANTY; without even
15      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16      PURPOSE.  See the above copyright notice for more information.
17
18 =========================================================================*/
19
20 #include <vtkMetaImageReader.h>
21 #include <vtkImageCast.h>
22 /**
23 **      Start of the manager class
24 **/
25 VolumeRendererManager::VolumeRendererManager(){
26         _renderer = NULL;
27         _idCount=0;
28 }
29 VolumeRendererManager::~VolumeRendererManager(){
30 }
31
32 /**
33 **      Sets the renderer to manage the prop3D from the view
34 **/
35 void VolumeRendererManager::setRenderer(vtkRenderer*  renderer){
36         _renderer = renderer;
37 }
38
39 /**
40 ** Gets the renderer which manage the prop3D from the view
41 **/
42 vtkRenderer* VolumeRendererManager::getRenderer(){
43         return _renderer;
44 }
45
46 /**
47 ** Updates Volume
48 **/
49 void VolumeRendererManager::Update(int ppid){
50         VolumeRendererManagerData* data = this->getViewData(ppid);
51         data->Update();
52         _renderer->Render();
53 }
54
55 /**
56 **      Adds a prop3D to the manager and returns the identifier
57 **/
58 int VolumeRendererManager::addVolume(int idTP, vtkImageData* vol, std::string dataname) throw(char*){
59         checkInvariant();
60         image = vol;
61         if(vol != NULL){
62                 VolumeRendererManagerData* data = new VolumeRendererManagerData(vol, dataname);
63                 prop3Dvect.push_back(data);
64                 _renderer->AddActor(data->getProp3D());
65                 if(idTP == -1)
66                 {
67                         data->setId(_idCount);
68                         _idCount++;
69                 }
70                 else
71                 {
72                         data->setId(idTP);
73                 }
74                 printf("VolumeRendererManager::addVolume->idVolumeRenderer: %i\n", data->getId());
75                 return data->getId();
76         }else{
77                 throw "Check mhd imagefile file or input";
78         }
79         return -1;
80 }
81 /**
82 **      adds or removes an actor depending of the bool value
83 **/
84
85 void VolumeRendererManager::addRemoveActor(int propid, bool addremove)  throw(char*){
86         checkInvariant();
87
88         VolumeRendererManagerData* data = this->getViewData(propid);
89         if(data->getProp3D()!=NULL){
90                 if(addremove){
91                         _renderer->AddViewProp(data->getProp3D());
92                 }else{
93                         _renderer->RemoveViewProp(data->getProp3D());
94                 }
95                 _renderer->Render();
96         }
97
98 }
99 /**
100 **      Changes the opacity in a prop3D
101 **/
102 void VolumeRendererManager::setVolumeOpacity(int propid, std::vector<double> greylevel,std::vector<double> value)  throw(char*){
103         checkInvariant();
104
105         this->getViewData(propid)->setVolumeOpacity(greylevel, value);
106
107         _renderer->Render();
108
109 }
110
111 /**
112 **      Set Volume Color
113 **/
114 void VolumeRendererManager::setVolumeColor(int volid, std::vector<double> greylevel,
115                                                                 std::vector<double> red,
116                                                                 std::vector<double> green,
117                                                                 std::vector<double> blue)throw(char*){
118         checkInvariant();
119
120         this->getViewData(volid)->setVolumeColor(greylevel, red, green, blue);
121
122         _renderer->Render();
123 }
124
125 vtkImageData* VolumeRendererManager::getImageData(std::string filename){
126         if(filename.compare("")!= 0){
127
128                 vtkMetaImageReader* reader =  vtkMetaImageReader::New();
129                 reader->SetFileName(filename.c_str());
130                 reader->Update();
131                 vtkImageData* img = reader->GetOutput();
132
133                 vtkImageCast* cast = vtkImageCast::New();
134                 cast->SetInput(img);
135                 cast->SetOutputScalarTypeToUnsignedShort();
136                 cast->Update();
137                 //reader->Delete();
138                 //img->Delete();
139                 return cast->GetOutput();
140                 //return img;
141         }
142         return NULL;
143 }
144
145 vtkImageData* VolumeRendererManager::getImageData(){
146         return image;
147 }
148
149 void VolumeRendererManager::checkInvariant()  throw(char*){
150         if(this->_renderer==NULL){
151                 throw "Renderer not set";
152         }
153 }
154
155 VolumeRendererManagerData* VolumeRendererManager::getViewData(int id) throw(char*){
156     int i;
157         for(i = 0; i < (int)(prop3Dvect.size());i++){
158                 if(prop3Dvect[i]->getId() == id){
159                         return prop3Dvect[i];
160                 }
161         }
162         throw "id not found in the data";
163
164         return NULL;
165 }
166
167 void VolumeRendererManager::deleteActor(int propid) throw (char *){
168         checkInvariant();
169
170         this->addRemoveActor(propid, false);
171
172         int i,n;
173         bool exit = false;
174         for(i = 0; i < (int)(prop3Dvect.size())&&!exit;i++){
175                 if(prop3Dvect[i]->getId() == propid){
176                         n=i;
177                         exit = true;
178                 }
179         }
180         if(exit){
181                 VolumeRendererManagerData* data = prop3Dvect[n];
182                 int j;
183                 for(j = i; j < (int)(prop3Dvect.size())-1;j++){
184                         prop3Dvect[j] = prop3Dvect[j+1];
185                 }
186                 delete data;
187                 prop3Dvect.pop_back();
188         }else{
189                 throw "id not found in the data";
190         }
191
192 }
193
194 vtkPiecewiseFunction* VolumeRendererManager::GetTransferFunction(int volumeid){
195         return getViewData(volumeid)->GetTransferFunction();
196 }
197 vtkColorTransferFunction* VolumeRendererManager::GetColorFunction(int volumeid){
198
199         return getViewData(volumeid)->GetColorFunction();
200 }
201
202 void VolumeRendererManager::changeCompositeMIPFunction(int id, int function) throw (char *){
203         getViewData(id)->changeCompositeMIPFunction(function);
204 }