]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/CutModule/kernel/CutModelData.cxx
9a62a583235aa08da593eca51199409b2a7e60e5
[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: 2010/09/29 21:21:05 $
7   Version:   $Revision: 1.7 $
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         int *ext = img->GetExtent();
87         double *spc = img->GetSpacing();
88
89         matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
90         matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);       
91         matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
92
93         double orgx = (ext[1]-ext[0])/2*spc[0];
94         double orgy = (ext[3]-ext[2])/2*spc[1];
95         double orgz = (ext[5]-ext[4])/2*spc[2];
96
97         matrix->SetElement(0,3,orgx);
98         matrix->SetElement(1,3,orgy);
99         matrix->SetElement(2,3,orgz);
100
101         currentmatrix->SetMatrix(matrix);
102         _boxWidgetVolume->SetTransform(currentmatrix);                  
103 }
104
105 void CutModelData::createActor(){       
106
107         _Mapper = vtkPolyDataMapper::New();     
108         _Actor  = vtkActor::New();
109         _Actor->SetMapper(_Mapper);     
110         _Actor->GetProperty()->SetColor(1, 0, 0);
111         _Actor->GetProperty()->SetOpacity(0.5);         
112 }
113
114 void CutModelData::udapteActorDirection()throw( CutModelException){
115         checkInvariant();
116         
117         _boxWidgetVolume->GetTransform(currentmatrix);          
118         _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
119 }
120
121 void CutModelData::createShapes(){
122         _cubefigure = new CutModelFigureCube();
123         _cylinderfigure = new CutModelFigureCylinder();
124         _spherefigure = new CutModelFigureSphere();
125 }
126
127 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
128         checkInvariant();       
129         _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
130 }
131
132 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
133         checkInvariant();
134         if(check){
135                 _boxWidgetVolume->On();
136         }else{
137                 _boxWidgetVolume->Off();
138         }    
139 }
140
141 void CutModelData::ChangeShape(int selection)throw( CutModelException){
142         checkInvariant();
143         
144         if(selection == 0){
145                 _Mapper->SetInput(_spherefigure->getPolyData());
146         }else if(selection == 1){
147                 _Mapper->SetInput(_cylinderfigure->getPolyData());
148         }else if(selection == 2){
149                 _Mapper->SetInput(_cubefigure->getPolyData());
150         }else{
151                 throw CutModelException("Shape type not found");
152         }
153         _currentshape=selection;
154 }
155
156 void CutModelData::checkInvariant()throw( CutModelException){
157         if(_boxWidgetVolume==NULL){
158                 throw CutModelException("Box Widget not created");
159         }
160         if(_Mapper==NULL){
161                 throw CutModelException("Mapper not created");
162         }
163         if(_Actor==NULL){
164                 throw CutModelException("Actor not created");
165         }
166         if(_cubefigure==NULL){
167                 throw CutModelException("Cube not created");
168         }
169         if(_cylinderfigure==NULL){
170                 throw CutModelException("Cylinder not created");
171         }
172         if(_spherefigure==NULL){
173                 throw CutModelException("Sphere not created");
174         }
175 }
176
177 vtkActor* CutModelData::getActor()throw( CutModelException){
178         checkInvariant();
179         return _Actor;
180 }
181
182 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
183         checkInvariant();               
184         _Actor->GetProperty()->SetColor( r,g,b );       
185 }
186
187 CutModelFigure* CutModelData::getCurentCuttingModel(){
188     checkInvariant();
189         
190         if(_currentshape == 0){
191                 return _spherefigure;
192         }else if(_currentshape == 1){
193                 return _cylinderfigure;
194         }else if(_currentshape == 2){
195                 return _cubefigure;
196         }else{
197                 throw CutModelException("Shape type not found");
198         }       
199 }
200
201 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
202 {
203         wxBusyCursor wait;
204
205         CutModelFigure* actualCuttingModel = getCurentCuttingModel();
206
207         //_boxWidgetVolume->GetTransform(currentmatrix);        
208         actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
209         //actualCuttingModel->SetVtkTransform(currentmatrix);
210         actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
211
212         bool                    inside;
213         //bool                  volInt, volExt; // unused
214         int                     xx,yy,zz;
215         unsigned short*         pOrg;   
216         int                     ext[6];
217         //double                        spc[3]; // unused
218         //long int              contAfter = 0; // unused
219         //long int              contBefor = 0; // unused
220         
221         double minvalue = range[0]; 
222         double value    = range[1];
223         double maxvalue = range[2]; 
224         
225         copyimage->GetExtent(ext);        
226         
227         for (xx=ext[0];xx<ext[1]; xx++)
228         {
229                 for (yy=ext[2];yy<ext[3]; yy++)
230                 {
231                         for (zz=ext[4];zz<ext[5];zz++)
232                         {
233                                 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
234                                 if (  ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
235                                 {
236                                         pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz); 
237
238                                         //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
239                                         if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
240                                         {       
241                                                 
242                                                 *pOrg=(unsigned short)value;
243                                                 
244                                         }                                       
245                                 } // if inside
246                         } // for zz
247                 } // for yy
248         } // for xx
249 }
250
251 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
252 {
253         wxBusyCursor wait;
254
255         CutModelFigure* actualCuttingModel = getCurentCuttingModel();
256
257         actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
258
259         actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
260
261         bool                    inside;
262         // bool                 volInt, volExt; // unused // JPRx
263         int                     xx,yy,zz;
264         unsigned short* pOrg;   
265         int                     ext[6];
266         //double                spc[3]; // unused // JPRx
267         //long int              contAfter = 0; // unused // JPRx
268         //long int              contBefor = 0;   // unused // JPRx
269
270         double value;
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 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
294
295         double *spc = copyimage->GetSpacing();
296         modeltransform->Identity();
297
298         vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
299         vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
300         matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
301         matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
302         matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
303         matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
304         matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
305         matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
306         matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
307         matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
308         matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);            
309         matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
310         matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
311         matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);    
312
313         /*
314         double* pos = currentmatrix->GetPosition();
315         modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);   
316
317         double* scal = currentmatrix->GetScale();       
318         modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
319
320         //double* orient = currentmatrix->GetOrientation();
321         //modeltransform->RotateZ(orient[2]);   
322         //modeltransform->RotateY(orient[1]);   
323         //modeltransform->RotateX(orient[0]);   
324         double* orient = currentmatrix->GetOrientationWXYZ();   
325         modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);    
326         */
327
328         modeltransform->Update();
329
330         return modeltransform;
331 }
332
333 void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
334         
335 //      double *spc = img->GetSpacing();  // spc unused // JPR
336
337         currentmatrix->Identity();      
338
339         /*double* orient = transform->GetOrientationWXYZ();
340         currentmatrix->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);     
341
342         double* pos = transform->GetPosition();
343         currentmatrix->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
344
345         double* scal = transform->GetScale();   
346         currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
347
348         currentmatrix->Update();        */
349
350         _boxWidgetVolume->SetTransform(transform);
351
352     /*vtkMatrix4x4* matrix = transform->GetMatrix();
353         vtkMatrix4x4* matrixcurrent = currentmatrix->GetMatrix();
354         matrixcurrent->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
355         matrixcurrent->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
356         matrixcurrent->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
357         matrixcurrent->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
358         matrixcurrent->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
359         matrixcurrent->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
360         matrixcurrent->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
361         matrixcurrent->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
362         matrixcurrent->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);          
363         matrixcurrent->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
364         matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
365         matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);  */
366
367         udapteActorDirection();
368         getModelTransform(img);
369 }
370
371 vtkTransform* CutModelData::getModelTransformInvers(){
372         inversModel->Identity ();
373         inversModel->Concatenate ( modeltransform );
374         inversModel->Inverse(); 
375         return inversModel;
376 }
377
378 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
379         return _Mapper->GetInput();
380 }
381