]> Creatis software - creaContours.git/blobdiff - lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx
no message
[creaContours.git] / lib / Interface_ManagerContour_NDimensions / wxContourMainFrame.cxx
index e6a1eec84fc756e626e1892c515088358323c7b9..b6d2133f84b044328d314268bc7d81e88f567c84 100644 (file)
 #include "NameWrapper.h"
 #include "wx/artprov.h"
 #include "ConceptDataWrap.h"
-
-#include <manualContour.h>
-//#include "ImageSourceThing.h"
-//#include "wxContour_ActionCommandsID.h"
-//#include "OutlineModelBuilder.h"
-//#include "wxContourEventHandler.h"
 #include <creaWx.h>
 
 //----------------------------------------------------------------------------------------------------------------
@@ -68,7 +62,8 @@ char wxContourMainFrame::COPY = 'C';
 //             m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER;
 //             m_notebook_theme = 0;   
                //wxContour_ActionCommandsID a;
-
+               
+               _contourextractdata                     = NULL;
        }
 
        wxContourMainFrame :: wxContourMainFrame(wxWindow* parent, wxWindowID id,const wxString& title,const wxPoint& pos,const wxSize& size,std::vector<vtkImageData*> images, long style,std::string datadir)         
@@ -107,10 +102,14 @@ char wxContourMainFrame::COPY = 'C';
                {
                        this->setVectImages(images);
                }
-
+               
+               _contourextractdata                     = NULL;
 }
 
