]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/CutModule/kernel/CutModelData.cxx
d340ec69b3c1adc1aa56c70d5bd7114a3c746638
[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/01 14:01:36 $
7   Version:   $Revision: 1.2 $
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         _id = id;
24         _currentshape=0;
25         createBoxWidget(interactor, observer);
26         setTransform(img);
27         createActor();
28         createShapes();
29         ChangeShape(0);
30         checkInvariant();
31
32         
33 }
34 CutModelData::~CutModelData(){
35         checkInvariant();
36         _boxWidgetVolume->Off();
37         _boxWidgetVolume->Delete();     
38         _Mapper->Delete();      
39         _Actor->Delete();       
40         delete _cubefigure;
41         delete _cylinderfigure;
42         delete _spherefigure;
43         currentmatrix->Delete();
44         inversModel->Delete();
45 }
46 void CutModelData::RefreshViewBox(){
47                 
48 }
49 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
50
51         _boxWidgetVolume = vtkBoxWidget::New();
52         _boxWidgetVolume->SetInteractor( interactor );
53         //_boxWidgetVolume->SetPlaceFactor(2);
54         //_boxWidgetVolume->SetInput( img );    
55         //_boxWidgetVolume->PlaceWidget();
56         _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent              , observer );
57         _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent                 , observer );
58         _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent               , observer );
59         
60         _boxWidgetVolume->HandlesOn ();
61         _boxWidgetVolume->On();
62         //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5);       
63         //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5);      
64 }
65 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
66         
67         currentmatrix = vtkTransform::New();
68         modeltransform = vtkTransform::New();
69         inversModel     = vtkTransform::New();    
70
71         vtkMatrix4x4* matrix = vtkMatrix4x4::New();  
72         matrix->Identity();     
73         int *ext = img->GetExtent();
74         double *spc = img->GetSpacing();
75
76         matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
77         matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);       
78         matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);               
79         matrix->SetElement(0,3,(ext[1]-ext[0])/2*spc[0]);
80         matrix->SetElement(1,3,(ext[3]-ext[2])/2*spc[1]);
81         matrix->SetElement(2,3,(ext[5]-ext[4])/2*spc[2]);
82
83         currentmatrix->SetMatrix(matrix);
84         _boxWidgetVolume->SetTransform(currentmatrix);  
85                 
86 }
87 void CutModelData::createActor(){       
88
89         _Mapper = vtkPolyDataMapper::New();     
90         _Actor  = vtkActor::New();
91         _Actor->SetMapper(_Mapper);     
92         _Actor->GetProperty()->SetColor(1, 0, 0);
93         _Actor->GetProperty()->SetOpacity(0.5); 
94         
95 }
96 void CutModelData::udapteActorDirection()throw( CutModelException){
97         checkInvariant();
98         
99         _boxWidgetVolume->GetTransform(currentmatrix);          
100         _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
101 }
102 void CutModelData::createShapes(){
103         _cubefigure = new CutModelFigureCube();
104         _cylinderfigure = new CutModelFigureCylinder();
105         _spherefigure = new CutModelFigureSphere();
106 }
107 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
108         checkInvariant();       
109         _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
110 }
111
112 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
113         checkInvariant();
114         if(check){
115                 _boxWidgetVolume->On();
116         }else{
117                 _boxWidgetVolume->Off();
118         }    
119 }
120
121 void CutModelData::ChangeShape(int selection)throw( CutModelException){
122         checkInvariant();
123         
124         if(selection == 0){
125                 _Mapper->SetInput(_spherefigure->getPolyData());
126         }else if(selection == 1){
127                 _Mapper->SetInput(_cylinderfigure->getPolyData());
128         }else if(selection == 2){
129                 _Mapper->SetInput(_cubefigure->getPolyData());
130         }else{
131                 throw CutModelException("Shape type not found");
132         }
133
134         _currentshape=selection;
135 }
136
137 void CutModelData::checkInvariant()throw( CutModelException){
138         if(_boxWidgetVolume==NULL){
139                 throw CutModelException("Box Widget not created");
140         }
141         if(_Mapper==NULL){
142                 throw CutModelException("Mapper not created");
143         }
144         if(_Actor==NULL){
145                 throw CutModelException("Actor not created");
146         }
147         if(_cubefigure==NULL){
148                 throw CutModelException("Cube not created");
149         }
150         if(_cylinderfigure==NULL){
151                 throw CutModelException("Cylinder not created");
152         }
153         if(_spherefigure==NULL){
154                 throw CutModelException("Sphere not created");
155         }        
156         
157 }
158
159 vtkActor* CutModelData::getActor()throw( CutModelException){
160         checkInvariant();
161         return _Actor;
162 }
163
164 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
165         checkInvariant();               
166         _Actor->GetProperty()->SetColor( r,g,b );       
167 }
168 CutModelFigure* CutModelData::getCurentCuttingModel(){
169     checkInvariant();
170         
171         if(_currentshape == 0){
172                 return _spherefigure;
173         }else if(_currentshape == 1){
174                 return _cylinderfigure;
175         }else if(_currentshape == 2){
176                 return _cubefigure;
177         }else{
178                 throw CutModelException("Shape type not found");
179         }       
180 }
181 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)
182 {
183
184         wxBusyCursor wait;
185
186         CutModelFigure* actualCuttingModel = getCurentCuttingModel();
187
188         actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
189         actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
190
191         bool                    inside;
192         bool                    volInt, volExt;
193         int                             xx,yy,zz;
194         unsigned short* pOrg;   
195         int                             ext[6];
196         double                  spc[3];
197         long int                contAfter = 0;
198         long int                contBefor = 0;
199         
200         double minvalue = range[0]; 
201         double value    = range[1];
202         double maxvalue = range[2]; 
203
204                 
205         copyimage->GetExtent(ext);        
206         
207         for (xx=ext[0];xx<ext[1]; xx++)
208         {
209                 for (yy=ext[2];yy<ext[3]; yy++)
210                 {
211                         for (zz=ext[4];zz<ext[5];zz++)
212                         {
213                                 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
214                                 if (  ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
215                                 {
216                                         pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz); 
217
218                                         //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
219                                         if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
220                                         {       
221                                                 
222                                                 *pOrg=(unsigned short)value;
223                                                 
224                                         }                                       
225                                 } // if inside
226                         } // for zz
227                 } // for yy
228         } // for xx
229         
230 }
231
232 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
233
234         vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
235         vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
236
237         double *spc = copyimage->GetSpacing();
238
239         modeltransform->Identity();
240
241         double* orient = currentmatrix->GetOrientationWXYZ();
242         modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);    
243
244         double* pos = currentmatrix->GetPosition();
245         modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
246
247         double* scal = currentmatrix->GetScale();       
248         modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
249
250         /*matrixmodel->Identity();      
251         matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
252         matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
253         matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
254         matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
255         matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
256         matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
257         matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
258         matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
259         matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);            
260         matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
261         matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
262         matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);*/
263
264         //modeltransform->SetMatrix(matrixmodel);
265
266
267         modeltransform->Update();
268
269         return modeltransform;
270
271         
272 }
273 vtkTransform* CutModelData::getModelTransformInvers(){
274         inversModel->Identity ();
275         inversModel->Concatenate ( modeltransform );
276         inversModel->Inverse(); 
277         return inversModel;
278 }