CutModelData.cxx

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   wxMaracas
00004   Module:    $RCSfile: CutModelData.cxx,v $
00005   Language:  C++
00006   Date:      $Date: 2009/11/25 16:35:37 $
00007   Version:   $Revision: 1.5 $
00008 
00009   Copyright: (c) 2002, 2003
00010   License:
00011 
00012      This software is distributed WITHOUT ANY WARRANTY; without even
00013      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00014      PURPOSE.  See the above copyright notice for more information.
00015 
00016 =========================================================================*/
00017 #include "CutModelData.h"
00018 
00022 CutModelData::CutModelData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
00023         
00024         initializeData(id, interactor, observer, img);
00025         
00026 }
00027 CutModelData::CutModelData(){
00028 
00029 }
00030 void CutModelData::initializeData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
00031         _id = id;
00032         _currentshape=0;
00033         createBoxWidget(interactor, observer);
00034         setTransform(img);
00035         createActor();
00036         createShapes();
00037         ChangeShape(0);
00038         checkInvariant();
00039 }
00040 CutModelData::~CutModelData(){
00041         checkInvariant();
00042         _boxWidgetVolume->RemoveAllObservers();
00043         _boxWidgetVolume->Off();
00044         _boxWidgetVolume->SetInteractor(NULL);
00045         _boxWidgetVolume->Delete();     
00046         _Mapper->Delete();      
00047         _Actor->Delete();       
00048         delete _cubefigure;
00049         delete _cylinderfigure;
00050         delete _spherefigure;
00051         currentmatrix->Delete();
00052         modeltransform->Delete();
00053         inversModel->Delete();
00054         _id = -1;
00055 }
00056 void CutModelData::RefreshViewBox(){
00057                 
00058 }
00059 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
00060 
00061         _boxWidgetVolume = vtkBoxWidget::New();
00062         _boxWidgetVolume->SetInteractor( interactor );
00063         //_boxWidgetVolume->SetPlaceFactor(1);
00064         //_boxWidgetVolume->SetInput( img );    
00065         //_boxWidgetVolume->PlaceWidget();
00066 
00067         _boxWidgetVolume->AddObserver( vtkCommand::InteractionEvent              , observer );
00068         _boxWidgetVolume->AddObserver( vtkCommand::StartInteractionEvent                 , observer );
00069         _boxWidgetVolume->AddObserver( vtkCommand::RightButtonReleaseEvent               , observer );
00070         
00071         _boxWidgetVolume->HandlesOn ();
00072         _boxWidgetVolume->On();
00073         //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5);       
00074         //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5);      
00075 }
00076 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
00077         
00078         currentmatrix = vtkTransform::New();
00079         modeltransform = vtkTransform::New();
00080         inversModel     = vtkTransform::New();    
00081 
00082         vtkMatrix4x4* matrix = vtkMatrix4x4::New();  
00083         matrix->Identity();     
00084         int *ext = img->GetExtent();
00085         double *spc = img->GetSpacing();
00086 
00087         
00088         matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
00089         matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);       
00090         matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
00091 
00092         double orgx = (ext[1]-ext[0])/2*spc[0];
00093         double orgy = (ext[3]-ext[2])/2*spc[1];
00094         double orgz = (ext[5]-ext[4])/2*spc[2];
00095 
00096         matrix->SetElement(0,3,orgx);
00097         matrix->SetElement(1,3,orgy);
00098         matrix->SetElement(2,3,orgz);
00099 
00100         
00101         currentmatrix->SetMatrix(matrix);
00102         _boxWidgetVolume->SetTransform(currentmatrix);  
00103                 
00104 }
00105 void CutModelData::createActor(){       
00106 
00107         _Mapper = vtkPolyDataMapper::New();     
00108         _Actor  = vtkActor::New();
00109         _Actor->SetMapper(_Mapper);     
00110         _Actor->GetProperty()->SetColor(1, 0, 0);
00111         _Actor->GetProperty()->SetOpacity(0.5); 
00112         
00113 }
00114 void CutModelData::udapteActorDirection()throw( CutModelException){
00115         checkInvariant();
00116         
00117         _boxWidgetVolume->GetTransform(currentmatrix);          
00118         _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
00119 }
00120 void CutModelData::createShapes(){
00121         _cubefigure = new CutModelFigureCube();
00122         _cylinderfigure = new CutModelFigureCylinder();
00123         _spherefigure = new CutModelFigureSphere();
00124 }
00125 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
00126         checkInvariant();       
00127         _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
00128 }
00129 
00130 void CutModelData::ShowViewBox(bool check)throw( CutModelException){
00131         checkInvariant();
00132         if(check){
00133                 _boxWidgetVolume->On();
00134         }else{
00135                 _boxWidgetVolume->Off();
00136         }    
00137 }
00138 
00139 void CutModelData::ChangeShape(int selection)throw( CutModelException){
00140         checkInvariant();
00141         
00142         if(selection == 0){
00143                 _Mapper->SetInput(_spherefigure->getPolyData());
00144         }else if(selection == 1){
00145                 _Mapper->SetInput(_cylinderfigure->getPolyData());
00146         }else if(selection == 2){
00147                 _Mapper->SetInput(_cubefigure->getPolyData());
00148         }else{
00149                 throw CutModelException("Shape type not found");
00150         }
00151 
00152         _currentshape=selection;
00153 }
00154 
00155 void CutModelData::checkInvariant()throw( CutModelException){
00156         if(_boxWidgetVolume==NULL){
00157                 throw CutModelException("Box Widget not created");
00158         }
00159         if(_Mapper==NULL){
00160                 throw CutModelException("Mapper not created");
00161         }
00162         if(_Actor==NULL){
00163                 throw CutModelException("Actor not created");
00164         }
00165         if(_cubefigure==NULL){
00166                 throw CutModelException("Cube not created");
00167         }
00168         if(_cylinderfigure==NULL){
00169                 throw CutModelException("Cylinder not created");
00170         }
00171         if(_spherefigure==NULL){
00172                 throw CutModelException("Sphere not created");
00173         }        
00174         
00175 }
00176 
00177 vtkActor* CutModelData::getActor()throw( CutModelException){
00178         checkInvariant();
00179         return _Actor;
00180 }
00181 
00182 void CutModelData::changeColor(double r,double g,double b)throw( CutModelException){
00183         checkInvariant();               
00184         _Actor->GetProperty()->SetColor( r,g,b );       
00185 }
00186 CutModelFigure* CutModelData::getCurentCuttingModel(){
00187     checkInvariant();
00188         
00189         if(_currentshape == 0){
00190                 return _spherefigure;
00191         }else if(_currentshape == 1){
00192                 return _cylinderfigure;
00193         }else if(_currentshape == 2){
00194                 return _cubefigure;
00195         }else{
00196                 throw CutModelException("Shape type not found");
00197         }       
00198 }
00199 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
00200 {
00201 
00202         wxBusyCursor wait;
00203 
00204         CutModelFigure* actualCuttingModel = getCurentCuttingModel();
00205 
00206         //_boxWidgetVolume->GetTransform(currentmatrix);        
00207         actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
00208         //actualCuttingModel->SetVtkTransform(currentmatrix);
00209         actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
00210 
00211         bool                    inside;
00212         bool                    volInt, volExt;
00213         int                             xx,yy,zz;
00214         unsigned short* pOrg;   
00215         int                             ext[6];
00216         double                  spc[3];
00217         long int                contAfter = 0;
00218         long int                contBefor = 0;
00219         
00220         double minvalue = range[0]; 
00221         double value    = range[1];
00222         double maxvalue = range[2]; 
00223 
00224                 
00225         copyimage->GetExtent(ext);        
00226         
00227         for (xx=ext[0];xx<ext[1]; xx++)
00228         {
00229                 for (yy=ext[2];yy<ext[3]; yy++)
00230                 {
00231                         for (zz=ext[4];zz<ext[5];zz++)
00232                         {
00233                                 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
00234                                 if (  ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
00235                                 {
00236                                         pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz); 
00237 
00238                                         //std::cout<<"xx,yy,zz "<<xx<<","<<yy<<","<<zz<<" "<<*pOrg<<std::endl;
00239                                         if ((unsigned short)minvalue <=(*pOrg)&&(*pOrg)<=(unsigned short)maxvalue)
00240                                         {       
00241                                                 
00242                                                 *pOrg=(unsigned short)value;
00243                                                 
00244                                         }                                       
00245                                 } // if inside
00246                         } // for zz
00247                 } // for yy
00248         } // for xx
00249         
00250 }
00251 
00252 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
00253 {
00254 
00255         wxBusyCursor wait;
00256 
00257         CutModelFigure* actualCuttingModel = getCurentCuttingModel();
00258         
00259         actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
00260         
00261         actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
00262 
00263         bool                    inside;
00264         bool                    volInt, volExt;
00265         int                             xx,yy,zz;
00266         unsigned short* pOrg;   
00267         int                             ext[6];
00268         double                  spc[3];
00269         long int                contAfter = 0;
00270         long int                contBefor = 0;  
00271         
00272         double value;
00273         
00274 
00275                 
00276         copyimage->GetExtent(ext);        
00277         
00278         for (xx=ext[0];xx<ext[1]; xx++)
00279         {
00280                 for (yy=ext[2];yy<ext[3]; yy++)
00281                 {
00282                         for (zz=ext[4];zz<ext[5];zz++)
00283                         {
00284                                 inside=actualCuttingModel->IfPointInside(xx,yy,zz);
00285                                 if (  ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
00286                                 {
00287                                         value = *((unsigned short*)image->GetScalarPointer (xx,yy,zz));
00288                                         pOrg=(unsigned short*)copyimage->GetScalarPointer (xx,yy,zz); 
00289                                         //std::cout<<"CutModelData::ExecuteUnCut() "<<value<<" "<<*pOrg<<std::endl;
00290                                         *pOrg=(unsigned short)value;
00291                                 } // if inside
00292                         } // for zz
00293                 } // for yy
00294         } // for xx
00295         
00296 }
00297 
00298 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
00299 
00300         double *spc = copyimage->GetSpacing();
00301         modeltransform->Identity();
00302 
00303     vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
00304         vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
00305         matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
00306         matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
00307         matrixmodel->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
00308         matrixmodel->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
00309         matrixmodel->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
00310         matrixmodel->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
00311         matrixmodel->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
00312         matrixmodel->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
00313         matrixmodel->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);            
00314         matrixmodel->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
00315         matrixmodel->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
00316         matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);    
00317 
00318         /*
00319         
00320         double* pos = currentmatrix->GetPosition();
00321         modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);   
00322 
00323         double* scal = currentmatrix->GetScale();       
00324         modeltransform->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
00325 
00326         //double* orient = currentmatrix->GetOrientation();
00327         //modeltransform->RotateZ(orient[2]);   
00328         //modeltransform->RotateY(orient[1]);   
00329         //modeltransform->RotateX(orient[0]);   
00330         double* orient = currentmatrix->GetOrientationWXYZ();   
00331         modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);    
00332         
00333         */
00334                 
00335 
00336         modeltransform->Update();
00337 
00338         return modeltransform;
00339 
00340         
00341 }
00342 void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
00343                 
00344 
00345         double *spc = img->GetSpacing();
00346 
00347         currentmatrix->Identity();      
00348 
00349         /*double* orient = transform->GetOrientationWXYZ();
00350         currentmatrix->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);     
00351 
00352         double* pos = transform->GetPosition();
00353         currentmatrix->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);
00354 
00355         double* scal = transform->GetScale();   
00356         currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
00357 
00358         currentmatrix->Update();        */
00359                 
00360         _boxWidgetVolume->SetTransform(transform);
00361 
00362     /*vtkMatrix4x4* matrix = transform->GetMatrix();
00363         vtkMatrix4x4* matrixcurrent = currentmatrix->GetMatrix();
00364         matrixcurrent->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
00365         matrixcurrent->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
00366         matrixcurrent->SetElement(2,0,matrix->GetElement(2,0)/spc[0]);
00367         matrixcurrent->SetElement(0,1,matrix->GetElement(0,1)/spc[1]);
00368         matrixcurrent->SetElement(1,1,matrix->GetElement(1,1)/spc[1]);
00369         matrixcurrent->SetElement(2,1,matrix->GetElement(2,1)/spc[1]);
00370         matrixcurrent->SetElement(0,2,matrix->GetElement(0,2)/spc[2]);
00371         matrixcurrent->SetElement(1,2,matrix->GetElement(1,2)/spc[2]);
00372         matrixcurrent->SetElement(2,2,matrix->GetElement(2,2)/spc[2]);          
00373         matrixcurrent->SetElement(0,3,matrix->GetElement(0,3)/spc[0]);
00374         matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
00375         matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);  */
00376 
00377 
00378         udapteActorDirection();
00379         getModelTransform(img);
00380 
00381 }
00382 vtkTransform* CutModelData::getModelTransformInvers(){
00383         inversModel->Identity ();
00384         inversModel->Concatenate ( modeltransform );
00385         inversModel->Inverse(); 
00386         return inversModel;
00387 }
00388 
00389 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
00390         return _Mapper->GetInput();
00391 }
00392 

Generated on 18 Mar 2010 for creaMaracasVisu_lib by  doxygen 1.6.1