-void wxContourMainFrame::setVectImages( std::vector<vtkImageData*> images ){
+void wxContourMainFrame::setVectImages(std::vector<vtkImageData*> imgs)
+{
+
+       _images = imgs;
 
        #if defined(__GNUC__)
                std::string str_home(getenv("HOME"));
@@ -125,7 +124,7 @@ void wxContourMainFrame::setVectImages( std::vector<vtkImageData*> images ){
        notebook = this->createNotebook();              
 
 
-       kernelManager = new KernelManagerContour( images , _datadir+"/data/" , strCreaContourDataTmp );
+       kernelManager = new KernelManagerContour( imgs , _datadir+"/data/" , strCreaContourDataTmp );
 
 
        _instantPanel                           = new wxInstantChooserPanel( notebook, "Instant Chooser", true, false, "c" );
@@ -172,7 +171,8 @@ void wxContourMainFrame::setVectImages( std::vector<vtkImageData*> images ){
 
        wxContourMainFrame :: ~wxContourMainFrame()
        {
-
+               delete _contourextractdata;
+               deleteAllContours();
                _pannew->Close();
                interfMainPanel::resetInstance();
                delete kernelManager;
@@ -581,13 +581,50 @@ void wxContourMainFrame::setConceptValue( std::string name, int value ){
        _instantPanel->setConceptValue(name, value);
 }
 
+
 ConceptDataWrap* wxContourMainFrame::getLastConceptData(){
        return _instantPanel->getLastConceptData();
 }
+
+
 bool wxContourMainFrame::getIfConceptCheckedAt( std::string name, int pos ){
        return _instantPanel->getIfConceptCheckedAt( name, pos );
 }
 
+
+
+void wxContourMainFrame::ShowResultImages(int typeContourGroup)
+{
+       vtkImageData * mask;
+       vtkImageData * value;
+       this->getMaskValue(&mask, &value, typeContourGroup);
+       
+       std::vector<int> nTypeView;
+       nTypeView.push_back(5);
+       nTypeView.push_back(1);
+       nTypeView.push_back(2);
+       nTypeView.push_back(0); 
+       
+       wxFrame *frame = new wxFrame(this, -1,_T("Result image extracted.."),wxDefaultPosition,wxSize(600,600), wxDEFAULT_FRAME_STYLE|wxSTAY_ON_TOP);
+       wxAuiManager *m_mgr_noteBookViewerResult = new wxAuiManager();
+       m_mgr_noteBookViewerResult->SetManagedWindow(frame);
+       
+       wxAuiNotebook* noteBookViewerResult = new wxAuiNotebook(frame, -1, wxPoint(600, 600), wxSize(430,200), m_notebook_style);
+       m_mgr_noteBookViewerResult->AddPane(noteBookViewerResult, wxAuiPaneInfo().Name(wxT("notebook_content")).CenterPane().PaneBorder(false));
+
+       wxPanel *panelViewer1 = new wxMaracas_N_ViewersWidget(noteBookViewerResult, value,&nTypeView);
+       wxPanel *panelViewer2 = new wxMaracas_N_ViewersWidget(noteBookViewerResult, mask,&nTypeView);
+       
+
+       noteBookViewerResult->AddPage( panelViewer1, wxT("Image result") );
+       noteBookViewerResult->AddPage( panelViewer2, wxT("Mask result") );
+       m_mgr_noteBookViewerResult->Update();
+       frame->Show();
+}
+
+
+
+
 void wxContourMainFrame::changeInstant()
 {
                std::vector<int> instantVect;
@@ -607,6 +644,7 @@ void wxContourMainFrame::changeInstant()
 }
 
 
+
 void wxContourMainFrame :: updateInstantOutlines()
 {
        _theViewPanel->removeSceneContours();
@@ -758,24 +796,94 @@ void wxContourMainFrame ::loadState(std::string filename){
        fscanf(pFile,"%s",tmp); // --CreaContour--
 
        fscanf(pFile,"%s",tmp); // Version
-       fscanf(pFile,"%s",tmp); // 1.0.1
-       std::string version(tmp);
+       fscanf(pFile,"%s",tmp); // 1.0.2 || 1.0.1 || 1.0.0
 
        deleteAllContours();
 
-       openContours(pFile,false);
-       if (version!="1.0.0"){
-               openContours(pFile,true);
-       }
+       loadContours(pFile, false);
+       loadContours(pFile, true);      
 
        fclose(pFile);
+}
+
+void wxContourMainFrame ::loadContours( FILE *pFile, bool staticContour )
+{
+       char tmp[255];
+
+       if (staticContour==false)
+       {
+       fscanf(pFile,"%s",tmp); // ImageDimensions
+       fscanf(pFile,"%s",tmp); // X
+       fscanf(pFile,"%s",tmp); // Y
+       fscanf(pFile,"%s",tmp); // Z
+
+       fscanf(pFile,"%s",tmp); // ImageSpacing
+       fscanf(pFile,"%s",tmp); // X
+       fscanf(pFile,"%s",tmp); // Y
+       fscanf(pFile,"%s",tmp); // Z
+       }
        
-       //_theViewPanel->getSceneManager()->removeSceneContours();
-       //changeInstant();
+       fscanf(pFile,"%s",tmp); // NumberOfContours 
+       fscanf(pFile,"%s",tmp); // ##
+       int numberOfContours = atoi(tmp);  
+
+       std::vector<int> instantVector;
+       int typeContourModel;
+       manualContourModel *manModelContour;
+       int typeView;
+
+       int i;
+       for (i=0;i<numberOfContours;i++)
+       {
+               instantVector.clear();
+               fscanf(pFile,"%s",tmp); // Instant
+               fscanf(pFile,"%s",tmp); // 1
+               instantVector.push_back( atoi(tmp) );
+               fscanf(pFile,"%s",tmp); // 2
+               instantVector.push_back( atoi(tmp) );
+               fscanf(pFile,"%s",tmp); // 3
+               instantVector.push_back( atoi(tmp) );
+               fscanf(pFile,"%s",tmp); // 4
+               instantVector.push_back( atoi(tmp) );
+               fscanf(pFile,"%s",tmp); // 5
+               instantVector.push_back( atoi(tmp) );
+               fscanf(pFile,"%s",tmp); // 6
+               instantVector.push_back( atoi(tmp) );
 
+               fscanf(pFile,"%s",tmp); // TypeContourModel
+               fscanf(pFile,"%s",tmp); // ##
+               typeContourModel = atoi(tmp);
+
+               manModelContour =  kernelManager->factoryManualContourModel(typeContourModel);
+               manModelContour->Open(pFile);
+
+               fscanf(pFile,"%s",tmp); // TypeView
+               fscanf(pFile,"%s",tmp); // ##
+               typeView = atoi(tmp);  
+
+               std::string theName;
+               theName = kernelManager->createOutline( manModelContour, instantVector );
+               bool addedModel = theName.compare("") != 0;
+               if( addedModel )
+               {
+                       double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
+                       _theViewPanel->getSpacing(spc);                                 
+                       //Adding the manualContourControler to interface objects structure
+                       //Adding the manualViewContour to interface objects structure           
+                       //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
+                       _theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc , typeView) ;
+               }       
+               
+               if (staticContour==true)
+               {
+                       Instant instant(&instantVector);
+                       kernelManager->changeContourOfManager( theName , &instant );
+               }
+       }// for  numberOfContours
 }
 
-void wxContourMainFrame::onLoad(){
+void wxContourMainFrame::onLoad()
+{
        char tmp[255];
        wxFileDialog dialog(NULL, _T("Choose a file"), _T(""), _T(""), _T("*.roi"), wxOPEN );
        if (dialog.ShowModal() == wxID_OK)
@@ -786,20 +894,36 @@ void wxContourMainFrame::onLoad(){
                fscanf(pFile,"%s",tmp); // --CreaContour--
 
                fscanf(pFile,"%s",tmp); // Version
-               fscanf(pFile,"%s",tmp); // 1.0.1
+               fscanf(pFile,"%s",tmp); // 1.0.2 || 1.0.1 || 1.0.0
                std::string version(tmp);
-
-               openContours(pFile,false);
-               if (version!="1.0.0"){
-                       openContours(pFile,true);
+               
+               //AD:02-06-09
+               if (version=="1.0.2")
+               {
+                       openContours(pFile,2,false);
+                       openContours(pFile,2,true);     //Load StaticContours
+               }
+               
+               //AD:02-06-09
+               else if (version=="1.0.1")
+               {
+                       openContours(pFile,1,false); //Skips ImageDimensions and ImageSpacing
+                       openContours(pFile,1,true); //Load StaticContours, skips ImageDimensions and ImageSpacing
+               }
+               
+               //AD:02-06-09
+               else if (version=="1.0.0")
+               {
+                       openContours(pFile,1,false); //Skips ImageDimensions and ImageSpacing
                }
-//                       _theViewPanel->getSceneManager()->openFileWithContours(ff);
 
                fclose(pFile);
        }
        _theViewPanel->getSceneManager()->removeSceneContours();
        changeInstant();
 }
+
+//AD: 29-05-09
 void wxContourMainFrame::onSave(){
        wxFileDialog dialog(NULL, _T("Choose a file"), _T(""), _T(""), _T("*.roi"), wxSAVE );
        if (dialog.ShowModal() == wxID_OK)
@@ -809,6 +933,8 @@ void wxContourMainFrame::onSave(){
                saveFileWithContours( fileNameContourROI );
        }
 }
+
+//AD: 29-05-09
 void wxContourMainFrame::saveFileWithContours( std::string filename )
 {
 
@@ -817,19 +943,38 @@ void wxContourMainFrame::saveFileWithContours( std::string filename )
        int i,sizeLstNameThings; 
 
        fprintf(pFile,"--CreaContour--\n");
-       fprintf(pFile,"Version %s\n", "1.0.1" );
+       fprintf(pFile,"Version %s\n", "1.0.2" );
+       
+       vtkImageData *image = _images[0];
+
+       int dimRange[3];
+       image->GetDimensions(dimRange);
+
+       fprintf(pFile,"ImageDimensions %d %d %d\n", dimRange[0], dimRange[1], dimRange[2] );
+
+       double spaRange[3];
+       image->GetSpacing(spaRange);
+
+       fprintf(pFile,"ImageSpacing %f %f %f\n", spaRange[0], spaRange[1], spaRange[2] );
 
        // Normal Contours
+       
        lstNameThings           = kernelManager->GetLstNameThings();
        sizeLstNameThings       = lstNameThings.size(); 
        fprintf(pFile,"NumberOfContours %d\n", sizeLstNameThings );
+
        for (i=0 ; i<sizeLstNameThings ; i++) 
        {
                kernelManager->SaveThingName( pFile, lstNameThings[i] );
                _theViewPanel->getSceneManager()->SaveThingName( pFile, lstNameThings[i] );
        }// for i
 
-       //-- Contours Statics 
+       //-- Static Contours
+
+       fprintf(pFile,"ImageDimensions %d %d %d\n", dimRange[0], dimRange[1], dimRange[2] );
+       
+       fprintf(pFile,"ImageSpacing %f %f %f\n", spaRange[0], spaRange[1], spaRange[2] );
+       
        lstNameThings           = kernelManager->GetLstNameThingsStatic();
        sizeLstNameThings       = lstNameThings.size(); 
        fprintf(pFile,"NumberOfContoursStatic %d\n", sizeLstNameThings );
@@ -841,8 +986,48 @@ void wxContourMainFrame::saveFileWithContours( std::string filename )
        fclose(pFile);
 }
 
-void wxContourMainFrame::openContours( FILE *pFile, bool staticContour ){
+//AD:04-06-09
+void wxContourMainFrame::openContours( FILE *pFile, int version, bool staticContour )
+{
        char tmp[255];
+       
+       vtkImageData *image = _images[0];
+       int imageDim[3];
+       double imageSpac[3];
+       int tempDim[3];
+       double tempSpac[3];
+       
+       bool compatible = true;
+       
+       //Version==2    
+       if (version==2)
+       {
+               image->GetDimensions(imageDim);
+               image->GetSpacing(imageSpac);
+
+               fscanf(pFile,"%s",tmp); // ImageDimensions
+               fscanf(pFile,"%s",tmp); // X
+               tempDim[0] = atoi(tmp);
+               fscanf(pFile,"%s",tmp); // Y
+               tempDim[1] = atoi(tmp);
+               fscanf(pFile,"%s",tmp); // Z
+               tempDim[2] = atoi(tmp);
+
+               fscanf(pFile,"%s",tmp); // ImageSpacing
+               fscanf(pFile,"%s",tmp); // X
+               tempSpac[0] = atof(tmp);
+               fscanf(pFile,"%s",tmp); // Y
+               tempSpac[1] = atof(tmp);
+               fscanf(pFile,"%s",tmp); // Z
+               tempSpac[2] = atof(tmp);
+               
+               //Compare Spacing and Dims in X and Y (Necessary in Z?) - Just for Version 2
+               if (imageDim[0]!=tempDim[0] || imageDim[1]!=tempDim[1] || imageSpac[0]!=tempSpac[0] || imageSpac[1]!=tempSpac[1])
+               {
+                       compatible = false;
+               }
+       }
+       
        fscanf(pFile,"%s",tmp); // NumberOfContours 
        fscanf(pFile,"%s",tmp); // ##
        int numberOfContours = atoi(tmp);  
@@ -852,64 +1037,159 @@ void wxContourMainFrame::openContours( FILE *pFile, bool staticContour ){
        manualContourModel *manModelContour;
        int typeView;
 
-       int i;
-       for (i=0;i<numberOfContours;i++)
+       if (compatible==true)
        {
-               instantVector.clear();
-               fscanf(pFile,"%s",tmp); // Instant
-
-               fscanf(pFile,"%s",tmp); // 1
-               instantVector.push_back( atoi(tmp) );
-               fscanf(pFile,"%s",tmp); // 2
-               instantVector.push_back( atoi(tmp) );
-               fscanf(pFile,"%s",tmp); // 3
-               instantVector.push_back( atoi(tmp) );
-               fscanf(pFile,"%s",tmp); // 4
-               instantVector.push_back( atoi(tmp) );
-               fscanf(pFile,"%s",tmp); // 5
-               instantVector.push_back( atoi(tmp) );
-               fscanf(pFile,"%s",tmp); // 6
-               instantVector.push_back( atoi(tmp) );
-
-
-               fscanf(pFile,"%s",tmp); // TypeContourModel
-               fscanf(pFile,"%s",tmp); // ##
-               typeContourModel = atoi(tmp);
-
-               manModelContour =  kernelManager->factoryManualContourModel(typeContourModel);
-               manModelContour->Open(pFile);
-
-               fscanf(pFile,"%s",tmp); // TypeView
-               fscanf(pFile,"%s",tmp); // ##
-               typeView = atoi(tmp);  
-
-
-//                     if (typeView==1) 
-//                     {
-//                     }
+               int i;
+               for (i=0;i<numberOfContours;i++)
+               {
+                       instantVector.clear();
+                       fscanf(pFile,"%s",tmp); // Instant
+
+                       fscanf(pFile,"%s",tmp); // 1
+                       instantVector.push_back( atoi(tmp) );
+                       fscanf(pFile,"%s",tmp); // 2
+                       instantVector.push_back( atoi(tmp) );
+                       fscanf(pFile,"%s",tmp); // 3
+                       instantVector.push_back( atoi(tmp) );
+                       fscanf(pFile,"%s",tmp); // 4
+                       instantVector.push_back( atoi(tmp) );
+                       fscanf(pFile,"%s",tmp); // 5
+                       instantVector.push_back( atoi(tmp) );
+                       fscanf(pFile,"%s",tmp); // 6
+                       instantVector.push_back( atoi(tmp) );
+
+
+                       fscanf(pFile,"%s",tmp); // TypeContourModel
+                       fscanf(pFile,"%s",tmp); // ##
+                       typeContourModel = atoi(tmp);
+
+                       manModelContour =  kernelManager->factoryManualContourModel(typeContourModel);
+                       manModelContour->Open(pFile);
+
+                       fscanf(pFile,"%s",tmp); // TypeView
+                       fscanf(pFile,"%s",tmp); // ##
+                       typeView = atoi(tmp);  
+
+                       std::string theName;
+                       theName = kernelManager->createOutline( manModelContour, instantVector );
+                       bool addedModel = theName.compare("") != 0;
+                       if( addedModel )
+                       {
+                               double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
+                               _theViewPanel->getSpacing(spc);                                 
+                               //Adding the manualContourControler to interface objects structure
+                               //Adding the manualViewContour to interface objects structure           
+                               //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
+                               _theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc , typeView) ;
+                       }       
+
+                       if (staticContour) //StaticContours (will appear in all slices)
+                       {
+                               Instant instant(&instantVector);
+                               kernelManager->changeContourOfManager( theName , &instant );
+                       }
 
+               }// for  numberOfContours       
+       }
 
-               std::string theName;
-               theName = kernelManager->createOutline( manModelContour, instantVector );
-               bool addedModel = theName.compare("") != 0;
-               if( addedModel )
-               {
-                       double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
-                       _theViewPanel->getSpacing(spc);                                 
-                       //Adding the manualContourControler to interface objects structure
-                       //Adding the manualViewContour to interface objects structure           
-                       //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
-                       _theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc , typeView) ;
-               }       
+       else if (compatible==false)
+       {
+               wxDialog* dial = new wxDialog (this,-1,_T("Tools"),wxDefaultPosition, wxSize(260,160));
+               wxSizer* buttonsSizer = dial->CreateSeparatedButtonSizer(wxOK|wxCANCEL);
+               wxBoxSizer *dialSizer = new wxBoxSizer(wxVERTICAL);
+
+               wxString lstOptOperation[2];
+               lstOptOperation[0]=_T("By Dimension");
+               lstOptOperation[1]=_T("By Spacing");
+               wxRadioBox * radioOpts = new wxRadioBox(dial, -1, _T("Type of Transformation"), wxDefaultPosition, wxSize(270,45), 2 , lstOptOperation,  2, wxRA_SPECIFY_COLS);         
+               
+               dialSizer->Add( new wxStaticText(dial,-1,_T("The image resolution is not compatible with the "))  , 0, wxGROW );
+               dialSizer->Add( new wxStaticText(dial,-1,_T("selected Roi file. Do you want to tranform it?"))  , 0, wxGROW );  
+               dialSizer->Add( new wxStaticText(dial,-1,_T(" "))  , 0, wxGROW );               
+               dialSizer->Add(radioOpts,0,wxGROW);
+               dialSizer->Add( new wxStaticText(dial,-1,_T(" "))  , 0, wxGROW );       
+               dialSizer->Add(buttonsSizer,0,wxGROW);
+               dial->SetSizer(dialSizer, true);
+               dial->Layout();
+               dial->ShowModal();
+               
+               int typeOfTransformation = -1;
+               bool transform = false;
 
-               if (staticContour==true)
+               if (dial->GetReturnCode() == wxID_OK)
                {
-                       Instant instant(&instantVector);
-                       kernelManager->changeContourOfManager( theName , &instant );
+                       typeOfTransformation = radioOpts->GetSelection();
+                       transform = true;
                }
+       
+               int i;
+               for (i=0;i<numberOfContours;i++)
+               {
+                       instantVector.clear();
+                       fscanf(pFile,"%s",tmp); // Instant
+
+                       fscanf(pFile,"%s",tmp); // 1
+                       instantVector.push_back( atoi(tmp) );
+                       fscanf(pFile,"%s",tmp); // 2
+                       instantVector.push_back( atoi(tmp) );
+                       fscanf(pFile,"%s",tmp); // 3
+                       instantVector.push_back( atoi(tmp) );
+                       fscanf(pFile,"%s",tmp); // 4
+                       instantVector.push_back( atoi(tmp) );
+                       fscanf(pFile,"%s",tmp); // 5
+                       instantVector.push_back( atoi(tmp) );
+                       fscanf(pFile,"%s",tmp); // 6
+                       instantVector.push_back( atoi(tmp) );
+
+                       fscanf(pFile,"%s",tmp); // TypeContourModel
+                       fscanf(pFile,"%s",tmp); // ##
+                       typeContourModel = atoi(tmp);
+
+                       manModelContour =  kernelManager->factoryManualContourModel(typeContourModel);
+                       manModelContour->Open(pFile);
+
+                       if (transform==true)
+                       {
+                               if (typeOfTransformation==0)
+                               {
+                                       double transX, transY;
+                                       transX = (double) imageDim[0]/tempDim[0];
+                                       transY = (double) imageDim[1]/tempDim[1];
+                                       manModelContour->Transform_Ax_Plus_B(transX,0,transY,0);
+                               }
+                               else if (typeOfTransformation==1)
+                               {
+                                       double transX, transY;
+                                       transX = (double) tempSpac[0]/imageSpac[0];
+                                       transY = (double) tempSpac[1]/imageSpac[1];
+                                       manModelContour->Transform_Ax_Plus_B(transX,0,transY,0);
+                               }
+                       }
 
-       }// for  numberOfContours
+                       fscanf(pFile,"%s",tmp); // TypeView
+                       fscanf(pFile,"%s",tmp); // ##
+                       typeView = atoi(tmp);  
 
+                       std::string theName;
+                       theName = kernelManager->createOutline( manModelContour, instantVector );
+                       bool addedModel = theName.compare("") != 0;
+                       if( addedModel )
+                       {
+                               double spc[3];//Si no hay imagen pero hay contornos que spacing se pone por default
+                               _theViewPanel->getSpacing(spc);                                 
+                               //Adding the manualContourControler to interface objects structure
+                               //Adding the manualViewContour to interface objects structure           
+                               //_theViewPanel->getSceneManager()->setControlActiveStateOfALL( false );//This call is being done here because if the ROI is created underneath the previously created ROIS will still be active.
+                               _theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc , typeView) ;
+                       }       
+
+                       if (staticContour) //StaticContours (will appear in all slices)
+                       {
+                               Instant instant(&instantVector);
+                               kernelManager->changeContourOfManager( theName , &instant );
+                       }
+               }// for  numberOfContours       
+       }
 }
 
 void wxContourMainFrame::RefreshInterface(){
@@ -1616,18 +1896,27 @@ void wxContourMainFrame::referenceLine()
                _refLineView->SetWidthLine(4);
 
                _refLineControl->SetModelView( _refLineModel , _refLineView );
-               viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl );
+               vtkInteractorStyleBaseView* style = (vtkInteractorStyleBaseView*)viewer2D->GetInteractorStyleBaseView();
+               style->AddInteractorStyleMaracas( _refLineControl );
                _refLineModel->SetCloseContour(false);
                _refLineControl->CreateNewManualContour();
 
-//EED??                double z = _refLineControl->GetZ();
+//AD: Inicializar el mirroring con una linea ya pintada        
        /*
-               _refLineControl->AddPoint(50,100,z);
-               _refLineControl->AddPoint(80,40,z);
+               double z = _refLineControl->GetZ();
+
+               int imageDim[3];
+               image->GetDimensions(imageDim);
+               double x = (double) imageDim[0]/2;
+               double y1 = (double) (imageDim[1]/2)+15;
+               double y2 = (double) (imageDim[1]/2)-15;
+
+               _refLineControl->AddPoint(x,y1,z);
+               _refLineControl->AddPoint(x,y2,z);
                _refLineControl->SetCompleteCreation(true);
 
-               _refLineModel->AddPoint(50,100,z);
-               _refLineModel->AddPoint(80,40,z);
+               _refLineModel->AddPoint(x,y1,z);
+               _refLineModel->AddPoint(x,y2,z);
                _refLineModel->UpdateSpline();
 
                _refLineView->UpdateViewPoint(0);
@@ -1670,7 +1959,8 @@ void wxContourMainFrame::refLineShow()
                        _refLineView->SetZ( 1200 );
 
                        _refLineControl->SetModelView( _refLineModel , _refLineView );
-                       viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl );
+                       vtkInteractorStyleBaseView* style = (vtkInteractorStyleBaseView*)viewer2D->GetInteractorStyleBaseView();
+                       style->AddInteractorStyleMaracas( _refLineControl );
                        _refLineControl->CreateNewManualContour();
                        _refLineControl->SetActive(true);
                        _refLineView->RefreshContour();
@@ -1947,10 +2237,32 @@ void wxContourMainFrame::onWidthOfContour(double width){
 
        RefreshInterface();
 }
-int wxContourMainFrame::getColorWindow(){
+
+int wxContourMainFrame::getColorWindow()
+{
+       /*
+       double range[2];
+       vtkImageData * img = getImageData();
+       img->GetScalarRange(range);
+
+       std::cout<<"Val 1: "<<range[0]<<" Val 2: "<<range[1]<<std::endl;
+       
+       return (int)range[1];
+       */
        return _theViewPanel->getColorWindow();
 }
-int wxContourMainFrame::getWindowLevel(){
+
+int wxContourMainFrame::getWindowLevel()
+{
+       /*
+       double range[2];
+       vtkImageData * img = getImageData();
+       img->GetScalarRange(range);
+
+       std::cout<<"Val 1: "<<range[0]<<" Val 2: "<<range[1]<<std::endl;
+       
+       return (int)range[1];
+       */
        return _theViewPanel->getWindowLevel();
 }
 
@@ -2058,12 +2370,21 @@ std::vector<std::string> wxContourMainFrame::getOutlinesName(int slide){
        return kernelManager->getOutlinesNameAtInstant(tempVector);
 }
 
-void wxContourMainFrame::onInformationContourLabels(int typeContourGroup,int selection,int minimumZ,int maximumZ){
+
+void wxContourMainFrame::GenerateContourExtractData()
+{
+       if (_contourextractdata==NULL) { _contourextractdata = new ContourExtractData(true); }
+}
+
+
+void wxContourMainFrame::onInformationContourLabels(int typeContourGroup,int selection,int minimumZ,int maximumZ)
+{
+       GenerateContourExtractData();
+       
        int maxContourGroup     =       0;
 
-       ContourExtractData      *contourextractdata = new ContourExtractData();
        
-       contourextractdata ->SetTypeOperation( typeContourGroup % 3 );
+       _contourextractdata ->SetTypeOperation( typeContourGroup % 3 );
 
        std::vector<manualContourModel*> lstManConMod;
        std::vector<manualContourModel*> lstManConModTmp;
@@ -2117,7 +2438,7 @@ void wxContourMainFrame::onInformationContourLabels(int typeContourGroup,int sel
        
 
        totalZ  = maxZ-minZ+1;
-       contourextractdata->SetImage( imagedata);
+       _contourextractdata->SetImage( imagedata);
 
 // For each slice..
        for ( z=minZ ; z<=maxZ ; z++ )
@@ -2130,7 +2451,7 @@ void wxContourMainFrame::onInformationContourLabels(int typeContourGroup,int sel
                //_staticTextInformation->SetLabel(tmpString);
 
                //Extraction data from contours of each slice
-               contourextractdata->SetZtoBeAnalys( z);
+               _contourextractdata->SetZtoBeAnalys(z);
 
                tempVector[1]=z;
                Instant instant(&tempVector);
@@ -2177,18 +2498,18 @@ void wxContourMainFrame::onInformationContourLabels(int typeContourGroup,int sel
                                lstManConModTmp = lstManConModExp;
                        }
 
-                       contourextractdata->SetLstManualContourModel( lstManConModTmp );
+                       _contourextractdata->SetLstManualContourModel( lstManConModTmp );
 
                        pLstValue.clear();
                        pLstValuePosX.clear();
                        pLstValuePosY.clear();
                        pLstValuePosZ.clear();
-                       contourextractdata->GetValuesInsideCrown(       &pLstValue,
+                       _contourextractdata->GetValuesInsideCrown(      &pLstValue,
                                                                                                                &pLstValuePosX,
                                                                                                                &pLstValuePosY,
                                                                                                                &pLstValuePosZ);
                        // Statistics of each slice.
-                       contourextractdata->Statistics( &pLstValue,
+                       _contourextractdata->Statistics( &pLstValue,
                                                                                        minimumZ,
                                                                                        maximumZ,
                                                                                        &resultGrayRangeCount, 
@@ -2246,54 +2567,71 @@ void wxContourMainFrame::onInformationContourLabels(int typeContourGroup,int sel
        }
 
        interfMainPanel::getInstance()->setStringInfoPanel( _T("") );
-       delete contourextractdata;
 }
 
-void wxContourMainFrame::onSaveResults(std::string directory,std::string namefile, std::string filename, int typeContourGroup){
-    SaveValuesXYZ( directory , namefile, typeContourGroup );
-
-       vtkImageData* mask, *value;
-       this->getMaskValue(mask, value, typeContourGroup);
-       this->SaveImageResult( directory , namefile, mask, value);
+//AD: 29-05-09
+void wxContourMainFrame::onSaveResults(std::string directory,std::string namefile, std::string filename, 
+       int typeContourGroup, bool XYZValues, bool contourImage, bool statistics)
+{
+       if (XYZValues)
+       {
+               SaveValuesXYZ( directory , namefile, typeContourGroup );
+       }
 
+       if (contourImage)
+       {
+               vtkImageData * mask;
+               vtkImageData * value;
+               this->getMaskValue(&mask, &value, typeContourGroup);
+               this->SaveImageResult( directory , namefile, mask, value);
+       }
        
-       FILE *pFile=fopen(filename.c_str(),"w+");
+       if (statistics)
+       {
+               std::ostringstream name;
+               name << filename << ".xls";
+               
 
-       int sizeZ = _theViewPanel->GetImageDataSizeZ();
+               FILE *pFile=fopen(name.str().c_str(),"w+");
 
-       wxString tmpString;
-       int i,j,maxX,maxY=sizeZ;
-       maxX= interfMainPanel::getInstance()->getNumberColsInformationPanel();//this->_grid->GetNumberCols();
+               int sizeZ = _theViewPanel->GetImageDataSizeZ();
 
-       int iTitle,sizeTitle = (maxX / _numberOfVariablesStatistics);
-       for ( iTitle=0; iTitle<sizeTitle ; iTitle++)
-       {
-               //              fprintf(pFile,"-- \t %d-Size \t SizeRange \t Min \t Max \t Ave \t StDv \t" , iTitle,tmpString.c_str() );
-               fprintf(pFile,"-- \t %d-Size \t SizeRange \t Min \t Max \t Ave \t StDv \t" , iTitle );
-       }
-       fprintf(pFile,"\n" );
+               wxString tmpString;
+               int i,j,maxX,maxY=sizeZ;
+               maxX= interfMainPanel::getInstance()->getNumberColsInformationPanel();//this->_grid->GetNumberCols();
 
+               int iTitle,sizeTitle = (maxX / _numberOfVariablesStatistics);
+               for ( iTitle=0; iTitle<sizeTitle ; iTitle++)
+               {
+                               // fprintf(pFile,"-- \t %d-Size \t SizeRange \t Min \t Max \t Ave \t StDv \t" , iTitle,tmpString.c_str() );
+                               fprintf(pFile,"-- \t %d-Size \t SizeRange \t Min \t Max \t Ave \t StDv \t" , iTitle );
+               }
+               fprintf(pFile,"\n" );
 
 
-       for ( j=0; j<maxY ; j++)
-       {
-               fprintf(pFile,"%d\t" , j );
-               for (i=0 ; i<maxX ; i++){
-                       tmpString = interfMainPanel::getInstance()->getCellValue(j, i);//_grid->GetCellValue( j , i );
-                       fprintf(pFile,"%s\t" , (const char *)(tmpString.mb_str()) );
-               } // for i
-               fprintf(pFile,"\n"  );
-       } // for j
 
-       fclose(pFile);
+               for ( j=0; j<maxY ; j++)
+               {
+                       fprintf(pFile,"%d\t" , j );
+                       for (i=0 ; i<maxX ; i++){
+                               tmpString = interfMainPanel::getInstance()->getCellValue(j, i);//_grid->GetCellValue( j , i );
+                               fprintf(pFile,"%s\t" , (const char *)(tmpString.mb_str()) );
+                       } // for i
+                       fprintf(pFile,"\n"  );
+               } // for j
+
+               fclose(pFile);
+       }
 }
 
+//AD: 29-05-09
 void wxContourMainFrame::SaveValuesXYZ(std::string directory,std::string namefile,int typeContourGroup)
 {
        wxBusyCursor wait;
-       ContourExtractData      *contourextractdata = new ContourExtractData();
+       GenerateContourExtractData();
+       
        //int typeContourGroup = this->_radiolstboxContourGroup->GetSelection();
-       contourextractdata ->SetTypeOperation( typeContourGroup % 3 );
+       _contourextractdata ->SetTypeOperation( typeContourGroup % 3 );
 
        std::vector<manualContourModel*> lstManConMod;
        std::vector<manualContourModel*> lstManConModTmp;
@@ -2320,7 +2658,7 @@ void wxContourMainFrame::SaveValuesXYZ(std::string directory,std::string namefil
        maxZ    = sizeZ;//_mbarrange->GetEnd();
        totalZ  = maxZ-minZ+1;
 
-       contourextractdata->SetImage( imagedata);
+       _contourextractdata->SetImage( imagedata);
 
 // For each slice..
        for ( z=0 ; z<sizeZ ; z++)
@@ -2335,7 +2673,7 @@ void wxContourMainFrame::SaveValuesXYZ(std::string directory,std::string namefil
 
 
                //Extraction data from contours of each slice
-               contourextractdata->SetZtoBeAnalys( z);
+               _contourextractdata->SetZtoBeAnalys( z);
 
                tempVector[1]=z;
                Instant instant(&tempVector);
@@ -2370,13 +2708,13 @@ void wxContourMainFrame::SaveValuesXYZ(std::string directory,std::string namefil
                                lstManConModTmp = lstManConModExp;
                        }
 
-                       contourextractdata->SetLstManualContourModel( lstManConModTmp );
+                       _contourextractdata->SetLstManualContourModel( lstManConModTmp );
 
                        pLstValue.clear();
                        pLstValuePosX.clear();
                        pLstValuePosY.clear();
                        pLstValuePosZ.clear();
-                       contourextractdata->GetValuesInsideCrown(       &pLstValue,
+                       _contourextractdata->GetValuesInsideCrown(      &pLstValue,
                                                                                                                &pLstValuePosX,
                                                                                                                &pLstValuePosY,
                                                                                                                &pLstValuePosZ);
@@ -2411,18 +2749,19 @@ void wxContourMainFrame::SaveValuesXYZ(std::string directory,std::string namefil
        } // for z
        interfMainPanel::getInstance()->setStringInfoPanel(_T(""));
        //_staticTextInformation->SetLabel( _T("") );
-       delete contourextractdata;
+
 }
 
-void wxContourMainFrame::getMaskValue(vtkImageData* mask,vtkImageData* value,int typeContourGroup){
+void wxContourMainFrame::getMaskValue(vtkImageData ** mask,vtkImageData ** value,int typeContourGroup){
        wxBusyCursor wait;
-       ContourExtractData      *contourextractdata = new ContourExtractData( true );
+       GenerateContourExtractData();
+
        //int typeContourGroup = this->_radiolstboxContourGroup->GetSelection();
        if (typeContourGroup==3)
        {
                typeContourGroup=1;
        }
-       contourextractdata ->SetTypeOperation( typeContourGroup % 3 );
+       _contourextractdata ->SetTypeOperation( typeContourGroup % 3 );
 
        std::vector<manualContourModel*> lstManConMod;
        std::vector<manualContourModel*> lstManConModTmp;
@@ -2447,7 +2786,7 @@ void wxContourMainFrame::getMaskValue(vtkImageData* mask,vtkImageData* value,int
        maxZ    = sizeZ;//_mbarrange->GetEnd();
        totalZ  = maxZ-minZ+1;
 
-       contourextractdata->SetImage( imagedata);
+       _contourextractdata->SetImage( imagedata);
 
 // For each slice..
        for ( z=0 ; z<sizeZ ; z++)
@@ -2459,7 +2798,7 @@ void wxContourMainFrame::getMaskValue(vtkImageData* mask,vtkImageData* value,int
                interfMainPanel::getInstance()->setStringInfoPanel(tmpString);
 
                //Extraction data from contours of each slice
-               contourextractdata->SetZtoBeAnalys( z);
+               _contourextractdata->SetZtoBeAnalys( z);
 
                tempVector[1]=z;
                Instant instant(&tempVector);
@@ -2492,15 +2831,15 @@ void wxContourMainFrame::getMaskValue(vtkImageData* mask,vtkImageData* value,int
                                lstManConModTmp = lstManConModExp;
                        }
 
-                       contourextractdata->SetLstManualContourModel( lstManConModTmp );
-                       contourextractdata->CalculateImageResult(); // with actual Z
+                       _contourextractdata->SetLstManualContourModel( lstManConModTmp );
+                       _contourextractdata->CalculateImageResult(); // with actual Z
 
                } // for  iContourGroup
        } // for z
 
-       value = contourextractdata->GetVtkImageValueResult();
-       mask = contourextractdata->GetVtkImageMaskResult();
-       delete contourextractdata;
+       (*value) = _contourextractdata->GetVtkImageValueResult();
+       (*mask)  = _contourextractdata->GetVtkImageMaskResult();
+
 }
 
 void wxContourMainFrame::SaveImageResult(std::string directory,std::string namefile, vtkImageData* mask,vtkImageData* value)