]> Creatis software - creaMaracasVisu.git/blobdiff - lib/maracasVisuLib/src/CutModule/kernel/CutModelData.cxx
changes in qt for volume rendering with gpu support, if you are working with volume...
[creaMaracasVisu.git] / lib / maracasVisuLib / src / CutModule / kernel / CutModelData.cxx
index ef0806c93a90c03d3069a3cbebc776cc05a43a7c..546e416cd15547c95f1a67fd552615074fba483b 100644 (file)
@@ -3,8 +3,8 @@
   Program:   wxMaracas
   Module:    $RCSfile: CutModelData.cxx,v $
   Language:  C++
-  Date:      $Date: 2009/09/08 08:14:27 $
-  Version:   $Revision: 1.3 $
+  Date:      $Date: 2011/02/07 10:30:05 $
+  Version:   $Revision: 1.9 $
 
   Copyright: (c) 2002, 2003
   License:
 
 =========================================================================*/
 #include "CutModelData.h"
-
+#include "vtkRenderWindow.h"
 /**
 **     Start of the manager class
 **/
 CutModelData::CutModelData(int id, vtkRenderWindowInteractor* interactor, vtkCommand* observer, vtkImageData* img){
        
        initializeData(id, interactor, observer, img);
-       
 }
+
 CutModelData::CutModelData(){
 
 }
@@ -35,11 +35,15 @@ void CutModelData::initializeData(int id, vtkRenderWindowInteractor* interactor,
        createActor();
        createShapes();
        ChangeShape(0);
+        interactor->GetRenderWindow ()->Render();
        checkInvariant();
 }
