]> Creatis software - creaContours.git/blobdiff - lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx
*** empty log message ***
[creaContours.git] / lib / Interface_ManagerContour_NDimensions / wxContourMainFrame.cxx
index 4cfa08134be989b9946325c498bb01b7ab4ca905..30cafdf91220e9193cbf66038d781874208c3a4a 100644 (file)
@@ -58,6 +58,11 @@ char wxContourMainFrame::COPY = 'C';
                _refLineControl                         = NULL;
                _refLineModel                           = NULL;
                _refLineView                            = NULL;
+               _imageReslicer                          = NULL;
+               _thresholdTable                         = NULL;
+               _thresholdMapper                        = NULL;
+               _thresholdActor                         = NULL;
+               _actorPresent                           = false;
 
                // set up default notebook style
 //             m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER;
@@ -77,6 +82,11 @@ char wxContourMainFrame::COPY = 'C';
                _refLineControl                         = NULL;
                _refLineModel                           = NULL;
                _refLineView                            = NULL;
+               _imageReslicer                          = NULL;
+               _thresholdTable                         = NULL;
+               _thresholdMapper                        = NULL;
+               _thresholdActor                         = NULL;
+               _actorPresent                           = false;
 
                // set up default notebook style
                m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER;
@@ -87,17 +97,16 @@ char wxContourMainFrame::COPY = 'C';
                _datadir = datadir;
 
        
-       inredo = 0;
-       inundo = 0;
+               inredo = 0;
+               inundo = 0;
 
-       interfMainPanel* pannew = interfMainPanel::getInstance(parent,datadir+"/data/Icons");//, eventHandler);
-       _performingOperation                    = new PerformingOperation();
+               _pannew = interfMainPanel::getInstance(this,datadir+"/data/Icons");//, eventHandler);
+               _performingOperation = new PerformingOperation();
 
-
-
-       if(images.size() > 0){
-               this->setVectImages(images);
-       }
+               if(images.size() > 0)
+               {
+                       this->setVectImages(images);
+               }
 
 }
 
