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