]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/CutModule/kernel/CutModelData.cxx
d4b46fbd9c92845fc60ddca642e90cfa3db841b5
[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/11/25 16:35:37 $
7   Version:   $Revision: 1.5 $
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->RemoveAllObservers();
43         _boxWidgetVolume->Off();
44         _boxWidgetVolume->SetInteractor(NULL);
45         _boxWidgetVolume->Delete();     
46         _Mapper->Delete();      
47         _Actor->Delete();       
48         delete _cubefigure;
49         delete _cylinderfigure;
50         delete _spherefigure;
51         currentmatrix->Delete();
52         modeltransform->Delete();
53         inversModel->Delete();
54         _id = -1;
55 }
56 void CutModelData::RefreshViewBox(){
57                 
58 }
59 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
60
61         _boxWidgetVolume = vtkBoxWidget::New();
62         _boxWidgetVolume->SetInteractor( interactor );
63         //_boxWidgetVolume->SetPlaceFactor(1);
64         //_boxWidgetVolume->SetInput( img );    
65         //_boxWidgetVolume->PlaceWidget();
66
67         _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent              , observer );
68         _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent                 , observer );
69         _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent               , observer );
70         
71         _boxWidgetVolume->HandlesOn ();
72         _boxWidgetVolume->On();
73         //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5);       
74         //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5);      
75 }
76 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
77         
78         currentmatrix = vtkTransform::New();
79         modeltransform = vtkTransform::New();
80         inversModel     = vtkTransform::New();    
81
82         vtkMatrix4x4* matrix = vtkMatrix4x4::New();  
83         matrix->Identity();     
84         int *ext = img->GetExtent();
85         double *spc = img->GetSpacing();
86
87         
88         matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
89         matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);       
90         matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
91
92         double orgx = (ext[1]-ext[0])/2*spc[0];
93         double orgy = (ext[3]-ext[2])/2*spc[1];
94         double orgz = (ext[5]-ext[4])/2*spc[2];
95
96         matrix->SetElement(0,3,orgx);
97         matrix->SetElement(1,3,orgy);
98         matrix->SetElement(2,3,orgz);
99
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 void CutModelData::createShapes(){
121         _cubefigure = new CutModelFigureCube();
122         _cylinderfigure = new CutModelFigureCylinder();
123         _spherefigure = new CutModelFigureSphere();
124 }
125 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
126         checkInvariant();       
127         _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
128 }
129
130 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
131         checkInvariant();
132         if(check){
133                 _boxWidgetVolume->On();
134         }else{
135                 _boxWidgetVolume->Off();
136         }    
137 }
138
139 void CutModelData::ChangeShape(int selection)throw( CutModelException){
140         checkInvariant();
141         
142         if(selection == 0){
143                 _Mapper->SetInput(_spherefigure->getPolyData());
144         }else if(selection == 1){
145                 _Mapper->SetInput(_cylinderfigure->getPolyData());
146         }else if(selection == 2){
147                 _Mapper->SetInput(_cubefigure->getPolyData());
148         }else{
149                 throw CutModelException("Shape type not found");
150         }
151
152         _currentshape=selection;
153 }
154
155 void CutModelData::checkInvariant()throw( CutModelException){
156         if(_boxWidgetVolume==NULL){
157                 throw CutModelException("Box Widget not created");
158         }
159         if(_Mapper==NULL){
160                 throw CutModelException("Mapper not created");
161         }
162         if(_Actor==NULL){
163                 throw CutModelException("Actor not created");
164         }
165         if(_cubefigure==NULL){
166                 throw CutModelException("Cube not created");
167         }
168         if(_cylinderfigure==NULL){
169                 throw CutModelException("Cylinder not created");
170         }
171         if(_spherefigure==NULL){
172                 throw CutModelException("Sphere not created");
173         }        
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 CutModelFigure* CutModelData::getCurentCuttingModel(){
187     checkInvariant();
188         
189         if(_currentshape == 0){
190                 return _spherefigure;
191         }else if(_currentshape == 1){
192                 return _cylinderfigure;
193         }else if(_currentshape == 2){
194                 return _cubefigure;
195         }else{
196                 throw CutModelException("Shape type not found");
197         }       
198 }
199 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
200 {
201
202         wxBusyCursor wait;
203
204         CutModelFigure* actualCuttingModel = getCurentCuttingModel();
205
206         //_boxWidgetVolume->GetTransform(currentmatrix);        
207         actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
208         //actualCuttingModel->SetVtkTransform(currentmatrix);
209         actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
210
211         bool                    inside;
212         bool                    volInt, volExt;
213         int                             xx,yy,zz;
214         unsigned short* pOrg;   
215         int                             ext[6];
216         double                  spc[3];
217         long int                contAfter = 0;
218         long int                contBefor = 0;
219         
220         double minvalue = range[0]; 
221         double value    = range[1];
222         double maxvalue = range[2]; 
223
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
252 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
253 {
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;
265         int                             xx,yy,zz;
266         unsigned short* pOrg;   
267         int                             ext[6];
268         double                  spc[3];
269         long int                contAfter = 0;
270         long int                contBefor = 0;  
271         
272         double value;
273         
274
275                 
276         copyimage->GetExtent(ext);        
277         
278         for (xx=ext[0];xx<ext[1]; xx++)
279         {
280                 for (yy=ext[2];yy<ext[3]; yy++)
281                 {
282                         for (zz=ext[4];zz<ext[5];zz++)
283                         {
284                                 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
285                                 if (  ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
286                                 {
287                                         value = *((unsigned short*)image->GetScalarPointer (xx,yy,zz));
288                                         pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz); 
289                                         //std::cout<<"CutModelData::ExecuteUnCut() "<<value<<" "<<*pOrg<<std::endl;
290                                         *pOrg=(unsigned short)value;
291                                 } // if inside
292                         } // for zz
293                 } // for yy
294         } // for xx
295         
296 }
297
298 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
299
300         double *spc = copyimage->GetSpacing();
301         modeltransform->Identity();
302
303     vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
304         vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
305         matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
306         matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
307         matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
308         matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
309         matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
310         matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
311         matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
312         matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
313         matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);            
314         matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
315         matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
316         matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);    
317
318         /*
319         
320         double* pos = currentmatrix->GetPosition();
321         modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);   
322
323         double* scal = currentmatrix->GetScale();       
324         modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
325
326         //double* orient = currentmatrix->GetOrientation();
327         //modeltransform->RotateZ(orient[2]);   
328         //modeltransform->RotateY(orient[1]);   
329         //modeltransform->RotateX(orient[0]);   
330         double* orient = currentmatrix->GetOrientationWXYZ();   
331         modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);    
332         
333         */
334                 
335
336         modeltransform->Update();
337
338         return modeltransform;
339
340         
341 }
342 void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
343                 
344
345         double *spc = img->GetSpacing();
346
347         currentmatrix->Identity();      
348
349         /*double* orient = transform->GetOrientationWXYZ();
350         currentmatrix->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);     
351
352         double* pos = transform->GetPosition();
353         currentmatrix->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
354
355         double* scal = transform->GetScale();   
356         currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
357
358         currentmatrix->Update();        */
359                 
360         _boxWidgetVolume->SetTransform(transform);
361
362     /*vtkMatrix4x4* matrix = transform->GetMatrix();
363         vtkMatrix4x4* matrixcurrent = currentmatrix->GetMatrix();
364         matrixcurrent->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
365         matrixcurrent->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
366         matrixcurrent->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
367         matrixcurrent->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
368         matrixcurrent->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
369         matrixcurrent->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
370         matrixcurrent->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
371         matrixcurrent->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
372         matrixcurrent->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);          
373         matrixcurrent->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
374         matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
375         matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);  */
376
377
378         udapteActorDirection();
379         getModelTransform(img);
380
381 }
382 vtkTransform* CutModelData::getModelTransformInvers(){
383         inversModel->Identity ();
384         inversModel->Concatenate ( modeltransform );
385         inversModel->Inverse(); 
386         return inversModel;
387 }
388
389 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
390         return _Mapper->GetInput();
391 }
392