]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/CutModule/kernel/CutModelData.cxx
7396cc2c7104622e5a568fdb32b59e765c1c39ab
[creaMaracasVisu.git] / lib / maracasVisuLib / src / CutModule / kernel / CutModelData.cxx
1 /*=========================================================================
2
3   Program:   wxMaracas
4   Module:    $RCSfile: CutModelData.cxx,v $
5   Language:  C++
6   Date:      $Date: 2009/08/31 08:46:11 $
7   Version:   $Revision: 1.1 $
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 "CutModelData.h"
18
19 /**
20 **      Start of the manager class
21 **/
22 CutModelData::CutModelData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
23         _id = id;
24         _currentshape=0;
25         createBoxWidget(interactor, observer);
26         setTransform(img);
27         createActor();
28         createShapes();
29         ChangeShape(0);
30         checkInvariant();
31
32         
33 }
34 CutModelData::~CutModelData(){
35         checkInvariant();
36         _boxWidgetVolume->Off();
37         _boxWidgetVolume->Delete();     
38         _Mapper->Delete();      
39         _Actor->Delete();       
40         delete _cubefigure;
41         delete _cylinderfigure;
42         delete _spherefigure;
43         currentmatrix->Delete();
44         inversModel->Delete();
45 }
46
47 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
48
49         _boxWidgetVolume = vtkBoxWidget::New();
50         _boxWidgetVolume->SetInteractor( interactor );
51         //_boxWidgetVolume->SetPlaceFactor(2);
52         //_boxWidgetVolume->SetInput( img );    
53         //_boxWidgetVolume->PlaceWidget();
54         _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent              , observer );
55         _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent                 , observer );
56         _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent               , observer );
57         
58         _boxWidgetVolume->HandlesOn ();
59         _boxWidgetVolume->On();
60 }
61 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
62         
63         currentmatrix = vtkTransform::New();
64         modeltransform = vtkTransform::New();
65         inversModel     = vtkTransform::New();    
66
67         vtkMatrix4x4* matrix = vtkMatrix4x4::New();  
68         matrix->Identity();     
69         int *ext = img->GetExtent();
70         double *spc = img->GetSpacing();
71
72         matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
73         matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);       
74         matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);               
75         matrix->SetElement(0,3,(ext[1]-ext[0])/2*spc[0]);
76         matrix->SetElement(1,3,(ext[3]-ext[2])/2*spc[1]);
77         matrix->SetElement(2,3,(ext[5]-ext[4])/2*spc[2]);
78
79         currentmatrix->SetMatrix(matrix);
80         _boxWidgetVolume->SetTransform(currentmatrix);  
81                 
82 }
83 void CutModelData::createActor(){       
84
85         _Mapper = vtkPolyDataMapper::New();     
86         _Actor  = vtkActor::New();
87         _Actor->SetMapper(_Mapper);     
88         _Actor->GetProperty()->SetColor(1, 0, 0);
89         _Actor->GetProperty()->SetOpacity(0.4); 
90         
91 }
92 void CutModelData::udapteActorDirection()throw( CutModelException){
93         checkInvariant();
94         
95         _boxWidgetVolume->GetTransform(currentmatrix);          
96         _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
97 }
98 void CutModelData::createShapes(){
99         _cubefigure = new CutModelFigureCube();
100         _cylinderfigure = new CutModelFigureCylinder();
101         _spherefigure = new CutModelFigureSphere();
102 }
103 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
104         checkInvariant();       
105         _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
106 }
107
108 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
109         checkInvariant();
110         if(check){
111                 _boxWidgetVolume->On();
112         }else{
113                 _boxWidgetVolume->Off();
114         }    
115 }
116
117 void CutModelData::ChangeShape(int selection)throw( CutModelException){
118         checkInvariant();
119         
120         if(selection == 0){
121                 _Mapper->SetInput(_spherefigure->getPolyData());
122         }else if(selection == 1){
123                 _Mapper->SetInput(_cylinderfigure->getPolyData());
124         }else if(selection == 2){
125                 _Mapper->SetInput(_cubefigure->getPolyData());
126         }else{
127                 throw CutModelException("Shape type not found");
128         }
129
130         _currentshape=selection;
131 }
132
133 void CutModelData::checkInvariant()throw( CutModelException){
134         if(_boxWidgetVolume==NULL){
135                 throw CutModelException("Box Widget not created");
136         }
137         if(_Mapper==NULL){
138                 throw CutModelException("Mapper not created");
139         }
140         if(_Actor==NULL){
141                 throw CutModelException("Actor not created");
142         }
143         if(_cubefigure==NULL){
144                 throw CutModelException("Cube not created");
145         }
146         if(_cylinderfigure==NULL){
147                 throw CutModelException("Cylinder not created");
148         }
149         if(_spherefigure==NULL){
150                 throw CutModelException("Sphere not created");
151         }        
152         
153 }
154
155 vtkActor* CutModelData::getActor()throw( CutModelException){
156         checkInvariant();
157         return _Actor;
158 }
159
160 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
161         checkInvariant();               
162         _Actor->GetProperty()->SetColor( r,g,b );       
163 }
164 CutModelFigure* CutModelData::getCurentCuttingModel(){
165     checkInvariant();
166         
167         if(_currentshape == 0){
168                 return _spherefigure;
169         }else if(_currentshape == 1){
170                 return _cylinderfigure;
171         }else if(_currentshape == 2){
172                 return _cubefigure;
173         }else{
174                 throw CutModelException("Shape type not found");
175         }       
176 }
177 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)
178 {
179
180         wxBusyCursor wait;
181
182         CutModelFigure* actualCuttingModel = getCurentCuttingModel();
183
184         actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
185         actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
186
187         bool                    inside;
188         bool                    volInt, volExt;
189         int                             xx,yy,zz;
190         unsigned short* pOrg;   
191         int                             ext[6];
192         double                  spc[3];
193         long int                contAfter = 0;
194         long int                contBefor = 0;
195         
196         double minvalue = range[0]; 
197         double value    = range[1];
198         double maxvalue = range[2]; 
199
200                 
201         copyimage->GetExtent(ext);        
202         
203         for (xx=ext[0];xx<ext[1]; xx++)
204         {
205                 for (yy=ext[2];yy<ext[3]; yy++)
206                 {
207                         for (zz=ext[4];zz<ext[5];zz++)
208                         {
209                                 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
210                                 if (  ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
211                                 {
212                                         pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz); 
213
214                                         //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
215                                         if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
216                                         {       
217                                                 
218                                                 *pOrg=(unsigned short)value;
219                                                 
220                                         }                                       
221                                 } // if inside
222                         } // for zz
223                 } // for yy
224         } // for xx
225         
226 }
227
228 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
229
230         vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
231         vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
232
233         double *spc = copyimage->GetSpacing();
234
235         matrixmodel->Identity();        
236         matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
237         matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
238         matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
239         matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
240         matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
241         matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
242         matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
243         matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
244         matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);            
245         matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
246         matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
247         matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);
248
249
250         modeltransform->Update();
251
252         return modeltransform;
253
254         
255 }
256 vtkTransform* CutModelData::getModelTransformInvers(){
257         inversModel->Identity ();
258         inversModel->Concatenate ( modeltransform );
259         inversModel->Inverse(); 
260         return inversModel;
261 }