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