@@ -113,7 +122,7 @@ void wxContourMainFrame::setVectImages( std::vector<vtkImageData*> images ){
        std::vector<std::string> conceptNameVect;
        std::vector<int> conceptSizeVect;
 
-       wxAuiNotebook * notebook = this->createNotebook();              
+       notebook = this->createNotebook();              
 
 
        kernelManager = new KernelManagerContour( images , _datadir+"/data/" , strCreaContourDataTmp );
@@ -134,7 +143,7 @@ void wxContourMainFrame::setVectImages( std::vector<vtkImageData*> images ){
        //*******************changeInstant();
        _theViewPanel->setVerticalConcept( "Axe Depth", data->getMinValue(), data->getMaxValue(), data->getMinShowedValue(),  data->getMaxShowedValue(), data->getActualValue() );
 
-       this->configurePanels( notebook );
+       this->configurePanels( );
 
 }
 
@@ -146,25 +155,42 @@ void wxContourMainFrame::setVectImages( std::vector<vtkImageData*> images ){
                return instance;
        }
 
-       std::vector<vtkImageData*> wxContourMainFrame ::getVectImages(){
+       std::vector<vtkImageData*> wxContourMainFrame ::getVectImages()
+       {
                return kernelManager->getVectImages();
        }
-       wxContourMainFrame* wxContourMainFrame :: getInstance(){
-               return instance;
-               
+
+       wxContourMainFrame* wxContourMainFrame :: getInstance()
+       {
+               return instance;        
+       }
+
+       void wxContourMainFrame :: resetInstance()
+       {
+               instance->Destroy();
        }
 
        wxContourMainFrame :: ~wxContourMainFrame()
        {
-                 m_mgr.UnInit();
-                 //El problema al cerrar la aplicacion puede estar asociado 
-                 //a que  wxAUINotebook esta en la aplicacion 
-                 //principal (wxContourGUIExample)tambien
-//EED????              delete _theViewPanel;             
-//EED????              delete _instantPanel;
-//EED????              delete _buttonsBar;
-//EED????              delete _actualInstant;           
-//EED????              delete _sceneManager;
+
+               _pannew->Close();
+               interfMainPanel::resetInstance();
+               delete kernelManager;
+               instance = NULL;
+               //_pannew->Destroy();
+               //delete _pannew;
+
+               m_mgr.UnInit();
+               //delete m_mgr;
+
+               //El problema al cerrar la aplicacion puede estar asociado 
+               //a que  wxAUINotebook esta en la aplicacion 
+               //principal (wxContourGUIExample)tambien
+               //EED????               delete _theViewPanel;             
+               //EED????               delete _instantPanel;
+               //EED????               delete _buttonsBar;
+               //EED????               delete _actualInstant;           
+               //EED????               delete _sceneManager;
        }
 
 
@@ -184,45 +210,44 @@ void wxContourMainFrame::setVectImages( std::vector<vtkImageData*> images ){
        //------------------------------------------------------------------------------------------------------------
        // Creational and initialization methods 
        //------------------------------------------------------------------------------------------------------------
-       bool wxContourMainFrame :: configurePanels(wxAuiNotebook* theNoteBook)
+       bool wxContourMainFrame :: configurePanels( )
        {
                bool configured = _theViewPanel!=NULL;
                                        
                configured &= _theViewPanel!=NULL;
                if( _theViewPanel!=NULL )
                {
-                       theNoteBook->AddPage( _theViewPanel, wxT("       View       ") );               
+                       notebook->AddPage( _theViewPanel, wxT("       View       ") );          
                        m_mgr.Update();
                }
 
 
                if( configured )
                {
-                       theNoteBook->AddPage( _instantPanel, wxT("Instant Page") );
+                       notebook->AddPage( _instantPanel, wxT("Instant Page") );
                        m_mgr.Update();
                }
 
-               m_mgr.AddPane(theNoteBook, wxAuiPaneInfo().Name(wxT("notebook_content")).CenterPane().PaneBorder(false));
+               m_mgr.AddPane(notebook, wxAuiPaneInfo().Name(wxT("notebook_content")).CenterPane().PaneBorder(false));
                m_mgr.Update();
-/*             configured &= _buttonsBar!=NULL;
-               if( _buttonsBar!=NULL )
-               {                       
-                       m_mgr.AddPane(_buttonsBar, wxAuiPaneInfo().
-                                       Name(wxT("TB")).Caption(wxT("Buttons Bar")).
-                                       ToolbarPane().Top().
-                                       LeftDockable(  ).RightDockable( false ).CloseButton(false));
-                       m_mgr.Update();
-               }*/
-               //CreateStatusBar();
-                        
+                
                SetMinSize(wxSize(300,300));
                m_mgr.Update();
                return configured;
        }
 
-       void wxContourMainFrame :: setNotebook( wxAuiNotebook * noteBook )
-       {
 
+       bool wxContourMainFrame::addNewPanel(wxPanel* panel)
+               {
+               bool configured = panel!=NULL;
+               configured &= panel!=NULL;
+               
+               if( configured )
+               {
+                       notebook->AddPage( panel, wxT("       Viewer       "), true );
+                       m_mgr.Update();
+               }
+               return configured;
        }
 
        //------------------------------------------------------------------------------------------------------------
@@ -563,7 +588,8 @@ bool wxContourMainFrame::getIfConceptCheckedAt( std::string name, int pos ){
        return _instantPanel->getIfConceptCheckedAt( name, pos );
 }
 
-void wxContourMainFrame::changeInstant(){
+void wxContourMainFrame::changeInstant()
+{
                std::vector<int> instantVect;
                _instantPanel->getInstant( instantVect );
 //             Instant * theInstant = new Instant ( &instantVect );
@@ -574,14 +600,15 @@ void wxContourMainFrame::changeInstant(){
                kernelManager->setInstant(instantVect);
                //_modelManager->setInstant( _actualInstant );
                
+           onThresholdChange();
                updateInstantOutlines();
                updateInstantImageData();
                updateInstantAxes();
-
-               
 }
-void wxContourMainFrame :: updateInstantOutlines(){
-       
+
+
+void wxContourMainFrame :: updateInstantOutlines()
+{
        _theViewPanel->removeSceneContours();
        _theViewPanel->addNameWrapperToScene();
 
@@ -598,7 +625,8 @@ std::string wxContourMainFrame::getNameWrapping(int i){
        return kernelManager->getNameWrapping(i);
 }
 
-void wxContourMainFrame::updateInstantImageData(){
+void wxContourMainFrame::updateInstantImageData()
+{
        std::vector<int> inst;
        _instantPanel->getInstant(inst);
 
@@ -611,9 +639,12 @@ void wxContourMainFrame::updateInstantImageData(){
                _theViewPanel->setImageSlice(z);
        }
 }
-void wxContourMainFrame::updateInstantAxes(){
+
+void wxContourMainFrame::updateInstantAxes()
+{
 }
 
+
 void wxContourMainFrame::onChangeDeep(int val){
        _instantPanel->setConceptValue( "Axe Depth", (int)val );        
        changeInstant();
@@ -778,7 +809,8 @@ void wxContourMainFrame::onSave(){
                saveFileWithContours( fileNameContourROI );
        }
 }
-void wxContourMainFrame::saveFileWithContours( std::string filename ){
+void wxContourMainFrame::saveFileWithContours( std::string filename )
+{
 
        FILE *pFile=fopen(filename.c_str(),"w+");
        std::vector< std::string > lstNameThings;
@@ -925,25 +957,25 @@ void wxContourMainFrame::SegmentationOneSliceITK(int x, int y, int z, wxString d
   typedef unsigned short OutputPixelType2;
   typedef itk::Image< OutputPixelType2, Dimension > OutputImageType2;
 
-  //Definición del thresholder
+  //DefiniciÛn del thresholder
   typedef itk::BinaryThresholdImageFilter< 
                         InternalImageType, 
                         OutputImageType    >    ThresholdingFilterType;
   
-  //Definición del primer filtro de conversión de pixeles
+  //DefiniciÛn del primer filtro de conversiÛn de pixeles
   typedef itk::CastImageFilter<
                OutputImageType, OutputImageType2 >  CastFilterType;
 
-  //Definición del segundo tipo de conversión de pixeles
+  //DefiniciÛn del segundo tipo de conversiÛn de pixeles
   typedef itk::CastImageFilter<
                OutputImageType2, InternalImageType >  CastFilterType2;
 
-  //Tercer tipo de conversión
+  //Tercer tipo de conversiÛn
   typedef itk::RescaleIntensityImageFilter< 
                                InternalImageType, 
                                OutputImageType >   CastFilterType3;
 
-  //Cuarto tipo de conversión
+  //Cuarto tipo de conversiÛn
   typedef itk::RescaleIntensityImageFilter< 
                                OutputImageType, 
                                OutputImageType >   CastFilterType4;
@@ -956,7 +988,7 @@ void wxContourMainFrame::SegmentationOneSliceITK(int x, int y, int z, wxString d
   thresholder->SetOutsideValue(  255  );
   thresholder->SetInsideValue(  0 );
 
-  //Definción de conexiónes entre VTK e ITK y el writer
+  //DefinciÛn de conexiÛnes entre VTK e ITK y el writer
   typedef itk::VTKImageToImageFilter<OutputImageType2> ConnectorType;
   typedef itk::ImageToVTKImageFilter<OutputImageType> ConnectorType2;
   typedef  itk::ImageFileWriter<  OutputImageType  > WriterType;
@@ -1009,23 +1041,23 @@ void wxContourMainFrame::SegmentationOneSliceITK(int x, int y, int z, wxString d
                               InternalImageType, 
                               InternalImageType >    ZeroCrossingFilterType;
 ZeroCrossingFilterType::Pointer zeroCrossing =
-                                                                       ZeroCrossingFilterType::New();
+                                               ZeroCrossingFilterType::New();
 
-const double propagationScaling = atof( prop );
+const double propagationScaling = atof( crea::wx2std(prop).c_str() );
 
   geodesicActiveContour->SetPropagationScaling( propagationScaling );
   geodesicActiveContour->SetCurvatureScaling( 1.0 );
   geodesicActiveContour->SetAdvectionScaling( 1.0 );
 
   geodesicActiveContour->SetMaximumRMSError( 0.02 );
-  int it=atoi( iter );
+  int it=atoi(  crea::wx2std(iter).c_str() );
   geodesicActiveContour->SetNumberOfIterations( it );
 
   smoothing->SetInput( filter2->GetOutput() );
   gradientMagnitude->SetInput( smoothing->GetOutput() );
   sigmoid->SetInput( gradientMagnitude->GetOutput() );
   fastMarching->SetInput( sigmoid->GetOutput() );
-  geodesicActiveContour->SetInput(  fastMarching->GetOutput() );
+  geodesicActiveContour->SetInput( fastMarching->GetOutput() );
   geodesicActiveContour->SetFeatureImage( sigmoid->GetOutput() );
   
   zeroCrossing->SetInput( geodesicActiveContour->GetOutput() );
@@ -1039,11 +1071,11 @@ const double propagationScaling = atof( prop );
   smoothing->SetConductanceParameter( 9.0 );
 
 
-  const double sigma = atof( sigm );
+  const double sigma = atof(  crea::wx2std(sigm).c_str() );
   gradientMagnitude->SetSigma(  sigma  );
 
-  const double alpha =  atof( alf );
-  const double beta  =  atof( bet );
+  const double alpha =  atof(  crea::wx2std(alf).c_str() );
+  const double beta  =  atof(  crea::wx2std(bet).c_str() );
 
   sigmoid->SetAlpha( alpha );
   sigmoid->SetBeta(  beta  );
@@ -1057,7 +1089,7 @@ const double propagationScaling = atof( prop );
   seedPosition[0] = x;
   seedPosition[1] = y;
 
-  const double initialDistance = atof( distanc );
+  const double initialDistance = atof( crea::wx2std(distanc).c_str() );
 
   NodeType node;
 
@@ -1069,7 +1101,7 @@ const double propagationScaling = atof( prop );
   seeds->Initialize();
   seeds->InsertElement( 0, node );
 
-  fastMarching->SetTrialPoints(  seeds  );
+  fastMarching->SetTrialPoints( seeds );
 
   fastMarching->SetSpeedConstant( 1.0 );
   
@@ -1110,7 +1142,7 @@ const double propagationScaling = atof( prop );
 
 
        vtkPolyData* polyDataResult =  cntVTK->GetOutput();
-       std::cout<<"Points "<<polyDataResult->GetNumberOfPoints()<<std::endl;
+       //std::cout<<"Points "<<polyDataResult->GetNumberOfPoints()<<std::endl;
        polyDataResult->Update( );
        polyDataResult->UpdateInformation();
 
@@ -1172,7 +1204,7 @@ myfile.open ("C:/Creatis/example2.txt");
                        std::cout<<" x Anterior "<<xAct<<" x actual "<<x<<std::endl;
                std::cout<<" y Anterior "<<yAct<<" y actual "<<y<<std::endl;
                std::cout<<" x "<<p[0]<<" y "<<p[1]<<std::endl;
-                       vecZ.push_back( -900 );
+                       vecZ.push_back( 900 );
                        xAct=x;
                        yAct=y;
                        }
@@ -1192,11 +1224,11 @@ myfile.open ("C:/Creatis/example2.txt");
                {
                vecX.push_back( p[0] );
                myfile <<p[0]<<","<<p[1]<<"\n";
-               std::cout<<" x Anterior "<<xAct<<" x actual "<<x<<std::endl;
-               std::cout<<" y Anterior "<<yAct<<" y actual "<<y<<std::endl;
-               std::cout<<" x "<<p[0]<<" y "<<p[1]<<std::endl;
+               //std::cout<<" x Anterior "<<xAct<<" x actual "<<x<<std::endl;
+               //std::cout<<" y Anterior "<<yAct<<" y actual "<<y<<std::endl;
+               //std::cout<<" x "<<p[0]<<" y "<<p[1]<<std::endl;
                vecY.push_back( p[1] );
-               vecZ.push_back( -900 );
+               vecZ.push_back( 900 );
                xAct=x;
                yAct=y;
                }
@@ -1207,9 +1239,9 @@ myfile.open ("C:/Creatis/example2.txt");
        while(!vecXo.empty())
        {
                vecX.push_back(vecXo.back());
-               std::cout<<" x Siguiente "<<vecXo.back();
+               //std::cout<<" x Siguiente "<<vecXo.back();
                vecXo.pop_back();
-               vecZ.push_back( -900 );
+               vecZ.push_back( 900 );
        }
        while(!vecYo.empty())
        {
@@ -1463,7 +1495,7 @@ myfile.close();
 //             double y=p[1];
                vecX.push_back( p[0] );
                vecY.push_back( p[1] );
-               vecZ.push_back( -900 );
+               vecZ.push_back( 900 );
 //                     vecZ.push_back( p[2] );
        }
 
@@ -1524,7 +1556,6 @@ myfile.close();
                }       // if addedModel
        } // if sizeCtrPt
 }
-
 int wxContourMainFrame::GetImageDataSizeZ(){
        return _theViewPanel->GetImageDataSizeZ();
 }
@@ -1561,49 +1592,52 @@ void wxContourMainFrame::onSegmentationAllSlice(int minZ,int maxZ,int isovalue,i
 //Creates a reference line to be used as the axis of the mirroring
 void wxContourMainFrame::referenceLine()
 {
-    wxBusyCursor wait;
-       double spc[3];
+       if (_refLineControl==NULL)
+       {
+               wxBusyCursor wait;
+               double spc[3];
 
-       vtkImageData *vtkimagedata = _theViewPanel->getImageData();
-       vtkimagedata->GetSpacing(spc);
+               vtkImageData *vtkimagedata = _theViewPanel->getImageData();
+               vtkimagedata->GetSpacing(spc);
 
-       wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView();
+               wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView();
 
-       _refLineControl = new manualLineControler();
-       _refLineModel   = new manualContourModelLine();
-       _refLineView = new manualViewLine();
-       _refLineView->SetModel( _refLineModel );
-       _refLineView->SetWxVtkBaseView( viewer2D );
-       _refLineView->SetRange( 2 );
-       _refLineView->SetZ( 1200 );
+               _refLineControl = new manualLineControler();
+               _refLineModel   = new manualContourModelLine();
+               _refLineView = new manualViewLine();
+               _refLineView->SetModel( _refLineModel );
+               _refLineView->SetWxVtkBaseView( viewer2D );
+               _refLineView->SetRange( 2 );
+               _refLineView->SetZ( 1200 );
 
-       _refLineView->SetSpacing(spc);
+               _refLineView->SetSpacing(spc);
 
-       _refLineView->SetColorNormalContour(0, 0, 1);
-       _refLineView->SetColorEditContour(0, 0.5, 0.5);
-       _refLineView->SetWidthLine(4);
+               _refLineView->SetColorNormalContour(0, 0, 1);
+               _refLineView->SetColorEditContour(0, 0.5, 0.5);
+               _refLineView->SetWidthLine(4);
 
-       _refLineControl->SetModelView( _refLineModel , _refLineView );
-       viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl );
-       _refLineModel->SetCloseContour(false);
-       _refLineControl->CreateNewManualContour();
+               _refLineControl->SetModelView( _refLineModel , _refLineView );
+               viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl );
+               _refLineModel->SetCloseContour(false);
+               _refLineControl->CreateNewManualContour();
 
-       double z = _refLineControl->GetZ();
-/*
-       _refLineControl->AddPoint(50,100,z);
-       _refLineControl->AddPoint(80,40,z);
-       _refLineControl->SetCompleteCreation(true);
+//EED??                double z = _refLineControl->GetZ();
+       /*
+               _refLineControl->AddPoint(50,100,z);
+               _refLineControl->AddPoint(80,40,z);
+               _refLineControl->SetCompleteCreation(true);
 
-       _refLineModel->AddPoint(50,100,z);
-       _refLineModel->AddPoint(80,40,z);
-       _refLineModel->UpdateSpline();
+               _refLineModel->AddPoint(50,100,z);
+               _refLineModel->AddPoint(80,40,z);
+               _refLineModel->UpdateSpline();
 
-       _refLineView->UpdateViewPoint(0);
-       _refLineView->UpdateViewPoint(1);
-*/
+               _refLineView->UpdateViewPoint(0);
+               _refLineView->UpdateViewPoint(1);
+       */
 
-       _refLineControl->SetActive(true);
-       _refLineView->RefreshContour();
+               _refLineControl->SetActive(true);
+               _refLineView->RefreshContour();
+       }
 }
 
 //Hides the referenceLine
@@ -1611,9 +1645,14 @@ void wxContourMainFrame::refLineHide()
 {
        if (_refLineControl!=NULL)
        {
-               _refLineView->RemoveCompleteContourActor();
-               _refLineControl->SetEditable(false);
-               _refLineControl->SetActive(false);
+               if (_refLineControl->GetActive())
+               {
+                       _refLineView->RemoveCompleteContourActor();
+                       _refLineControl->SetEditable(false);
+                       _refLineControl->SetActive(false);
+
+                       RefreshInterface();
+               }
        }
 }
 
@@ -1622,21 +1661,35 @@ void wxContourMainFrame::refLineShow()
 {
        if (_refLineControl!=NULL)
        {
-               wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView();
+               if (_refLineControl->GetActive()==false)
+               {
+                       wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView();
 
-               _refLineView->SetModel( _refLineModel );
-               _refLineView->SetWxVtkBaseView( viewer2D );
-               _refLineView->SetRange( 2 );
-               _refLineView->SetZ( 1200 );
+                       _refLineView->SetModel( _refLineModel );
+                       _refLineView->SetWxVtkBaseView( viewer2D );
+                       _refLineView->SetRange( 2 );
+                       _refLineView->SetZ( 1200 );
 
-               _refLineControl->SetModelView( _refLineModel , _refLineView );
-               viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl );
-               _refLineControl->CreateNewManualContour();
-               _refLineControl->SetActive(true);
-               _refLineView->RefreshContour();
+                       _refLineControl->SetModelView( _refLineModel , _refLineView );
+                       viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl );
+                       _refLineControl->CreateNewManualContour();
+                       _refLineControl->SetActive(true);
+                       _refLineView->RefreshContour();
+
+                       RefreshInterface();
+               }
        }
 }
 
+void wxContourMainFrame::refLineChangeWidth(int width)
+{
+       _refLineView->SetWidthLine(width);
+       _refLineView->RefreshContour();
+
+       RefreshInterface();
+}
+
+
 void wxContourMainFrame::onMirror()
 {
        //AD:02-09
@@ -1671,7 +1724,195 @@ void wxContourMainFrame::onMirror()
        //_refName = "";
 }
 
-void wxContourMainFrame::showAxis(bool show){
+void wxContourMainFrame::onThreshold()
+{
+       int     z = _theViewPanel->GetZ();
+       double range[2];
+
+       vtkImageData * img = getImageData();
+       img->GetScalarRange(range);
+
+       int minTot = floor (range[0]);
+       int maxTot = ceil (range[1]);
+
+       double minMax[2];
+       _pannew->onThresholdInstantChange(minMax);
+       int minVal = floor (minMax[0]);
+       int maxVal = floor (minMax[1]);
+
+       if (!_actorPresent)
+       {
+               if (_imageReslicer==NULL)
+               {
+                       _imageReslicer = vtkImageReslice::New();
+                       _imageReslicer->SetInput( img );
+                       _imageReslicer->SetInformationInput(img);
+                       _imageReslicer->SetResliceAxesDirectionCosines(1,0,0, 0,1,0 ,0,0,1);
+                       _imageReslicer->SetOutputDimensionality(2);
+                       _imageReslicer->SetInterpolationModeToLinear();
+               }
+
+               _imageReslicer->SetResliceAxesOrigin(0,0,z);
+
+               img = _imageReslicer->GetOutput();
+               img->Update();
+               img->UpdateInformation();
+
+               wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView();
+
+               if (_thresholdTable==NULL)
+               {
+                       //Lookup Table
+                       _thresholdTable = vtkLookupTable::New();
+                       _thresholdTable->SetNumberOfTableValues(maxTot+1);
+                       _thresholdTable->SetTableRange(range); 
+                       _thresholdTable->SetAlphaRange(0, 1);
+                       _thresholdTable->SetValueRange(0, 1);
+                       _thresholdTable->SetSaturationRange(0, 0); 
+                       _thresholdTable->SetRampToLinear( );
+               }
+
+               //Assign a fake color for the upper image, and set the white as transparent
+               int i;
+               for(i = minTot; i <= maxTot; i++)
+               {
+                       if( i >= minVal && i <= maxVal )
+                       {
+                               _thresholdTable->SetTableValue(i, 1.0, 0.0, 0.0, 1);
+                       }
+                       else if( i >= minTot && i < minVal )
+                       {
+                               _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
+                       }
+                       else if( i > maxVal && i < maxTot )
+                       {
+                               _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
+                       }
+                       else
+                       {
+                               _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
+                       }
+               }
+               _thresholdTable->Build( );
+       
+               if (_thresholdMapper==NULL)
+               {
+                       _thresholdMapper = vtkImageMapToColors::New( );
+               }
+               
+               _thresholdMapper->SetLookupTable( _thresholdTable );
+               _thresholdMapper->SetInput( img );
+
+               if (_thresholdActor==NULL)
+               {
+                       _thresholdActor = vtkImageActor::New( );
+                       _thresholdActor->SetOpacity( 0.6 );
+                       _thresholdActor->InterpolateOn(  );
+                       _thresholdActor->SetPosition( 0,0, 900-1 );
+               }
+               
+               _thresholdActor->SetInput( _thresholdMapper->GetOutput() );
+
+               baseView->GetRenderer()->AddActor( _thresholdActor );
+               _actorPresent = true;
+       }
+
+       else
+       {
+               _imageReslicer->SetResliceAxesOrigin(0,0,z);
+               img = _imageReslicer->GetOutput();
+               img->Update();
+               img->UpdateInformation();
+
+               //Assign a fake color for the upper image, and set the white as transparent
+               int i;
+               for(i = minTot; i <= maxTot; i++)
+               {
+                       if( i >= minVal && i <= maxVal )
+                       {
+                               _thresholdTable->SetTableValue(i, 1.0, 0.0, 0.0, 1);
+                       }
+                       else if( i >= minTot && i < minVal )
+                       {
+                               _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
+                       }
+                       else if( i > maxVal && i < maxTot )
+                       {
+                               _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
+                       }
+                       else
+                       {
+                               _thresholdTable->SetTableValue(i, 1.0, 1.0, 1.0, 0); //transparent
+                       }
+               }
+
+               _thresholdTable->Build( );
+               _thresholdMapper->SetLookupTable( _thresholdTable );
+               _thresholdMapper->SetInput( img );
+               _thresholdActor->SetInput( _thresholdMapper->GetOutput() );
+       }
+                       /*
+                               vtkImageViewer2* viewer = vtkImageViewer2::New();        
+                               viewer->SetInput( upperImageActor->GetInput() ); 
+                               viewer->SetColorLevel((range[1]-range[0])/2);
+                               viewer->SetColorWindow(range[1]);
+                               viewer->GetRenderer()->AddActor( upperImageActor );
+                               viewer->Render();
+                       */
+       _theViewPanel->RefreshInterface();
+}
+
+
+void wxContourMainFrame::onThresholdChange()
+{
+       if (_actorPresent)
+       {
+               onThreshold();
+       }
+}
+
+void wxContourMainFrame::onThresholdInterpolation(bool interpolate)
+{
+       if (_thresholdActor!=NULL)
+       {
+               if (interpolate)
+               {
+                       _thresholdActor->InterpolateOn( );
+               }
+
+               else
+               {
+                       _thresholdActor->InterpolateOff( );
+               }
+
+               _theViewPanel->RefreshInterface();
+       }
+}
+
+void wxContourMainFrame::onThresholdChangeOpacity (int opacity)
+{
+       if (_actorPresent)
+       {
+               _thresholdActor->SetOpacity(opacity*0.1);
+       }
+
+       _theViewPanel->RefreshInterface();
+}
+
+void wxContourMainFrame::onThresholdRemove()
+{
+       if (_actorPresent)
+       {
+               wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView();
+               baseView->GetRenderer()->RemoveActor( _thresholdActor );
+               _actorPresent = false;
+       }
+
+       _theViewPanel->RefreshInterface();
+}
+
+void wxContourMainFrame::showAxis(bool show)
+{
        _theViewPanel->SetVisibleAxis(show);
        _theViewPanel->Refresh();
 }
@@ -1717,7 +1958,6 @@ int wxContourMainFrame::getWindowLevel(){
 void wxContourMainFrame::onBrigthnessColorWindowLevel(int colorwindow,int windowlevel){
        _theViewPanel->onBrigthnessColorWindowLevel(colorwindow, windowlevel);
 
-       
        RefreshInterface();
 }
 
@@ -2012,7 +2252,10 @@ void wxContourMainFrame::onInformationContourLabels(int typeContourGroup,int sel
 
 void wxContourMainFrame::onSaveResults(std::string directory,std::string namefile, std::string filename, int typeContourGroup){
     SaveValuesXYZ( directory , namefile, typeContourGroup );
-       SaveImageResult( directory , namefile, typeContourGroup);
+
+       vtkImageData* mask, *value;
+       this->getMaskValue(mask, value, typeContourGroup);
+       this->SaveImageResult( directory , namefile, mask, value);
 
        
        FILE *pFile=fopen(filename.c_str(),"w+");
@@ -2172,8 +2415,7 @@ void wxContourMainFrame::SaveValuesXYZ(std::string directory,std::string namefil
        delete contourextractdata;
 }
 
-void wxContourMainFrame::SaveImageResult(std::string directory,std::string namefile, int typeContourGroup)
-{
+void wxContourMainFrame::getMaskValue(vtkImageData* mask,vtkImageData* value,int typeContourGroup){
        wxBusyCursor wait;
        ContourExtractData      *contourextractdata = new ContourExtractData( true );
        //int typeContourGroup = this->_radiolstboxContourGroup->GetSelection();
@@ -2252,20 +2494,19 @@ void wxContourMainFrame::SaveImageResult(std::string directory,std::string namef
                        }
 
                        contourextractdata->SetLstManualContourModel( lstManConModTmp );
-
-
-//                             for (ii=0 ; ii<sizeLstContourThings ; ii++)
-//                             {
-//                                     ContourThing **contourthing = lstContourThings[ii];
-//                                     lstManConMod.push_back( (*contourthing)->getModel() );
-//                             }
-//                             contourextractdata->SetLstManualContourModel( lstManConMod );
-
                        contourextractdata->CalculateImageResult(); // with actual Z
 
                } // for  iContourGroup
        } // for z
 
+       value = contourextractdata->GetVtkImageValueResult();
+       mask = contourextractdata->GetVtkImageMaskResult();
+       delete contourextractdata;
+}
+
+void wxContourMainFrame::SaveImageResult(std::string directory,std::string namefile, vtkImageData* mask,vtkImageData* value)
+{
+       
        std::string temp = directory + "/" + namefile + "-Value.mhd";
 
        wxString filename = crea::std2wx(temp);
@@ -2279,7 +2520,7 @@ void wxContourMainFrame::SaveImageResult(std::string directory,std::string namef
 
 // Image Value
        vtkMetaImageWriter *writerValueImage = vtkMetaImageWriter::New( );
-       writerValueImage->SetInput( contourextractdata->GetVtkImageValueResult() );
+       writerValueImage->SetInput( value );
        writerValueImage->SetFileName( (const char *)filename.mb_str() );
        writerValueImage->SetFileDimensionality( 3 );
        writerValueImage->Write( );
@@ -2298,15 +2539,17 @@ void wxContourMainFrame::SaveImageResult(std::string directory,std::string namef
        filename.append(_T("-Mask.mhd"));*/
 
        vtkMetaImageWriter *writerMaskImage = vtkMetaImageWriter::New( );
-       writerMaskImage->SetInput( contourextractdata->GetVtkImageMaskResult() );
+       writerMaskImage->SetInput( mask );
        writerMaskImage->SetFileName( (const char *)filename.mb_str() );
        writerMaskImage->SetFileDimensionality( 3 );
        writerMaskImage->Write( );
 
        interfMainPanel::getInstance()->setStringInfoPanel( _T("") );
-       delete contourextractdata;
+       
 }
 
+
+
 void wxContourMainFrame::onChangeInstantInstantPanel(std::string name,int value, int minshow, int maxshow){
        if( name.compare( _theViewPanel->getVerticalConceptName() ) == 0){
                _theViewPanel->setActualVertical( value);
@@ -2350,4 +2593,8 @@ void wxContourMainFrame::saveFileWithContoursAutomatique(){
        }else{
                onSave();
        }
-}
\ No newline at end of file
+}
+void wxContourMainFrame::ShowToolsPanel(bool show){
+       _pannew->Show(show);
+}
+