+
 CutModelData::~CutModelData(){
        checkInvariant();
+       _boxWidgetVolume->RemoveAllObservers();
        _boxWidgetVolume->Off();
+       _boxWidgetVolume->SetInteractor(NULL);
        _boxWidgetVolume->Delete();     
        _Mapper->Delete();      
        _Actor->Delete();       
@@ -47,13 +51,15 @@ CutModelData::~CutModelData(){
        delete _cylinderfigure;
        delete _spherefigure;
        currentmatrix->Delete();
+       modeltransform->Delete();
        inversModel->Delete();
+       _id = -1;
 }
+
 void CutModelData::RefreshViewBox(){
                
 }
 void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCommand* observer){
-
        _boxWidgetVolume = vtkBoxWidget::New();
        _boxWidgetVolume->SetInteractor( interactor );
        //_boxWidgetVolume->SetPlaceFactor(1);
@@ -69,6 +75,7 @@ void CutModelData::createBoxWidget(vtkRenderWindowInteractor* interactor, vtkCom
        //_boxWidgetVolume->GetHandleProperty()->SetOpacity(0.5);       
        //_boxWidgetVolume->GetOutlineProperty()->SetOpacity(0.5);      
 }
+
 void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
        
        currentmatrix = vtkTransform::New();
@@ -76,48 +83,49 @@ void CutModelData::setTransform(vtkImageData* img)throw( CutModelException){
        inversModel     = vtkTransform::New();    
 
        vtkMatrix4x4* matrix = vtkMatrix4x4::New();  
-       matrix->Identity();     
+       matrix->Identity();
+        double *ori = img->GetOrigin();
        int *ext = img->GetExtent();
        double *spc = img->GetSpacing();
 
-       
        matrix->SetElement(0,0,(ext[1]-ext[0])/4*spc[0]);
        matrix->SetElement(1,1,(ext[3]-ext[2])/4*spc[1]);       
        matrix->SetElement(2,2,(ext[5]-ext[4])/4*spc[2]);
 
-       double orgx = (ext[1]-ext[0])/2*spc[0];
-       double orgy = (ext[3]-ext[2])/2*spc[1];
-       double orgz = (ext[5]-ext[4])/2*spc[2];
+        double orgx = (ext[1]+ext[0])/2.*spc[0];
+        double orgy = (ext[3]+ext[2])/2.*spc[1];
+        double orgz = (ext[5]+ext[4])/2.*spc[2];
 
        matrix->SetElement(0,3,orgx);
        matrix->SetElement(1,3,orgy);
        matrix->SetElement(2,3,orgz);
 
-       
        currentmatrix->SetMatrix(matrix);
-       _boxWidgetVolume->SetTransform(currentmatrix);  
-               
+       _boxWidgetVolume->SetTransform(currentmatrix);                  
 }
+
 void CutModelData::createActor(){      
 
        _Mapper = vtkPolyDataMapper::New();     
        _Actor  = vtkActor::New();
        _Actor->SetMapper(_Mapper);     
        _Actor->GetProperty()->SetColor(1, 0, 0);
-       _Actor->GetProperty()->SetOpacity(0.5); 
-       
+       _Actor->GetProperty()->SetOpacity(0.5);         
 }
+
 void CutModelData::udapteActorDirection()throw( CutModelException){
        checkInvariant();
        
        _boxWidgetVolume->GetTransform(currentmatrix);          
        _Actor->SetUserMatrix(currentmatrix->GetMatrix());//SetUserTransform(currentmatrix );
 }
+
 void CutModelData::createShapes(){
        _cubefigure = new CutModelFigureCube();
        _cylinderfigure = new CutModelFigureCylinder();
        _spherefigure = new CutModelFigureSphere();
 }
+
 void CutModelData::changeOpacity(int opacity)throw( CutModelException){
        checkInvariant();       
        _Actor->GetProperty()->SetOpacity((double)opacity/100.0);
@@ -144,7 +152,6 @@ void CutModelData::ChangeShape(int selection)throw( CutModelException){
        }else{
                throw CutModelException("Shape type not found");
        }
-
        _currentshape=selection;
 }
 
@@ -166,8 +173,7 @@ void CutModelData::checkInvariant()throw( CutModelException){
        }
        if(_spherefigure==NULL){
                throw CutModelException("Sphere not created");
-       }        
-       
+       }
 }
 
 vtkActor* CutModelData::getActor()throw( CutModelException){
@@ -179,6 +185,7 @@ void CutModelData::changeColor(double r,double g,double b)throw( CutModelExcepti
        checkInvariant();               
        _Actor->GetProperty()->SetColor( r,g,b );       
 }
+
 CutModelFigure* CutModelData::getCurentCuttingModel(){
     checkInvariant();
        
@@ -192,9 +199,9 @@ CutModelFigure* CutModelData::getCurentCuttingModel(){
                throw CutModelException("Shape type not found");
        }       
 }
+
 void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyimage)throw( CutModelException)
 {
-
        wxBusyCursor wait;
 
        CutModelFigure* actualCuttingModel = getCurentCuttingModel();
@@ -205,26 +212,25 @@ void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyi
        actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
 
        bool                    inside;
-       bool                    volInt, volExt;
-       int                             xx,yy,zz;
-       unsigned short* pOrg;   
-       int                             ext[6];
-       double                  spc[3];
-       long int                contAfter = 0;
-       long int                contBefor = 0;
+       //bool                  volInt, volExt; // unused
+       int                     xx,yy,zz;
+       unsigned short*         pOrg;   
+       int                     ext[6];
+       //double                        spc[3]; // unused
+       //long int              contAfter = 0; // unused
+       //long int              contBefor = 0; // unused
        
        double minvalue = range[0]; 
        double value    = range[1];
        double maxvalue = range[2]; 
-
-               
+       
        copyimage->GetExtent(ext);        
        
-       for (xx=ext[0];xx<ext[1]; xx++)
+        for (xx=ext[0];xx<=ext[1]; xx++)
        {
-               for (yy=ext[2];yy<ext[3]; yy++)
+                for (yy=ext[2];yy<=ext[3]; yy++)
                {
-                       for (zz=ext[4];zz<ext[5];zz++)
+                        for (zz=ext[4];zz<=ext[5];zz++)
                        {
                                inside=actualCuttingModel->IfPointInside(xx,yy,zz);
                                if (  ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
@@ -242,40 +248,36 @@ void CutModelData::ExecuteCut( double* range, bool isinside, vtkImageData* copyi
                        } // for zz
                } // for yy
        } // for xx
-       
 }
 
 void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData* copyimage)throw( CutModelException)
 {
-
        wxBusyCursor wait;
 
        CutModelFigure* actualCuttingModel = getCurentCuttingModel();
-       
+
        actualCuttingModel->SetVtkTransform(getModelTransform(copyimage));
-       
+
        actualCuttingModel->SetInversVtkTransform(getModelTransformInvers());   
 
        bool                    inside;
-       bool                    volInt, volExt;
-       int                             xx,yy,zz;
+       // bool                 volInt, volExt; // unused // JPRx
+       int                     xx,yy,zz;
        unsigned short* pOrg;   
-       int                             ext[6];
-       double                  spc[3];
-       long int                contAfter = 0;
-       long int                contBefor = 0;  
-       
+       int                     ext[6];
+       //double                spc[3]; // unused // JPRx
+       //long int              contAfter = 0; // unused // JPRx
+       //long int              contBefor = 0;   // unused // JPRx
+
        double value;
-       
 
-               
        copyimage->GetExtent(ext);        
-       
-       for (xx=ext[0];xx<ext[1]; xx++)
+
+        for (xx=ext[0];xx<=ext[1]; xx++)
        {
-               for (yy=ext[2];yy<ext[3]; yy++)
+                for (yy=ext[2];yy<=ext[3]; yy++)
                {
-                       for (zz=ext[4];zz<ext[5];zz++)
+                        for (zz=ext[4];zz<=ext[5];zz++)
                        {
                                inside=actualCuttingModel->IfPointInside(xx,yy,zz);
                                if (  ((inside==true)&&(isinside==true)) || ((!inside==true)&&(!isinside)) )
@@ -288,7 +290,6 @@ void CutModelData::ExecuteUnCut(bool isinside, vtkImageData* image, vtkImageData
                        } // for zz
                } // for yy
        } // for xx
-       
 }
 
 vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
@@ -296,7 +297,7 @@ vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
        double *spc = copyimage->GetSpacing();
        modeltransform->Identity();
 
-    vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
+       vtkMatrix4x4* matrix = currentmatrix->GetMatrix();
        vtkMatrix4x4* matrixmodel = modeltransform->GetMatrix();
        matrixmodel->SetElement(0,0,matrix->GetElement(0,0)/spc[0]);
        matrixmodel->SetElement(1,0,matrix->GetElement(1,0)/spc[0]);
@@ -312,7 +313,6 @@ vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
        matrixmodel->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);    
 
        /*
-       
        double* pos = currentmatrix->GetPosition();
        modeltransform->Translate(pos[0]/spc[0],pos[1]/spc[1],pos[2]/spc[2]);   
 
@@ -325,20 +325,16 @@ vtkTransform* CutModelData::getModelTransform(vtkImageData* copyimage){
        //modeltransform->RotateX(orient[0]);   
        double* orient = currentmatrix->GetOrientationWXYZ();   
        modeltransform->RotateWXYZ(orient[0],orient[1],orient[2],orient[3]);    
-       
        */
-               
 
        modeltransform->Update();
 
        return modeltransform;
-
-       
 }
