]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/CutModule/kernel/CutModelData.cxx
Undo Redo
[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/09/08 08:14:27 $
7   Version:   $Revision: 1.3 $
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         
24         initializeData(id, interactor, observer, img);
25         
26 }
27 CutModelData::CutModelData(){
28
29 }
30 void CutModelData::initializeData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
31         _id = id;
32         _currentshape=0;
33         createBoxWidget(interactor, observer);
34         setTransform(img);
35         createActor();
36         createShapes();
37         ChangeShape(0);
38         checkInvariant();
39 }
40 CutModelData::~CutModelData(){
41         checkInvariant();
42         _boxWidgetVolume->Off();
43         _boxWidgetVolume->Delete();     
44         _Mapper->Delete();      
45         _Actor->Delete();       
46         delete _cubefigure;
47         delete _cylinderfigure;
48         delete _spherefigure;
49         currentmatrix->Delete();
50         inversModel->Delete();
51 }
52 void CutModelData::RefreshViewBox(){
53                 
54 }
55 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
56
57         _boxWidgetVolume = vtkBoxWidget::New();
58         _boxWidgetVolume->SetInteractor( interactor );
59         //_boxWidgetVolume->SetPlaceFactor(1);
60         //_boxWidgetVolume->SetInput( img );    
61         //_boxWidgetVolume->PlaceWidget();
62
63         _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent              , observer );
64         _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent                 , observer );
65         _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent               , observer );
66         
67         _boxWidgetVolume->HandlesOn ();
68         _boxWidgetVolume->On();
69         //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5);       
70         //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5);      
71 }
72 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
73         
74         currentmatrix = vtkTransform::New();
75         modeltransform = vtkTransform::New();
76         inversModel     = vtkTransform::New();    
77
78         vtkMatrix4x4* matrix = vtkMatrix4x4::New();  
79         matrix->Identity();     
80         int *ext = img->GetExtent();
81         double *spc = img->GetSpacing();
82
83         
84         matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
85         matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);       
86         matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
87
88         double orgx = (ext[1]-ext[0])/2*spc[0];
89         double orgy = (ext[3]-ext[2])/2*spc[1];
90         double orgz = (ext[5]-ext[4])/2*spc[2];
91
92         matrix->SetElement(0,3,orgx);
93         matrix->SetElement(1,3,orgy);
94         matrix->SetElement(2,3,orgz);
95
96         
97         currentmatrix->SetMatrix(matrix);
98         _boxWidgetVolume->SetTransform(currentmatrix);  
99                 
100 }
101 void CutModelData::createActor(){       
102
103         _Mapper = vtkPolyDataMapper::New();     
104         _Actor  = vtkActor::New();
105         _Actor->SetMapper(_Mapper);     
106         _Actor->GetProperty()->SetColor(1, 0, 0);
107         _Actor->GetProperty()->SetOpacity(0.5); 
108         
109 }
110 void CutModelData::udapteActorDirection()throw( CutModelException){
111         checkInvariant();
112         
113         _boxWidgetVolume->GetTransform(currentmatrix);          
114         _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
115 }
116 void CutModelData::createShapes(){
117         _cubefigure = new CutModelFigureCube();
118         _cylinderfigure = new CutModelFigureCylinder();
119         _spherefigure = new CutModelFigureSphere();
120 }
121 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
122         checkInvariant();       
123         _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
124 }
125
126 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
127         checkInvariant();
128         if(check){
129                 _boxWidgetVolume->On();
130         }else{
131                 _boxWidgetVolume->Off();
132         }    
133 }
134
135 void CutModelData::ChangeShape(int selection)throw( CutModelException){
136         checkInvariant();
137         
138         if(selection == 0){
139                 _Mapper->SetInput(_spherefigure->getPolyData());
140         }else if(selection == 1){
141                 _Mapper->SetInput(_cylinderfigure->getPolyData());
142         }else if(selection == 2){
143                 _Mapper->SetInput(_cubefigure->getPolyData());
144         }else{
145                 throw CutModelException("Shape type not found");
146         }
147
148         _currentshape=selection;
149 }
150
151 void CutModelData::checkInvariant()throw( CutModelException){
152         if(_boxWidgetVolume==NULL){
153                 throw CutModelException("Box Widget not created");
154         }
155         if(_Mapper==NULL){
156                 throw CutModelException("Mapper not created");
157         }
158         if(_Actor==NULL){
159                 throw CutModelException("Actor not created");
160         }
161         if(_cubefigure==NULL){
162                 throw CutModelException("Cube not created");
163         }
164         if(_cylinderfigure==NULL){
165                 throw CutModelException("Cylinder not created");
166         }
167         if(_spherefigure==NULL){
168                 throw CutModelException("Sphere not created");
169         }        
170         
171 }
172
173 vtkActor* CutModelData::getActor()throw( CutModelException){
174         checkInvariant();
175         return _Actor;
176 }
177
178 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
179         checkInvariant();               
180         _Actor->GetProperty()->SetColor( r,g,b );       
181 }
182 CutModelFigure* CutModelData::getCurentCuttingModel(){
183     checkInvariant();
184         
185         if(_currentshape == 0){
186                 return _spherefigure;
187         }else if(_currentshape == 1){
188                 return _cylinderfigure;
189         }else if(_currentshape == 2){
190                 return _cubefigure;
191         }else{
192                 throw CutModelException("Shape type not found");
193         }       
194 }
195 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
196 {
197
198         wxBusyCursor wait;
199
200         CutModelFigure* actualCuttingModel = getCurentCuttingModel();
201
202         //_boxWidgetVolume->GetTransform(currentmatrix);        
203         actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
204         //actualCuttingModel->SetVtkTransform(currentmatrix);
205         actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
206
207         bool                    inside;
208         bool                    volInt, volExt;
209         int                             xx,yy,zz;
210         unsigned short* pOrg;   
211         int                             ext[6];
212         double                  spc[3];
213         long int                contAfter = 0;
214         long int                contBefor = 0;
215         
216         double minvalue = range[0]; 
217         double value    = range[1];
218         double maxvalue = range[2]; 
219
220                 
221         copyimage->GetExtent(ext);        
222         
223         for (xx=ext[0];xx<ext[1]; xx++)
224         {
225                 for (yy=ext[2];yy<ext[3]; yy++)
226                 {
227                         for (zz=ext[4];zz<ext[5];zz++)
228                         {
229                                 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
230                                 if (  ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
231                                 {
232                                         pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz); 
233
234                                         //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
235                                         if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
236                                         {       
237                                                 
238                                                 *pOrg=(unsigned short)value;
239                                                 
240                                         }                                       
241                                 } // if inside
242                         } // for zz
243                 } // for yy
244         } // for xx
245         
246 }
247
248 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
249 {
250
251         wxBusyCursor wait;
252
253         CutModelFigure* actualCuttingModel = getCurentCuttingModel();
254         
255         actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
256         
257         actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
258
259         bool                    inside;
260         bool                    volInt, volExt;
261         int                             xx,yy,zz;
262         unsigned short* pOrg;   
263         int                             ext[6];
264         double                  spc[3];
265         long int                contAfter = 0;
266         long int                contBefor = 0;  
267         
268         double value;
269         
270
271                 
272         copyimage->GetExtent(ext);        
273         
274         for (xx=ext[0];xx<ext[1]; xx++)
275         {
276                 for (yy=ext[2];yy<ext[3]; yy++)
277                 {
278                         for (zz=ext[4];zz<ext[5];zz++)
279                         {
280                                 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
281                                 if (  ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
282                                 {
283                                         value = *((unsigned short*)image->GetScalarPointer (xx,yy,zz));
284                                         pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz); 
285                                         //std::cout<<"CutModelData::ExecuteUnCut() "<<value<<" "<<*pOrg<<std::endl;
286                                         *pOrg=(unsigned short)value;
287                                 } // if inside
288                         } // for zz
289                 } // for yy
290         } // for xx
291         
292 }
293
294 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
295
296         double *spc = copyimage->GetSpacing();
297         modeltransform->Identity();
298
299     vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
300         vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
301         matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
302         matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
303         matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
304         matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
305         matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
306         matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
307         matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
308         matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
309         matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);            
310         matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
311         matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
312         matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);    
313
314         /*
315         
316         double* pos = currentmatrix->GetPosition();
317         modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);   
318
319         double* scal = currentmatrix->GetScale();       
320         modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
321
322         //double* orient = currentmatrix->GetOrientation();
323         //modeltransform->RotateZ(orient[2]);   
324         //modeltransform->RotateY(orient[1]);   
325         //modeltransform->RotateX(orient[0]);   
326         double* orient = currentmatrix->GetOrientationWXYZ();   
327         modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);    
328         
329         */
330                 
331
332         modeltransform->Update();
333
334         return modeltransform;
335
336         
337 }
338 void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
339                 
340
341         double *spc = img->GetSpacing();
342
343         currentmatrix->Identity();      
344
345         /*double* orient = transform->GetOrientationWXYZ();
346         currentmatrix->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);     
347
348         double* pos = transform->GetPosition();
349         currentmatrix->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
350
351         double* scal = transform->GetScale();   
352         currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
353
354         currentmatrix->Update();        */
355                 
356         _boxWidgetVolume->SetTransform(transform);
357
358     /*vtkMatrix4x4* matrix = transform->GetMatrix();
359         vtkMatrix4x4* matrixcurrent = currentmatrix->GetMatrix();
360         matrixcurrent->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
361         matrixcurrent->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
362         matrixcurrent->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
363         matrixcurrent->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
364         matrixcurrent->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
365         matrixcurrent->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
366         matrixcurrent->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
367         matrixcurrent->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
368         matrixcurrent->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);          
369         matrixcurrent->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
370         matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
371         matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);  */
372
373
374         udapteActorDirection();
375         getModelTransform(img);
376
377 }
378 vtkTransform* CutModelData::getModelTransformInvers(){
379         inversModel->Identity ();
380         inversModel->Concatenate ( modeltransform );
381         inversModel->Inverse(); 
382         return inversModel;
383 }
384
385 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
386         return _Mapper->GetInput();
387 }