]> Creatis software - creaMaracasVisu.git/blobdiff - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracasIRMViewManager.cxx
BUG interaction ROI-creation line, rectangle, circle,
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / wxMaracasIRMViewManager.cxx
index 56360295dfdc9bab685c25ff1b555f529561606d..1b3ec3676b4f13c574bc209887c8ebf5616af841 100644 (file)
@@ -3,8 +3,8 @@
   Program:   wxMaracas
   Module:    $RCSfile: wxMaracasIRMViewManager.cxx,v $
   Language:  C++
-  Date:      $Date: 2009/04/01 16:16:59 $
-  Version:   $Revision: 1.1 $
+  Date:      $Date: 2009/04/14 12:47:30 $
+  Version:   $Revision: 1.3 $
 
   Copyright: (c) 2002, 2003
   License:
@@ -21,6 +21,7 @@
 **/
 wxMaracasIRMViewManager::wxMaracasIRMViewManager(){
        _renderer = NULL;
+       _idCount=0;
 }
 wxMaracasIRMViewManager::~wxMaracasIRMViewManager(){
 }
@@ -34,40 +35,79 @@ void wxMaracasIRMViewManager::setRenderer(vtkRenderer*  renderer){
 /**
 **     Adds a prop3D to the manager and returns the identifier
 **/
-int wxMaracasIRMViewManager::addProp3D(vtkProp3D* prop3D){
+int wxMaracasIRMViewManager::addProp3D(vtkProp3D* prop3D, std::string dataname)  throw(char*){
+       checkInvariant();
        if(prop3D != NULL){
-               prop3Dvect.push_back(prop3D);
-
-               if(_renderer!=NULL){
-                       _renderer->AddActor(prop3D);
-               }else{
-                       throw "Imposible to add actor, check renderer";
-               }
-               
+               wxMaracasIRMViewManagerData* data = new wxMaracasIRMViewManagerData(prop3D, dataname);
+               prop3Dvect.push_back(data);             
+               _renderer->AddActor(data->getProp3D());
+               data->setId(_idCount);
+               _idCount++;
+               return data->getId();
+       }else{
+               throw "Check vtkProp3D file or input";
+       }
+       return -1;
+}
+int wxMaracasIRMViewManager::addPropMHD(vtkImageData* imagedata, std::string dataname){
 
-               return prop3Dvect.size()-1;
+       checkInvariant();
+       if(imagedata != NULL){
+               wxMaracasIRMViewManagerData* data = new wxMaracasIRMViewManagerData(imagedata, dataname);
+               prop3Dvect.push_back(data);             
+               _renderer->AddActor(data->getProp3D());
+               data->setId(_idCount);
+               _idCount++;
+               return data->getId();
        }else{
-               return -1;
+               throw "Check ImageData file or input";
        }
+       return -1;
+
 }
 /**
-**     Changes the opacity in a prop3D
+**     adds or removes an actor depending of the bool value
 **/
-void wxMaracasIRMViewManager::changeOpacity(int propid, int value){
-       if(propid < prop3Dvect.size()){
-               vtkActor* actor = (vtkActor*)prop3Dvect[propid];                
-               actor->GetProperty()->SetOpacity((double)value/100.0);  
+void wxMaracasIRMViewManager::addRemoveActor(int propid, bool addremove)  throw(char*){
+       checkInvariant();
+       
+       wxMaracasIRMViewManagerData* data = this->getViewData(propid);          
+       if(data->getProp3D()!=NULL){
+               if(addremove){
+                       _renderer->AddViewProp(data->getProp3D());
+               }else{
+                       _renderer->RemoveViewProp(data->getProp3D());
+               }
                _renderer->Render();
        }
+       
+}
+/**
+**     Changes the opacity in a prop3D
+**/
+void wxMaracasIRMViewManager::changeOpacity(int propid, int value)  throw(char*){
+       checkInvariant();       
+
+
+       this->getViewData(propid)->changeOpacity(value);
+       
+       _renderer->Render();
+
 }
 
 /**
 **     changes the isovalue in a prop3D
 **/
-void wxMaracasIRMViewManager::changeIsoValue(int propid, int value){
-       if(propid<prop3Dvect.size()){
+void wxMaracasIRMViewManager::changeIsoValue(int propid, int value )throw(char*){
+       checkInvariant();       
 
-       }
+       wxMaracasIRMViewManagerData* data = this->getViewData(propid);          
+
+       _renderer->RemoveViewProp(data->getProp3D());
+       data->changeIsoValue(value);
+       _renderer->AddViewProp(data->getProp3D());
+
+       _renderer->Render();
 }
 
 vtkProp3D* wxMaracasIRMViewManager:: getProp3D(std::string filename){
@@ -86,3 +126,198 @@ vtkProp3D* wxMaracasIRMViewManager:: getProp3D(std::string filename){
        }       
        return NULL;
 }
+
+vtkImageData* wxMaracasIRMViewManager::getImageData(std::string filename){
+       if(filename.compare("")!= 0){   
+               
+               
+               vtkMetaImageReader* reader =  vtkMetaImageReader::New();        
+               reader->SetFileName(filename.c_str());
+               reader->Update();
+               vtkImageData* img = reader->GetOutput();
+               //reader->Delete();
+               return img;
+       }       
+       return NULL;
+}
+
+void wxMaracasIRMViewManager::checkInvariant()  throw(char*){
+       if(this->_renderer==NULL){
+               throw "Renderer not set";
+       }
+}
+
+wxMaracasIRMViewManagerData* wxMaracasIRMViewManager::getViewData(int id) throw(char*){
+    int i;
+       for(i = 0; i < prop3Dvect.size();i++){
+               if(prop3Dvect[i]->getId() == id){
+                       return prop3Dvect[i];
+               }
+       }
+       throw "id not found in the data";
+
+       return NULL;
+}
+
+int wxMaracasIRMViewManager::getMaxIsoValue(int propid) throw(char*){
+       
+       return this->getViewData(propid)->getMaxGreyLevel();
+
+}
+
+void wxMaracasIRMViewManager::changeColor(int propid, double red, double green, double blue) throw(char*){
+       checkInvariant();       
+       this->getViewData(propid)->changeColor(red, green, blue);
+
+}
+
+/********************************************************************************************
+** Start of data viewmanagerData
+*********************************************************************************************/
+
+wxMaracasIRMViewManagerData::wxMaracasIRMViewManagerData(vtkProp3D* prop3Dvect, std::string dataname){
+
+       _prop3D = prop3Dvect;
+       _dataname = dataname;
+       _maxgreylevel=-1;
+}
+wxMaracasIRMViewManagerData::wxMaracasIRMViewManagerData(vtkImageData* imagedata, std::string dataname){
+
+       this->setVtkImageData(imagedata);
+       _dataname = dataname;
+       
+       _maxgreylevel = getMaxLevel(imagedata);
+       _prop3D=NULL;                   
+
+       this->changeIsoValue(this->_maxgreylevel);
+}
+/**
+**     changes the isovalue in a prop3D
+**/
+void wxMaracasIRMViewManagerData::changeIsoValue(int value){   
+       
+
+       if(_prop3D!=NULL){
+               _prop3D->Delete();
+               _polydata->Delete();
+               _dataMapper->Delete();
+       }
+
+       vtkMarchingCubes *cubesFilter = vtkMarchingCubes::New();
+    cubesFilter->SetInput(this->_imagedata);
+    cubesFilter->SetValue(0,value);
+       cubesFilter->ComputeGradientsOn ();
+    cubesFilter->ComputeScalarsOn ();
+       cubesFilter->SetNumberOfContours( 1 );
+       
+       // Unir puntos duplicados y remover primitivas degeneradas
+       vtkCleanPolyData *cleanFilter = vtkCleanPolyData::New();
+    cleanFilter->SetInput ( cubesFilter->GetOutput() );
+       cleanFilter->Update();
+
+       _polydata = vtkPolyData::New();
+       _polydata->DeepCopy(cleanFilter->GetOutput());
+
+       cubesFilter->Delete();
+       cleanFilter->Delete();
+
+
+       _dataMapper = vtkPolyDataMapper::New();
+       _dataMapper->SetInput(_polydata);
+
+       vtkActor* dataActor = vtkActor::New();
+       dataActor->SetMapper(_dataMapper);      
+       _prop3D = dataActor;    
+       
+       
+}
+int wxMaracasIRMViewManagerData::getMaxGreyLevel(){
+       return _maxgreylevel;
+}
+wxMaracasIRMViewManagerData::~wxMaracasIRMViewManagerData(){
+}
+/**
+**     Adds a prop3D to the world of the application
+**/
+/**
+       ** Get's the max grey level of the image
+       **/
+int wxMaracasIRMViewManagerData::getMaxLevel(vtkImageData* img){
+
+       int ext[6], i, j, k,max=0;
+       img->GetExtent(ext);
+
+       for(i = ext[0]; i < ext[1];i++){
+               for(j = ext[2]; j < ext[3];j++){
+                       for(k = ext[4]; k < ext[5];k++){
+                unsigned short* ptr = (unsigned short*)img->GetScalarPointer(i,j,k);
+                               int temp = (int)*ptr;
+                               if(temp > max){
+                    max = temp;
+                               }
+                       }
+               }
+       }
+       return max;
+
+
+}
+void wxMaracasIRMViewManagerData::setVtkImageData(vtkImageData* imagedata){
+       _imagedata = imagedata;
+}
+/**
+**     Adds a prop3D to the world of the application
+**/
+void wxMaracasIRMViewManagerData::setProp3D(vtkProp3D* prop3D){
+       _prop3D = prop3D;
+}
+/**
+**     Changes the opacity in a prop3D
+**/
+void wxMaracasIRMViewManagerData::changeOpacity(int value){
+       vtkActor* actor = (vtkActor*)_prop3D;
+       actor->GetProperty()->SetOpacity((double)value/100.0);
+}
+
+/**
+**     Check if the variables are setted correctly
+**/
+void wxMaracasIRMViewManagerData::checkInvariant(){
+
+}
+/**
+**     get the prop3D 
+**/
+vtkProp3D* wxMaracasIRMViewManagerData::getProp3D(){
+       return _prop3D;
+}
+/**
+**     return the id from the daat
+**/
+int wxMaracasIRMViewManagerData::getId(){
+       return _id;
+}
+/**
+**     set data id
+**/
+void wxMaracasIRMViewManagerData::setId(int propid){
+       _id = propid;
+}
+
+/**
+**     Get the filanme
+**/
+std::string wxMaracasIRMViewManagerData::getDataname(){
+       return _dataname;
+}
+/**
+** Set the filanme
+**/
+void wxMaracasIRMViewManagerData::setDataname(std::string dataname){
+       _dataname = dataname;
+}
+
+void wxMaracasIRMViewManagerData::changeColor(double red, double green, double blue){
+    vtkActor* actor = (vtkActor*)_prop3D;      
+       actor->GetProperty()->SetColor(red,green,blue);
+}