]> Creatis software - creaMaracasVisu.git/blob - lib/Kernel/VTKObjects/SurfaceRenderer/wxMaracasSurfaceRenderingManagerDataMhd.cxx
addition of image stencil to surface rendering
[creaMaracasVisu.git] / lib / Kernel / VTKObjects / SurfaceRenderer / wxMaracasSurfaceRenderingManagerDataMhd.cxx
1
2 #include "wxMaracasSurfaceRenderingManagerDataMhd.h"
3
4 #include "vtkStripper.h"
5
6
7 wxMaracasSurfaceRenderingManagerDataMhd::wxMaracasSurfaceRenderingManagerDataMhd(vtkImageData* imagedata, std::string dataname, vtkRenderWindowInteractor*  interactor)
8 : wxMaracasSurfaceRenderingManagerData(NULL, dataname)
9 {
10
11         this->setVtkImageData(imagedata);
12         _dataname = dataname;
13         
14         _maxgreylevel = getMaxLevel(imagedata);
15         _prop3D=NULL;                   
16
17         _tresholdFilter = vtkImageThreshold::New();
18         _tresholdFilter->SetInput(this->_imagedata);
19         _tresholdFilter->SetInValue(255);        
20         _tresholdFilter->SetOutValue(0);
21
22
23         _cubesFilter = vtkMarchingCubes::New(); 
24         _cubesFilter->SetInput(_tresholdFilter->GetOutput());
25         //_cubesFilter->ComputeGradientsOn();
26         _cubesFilter->ComputeScalarsOn();
27         _cubesFilter->ComputeNormalsOn();
28         _cubesFilter->SetNumberOfContours( 1 );
29         _cleanFilter = vtkCleanPolyData::New();         
30         _cleanFilter->SetInput ( _cubesFilter->GetOutput() );
31
32         _smooth = vtkSmoothPolyDataFilter::New();
33         _smooth->SetInput(_cleanFilter->GetOutput());
34         _smooth->SetNumberOfIterations(6);
35         _smooth->SetRelaxationFactor(0.3);
36         //_smooth->FeatureEdgeSmoothingOff();
37
38         _dataMapper = vtkPolyDataMapper::New( );
39         _dataMapper->ScalarVisibilityOff( );
40         _dataMapper->ImmediateModeRenderingOn();
41         vtkActor* dataActor = vtkActor::New();
42
43         //if(_boxWidgetS1){
44         if(interactor){
45             _boxWidgetS1 = vtkBoxWidget::New();
46             _boxWidgetS1->SetInteractor( interactor );
47             _boxWidgetS1->SetPlaceFactor(1.25);
48
49             _boxWidgetS1->SetInput( this->_imagedata );
50             _boxWidgetS1->PlaceWidget();
51             boxSurfaceObserver* observer = boxSurfaceObserver::New();
52
53             vtkStripper* striper = vtkStripper::New();
54             striper->SetInput( _smooth->GetOutput() );
55             //striper->SetInput( _cleanFilter->GetOutput() );
56
57             striper->Update();
58             _boxWidgetS1->SetInput(striper->GetOutput());
59             //_boxWidgetS1->PlaceWidget();
60
61
62             _tissuePlanes  = vtkPlanes::New();
63
64             int x1,x2,y1,y2,z1,z2;
65             this->_imagedata->GetExtent(x1,x2,y1,y2,z1,z2);
66             _tissuePlanes->SetBounds  (x1,x2,y1,y2,z1,z2);
67
68
69
70             _boxWidgetS1->GetPlanes( _tissuePlanes );
71
72             _tissueClipper = vtkClipPolyData::New();
73             _tissueClipper->SetInput( striper->GetOutput() );
74             _tissueClipper->SetClipFunction( _tissuePlanes );
75             _tissueClipper->InsideOutOn( );
76             _dataMapper->SetInput( _tissueClipper->GetOutput() );
77             observer->SetPlanes( _tissuePlanes );
78             observer->SetActor( dataActor );
79             _boxWidgetS1->AddObserver( vtkCommand::InteractionEvent              , observer );
80
81
82             _boxWidgetS1->HandlesOn ();
83             _boxWidgetS1->EnabledOff();
84         }else{          
85                 //_dataMapper->SetInput(_cleanFilter->GetOutput());
86             _dataMapper->SetInput(_smooth->GetOutput());
87         }
88         
89         dataActor->SetMapper(_dataMapper);      
90         float cr=1,cg=0.5,cb=0.5;
91         dataActor->GetProperty()->SetDiffuseColor(1,0.5,0.5   );
92         dataActor->GetProperty()->SetSpecular(.3);
93         dataActor->GetProperty()->SetSpecularPower(20);
94
95         this->_prop3D = dataActor;
96         
97
98         this->changeIsoValue(this->_maxgreylevel);      
99
100
101 }
102
103 void wxMaracasSurfaceRenderingManagerDataMhd::enableBoxWidget(bool enable){
104
105     if(_boxWidgetS1){
106         if(enable){
107             _boxWidgetS1->EnabledOn();
108         }else{
109             _boxWidgetS1->EnabledOff();
110         }
111     }else{
112         cout<<"box widget not initialized!"<<endl;
113     }
114 }
115
116
117 wxMaracasSurfaceRenderingManagerDataMhd::~wxMaracasSurfaceRenderingManagerDataMhd()
118 {
119         _cubesFilter->Delete();
120         _cleanFilter->Delete();
121         _dataMapper->Delete();
122 }
123         
124 void wxMaracasSurfaceRenderingManagerDataMhd::UpdateSurface()
125 {
126         _cubesFilter->Update();    
127         _cleanFilter->Update();
128         _dataMapper->Update();  
129 }
130 /**
131 **      changes the isovalue in a prop3D
132 **/
133 void wxMaracasSurfaceRenderingManagerDataMhd::changeIsoValue(double value){     
134                 
135    
136     _tresholdFilter->ThresholdByLower(value);
137     _tresholdFilter->Update();
138
139     _cubesFilter->SetValue(0,255);
140         _cubesFilter->Update();    
141         _cleanFilter->Update();
142         _dataMapper->Update();  
143         
144         
145         
146 }
147 /**
148 **      changes the isovalue in a prop3D
149 **/
150 void wxMaracasSurfaceRenderingManagerDataMhd::changeIsoValue(double min, double max){
151
152     _tresholdFilter->ThresholdBetween(min, max);
153     _tresholdFilter->Update();
154     _cubesFilter->SetValue(0,255);
155         _cubesFilter->Update();
156         _cleanFilter->Update();
157         _dataMapper->Update();
158
159
160
161 }
162 int wxMaracasSurfaceRenderingManagerDataMhd::getMaxGreyLevel(){
163         return _maxgreylevel;
164 }
165
166 /**
167         ** Get's the max grey level of the image
168         **/
169 int wxMaracasSurfaceRenderingManagerDataMhd::getMaxLevel(vtkImageData* img){
170
171         int ext[6], i, j, k,max=0;
172         img->GetExtent(ext);
173
174         for(i = ext[0]; i < ext[1];i++){
175                 for(j = ext[2]; j < ext[3];j++){
176                         for(k = ext[4]; k < ext[5];k++){
177                 unsigned short* ptr = (unsigned short*)img->GetScalarPointer(i,j,k);
178                                 int temp = (int)*ptr;
179                                 if(temp > max){
180                     max = temp;
181                                 }
182                         }
183                 }
184         }
185         return max;
186
187
188 }
189
190 /**
191 **      Sets the VTK image data
192 **/
193
194 void wxMaracasSurfaceRenderingManagerDataMhd::setVtkImageData(vtkImageData* imagedata){
195         _imagedata = imagedata;
196 }
197
198
199
200