-void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
-               
 
-       double *spc = img->GetSpacing();
+void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw( CutModelException){
+       
+//     double *spc = img->GetSpacing();  // spc unused // JPR
 
        currentmatrix->Identity();      
 
@@ -352,7 +348,7 @@ void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw
        currentmatrix->Scale(scal[0]/spc[0],scal[1]/spc[1],scal[2]/spc[2]);
 
        currentmatrix->Update();        */
-               
+
        _boxWidgetVolume->SetTransform(transform);
 
     /*vtkMatrix4x4* matrix = transform->GetMatrix();
@@ -370,11 +366,10 @@ void CutModelData::setTransform(vtkTransform* transform, vtkImageData* img)throw
        matrixcurrent->SetElement(1,3,matrix->GetElement(1,3)/spc[1]);
        matrixcurrent->SetElement(2,3,matrix->GetElement(2,3)/spc[2]);  */
 
-
        udapteActorDirection();
        getModelTransform(img);
-
 }
+
 vtkTransform* CutModelData::getModelTransformInvers(){
        inversModel->Identity ();
        inversModel->Concatenate ( modeltransform );
@@ -384,4 +379,5 @@ vtkTransform* CutModelData::getModelTransformInvers(){
 
 vtkPolyData* CutModelData::getPolyData()throw( CutModelException){
        return _Mapper->GetInput();
-}
\ No newline at end of file
+}
+