]> Creatis software - creaContours.git/blobdiff - lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx
*** empty log message ***
[creaContours.git] / lib / Interface_ManagerContour_NDimensions / wxContourMainFrame.cxx
index c126f7c3e2f21771a4445aacd571f4efdcd85f22..80caa583baf24919e62ffee61709d9b9a1f01d11 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>
 
 //----------------------------------------------------------------------------------------------------------------
@@ -58,6 +52,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 +76,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;
@@ -157,8 +161,7 @@ void wxContourMainFrame::setVectImages( std::vector<vtkImageData*> images ){
 
        void wxContourMainFrame :: resetInstance()
        {
-               delete instance;
-               instance = NULL;
+               instance->Destroy();
        }
 
        wxContourMainFrame :: ~wxContourMainFrame()
@@ -166,6 +169,8 @@ void wxContourMainFrame::setVectImages( std::vector<vtkImageData*> images ){
 
                _pannew->Close();
                interfMainPanel::resetInstance();
+               delete kernelManager;
+               instance = NULL;
                //_pannew->Destroy();
                //delete _pannew;
 
@@ -589,14 +594,15 @@ void wxContourMainFrame::changeInstant()
                kernelManager->setInstant(instantVect);
                //_modelManager->setInstant( _actualInstant );
                
+           onThresholdChange();
                updateInstantOutlines();
                updateInstantImageData();
                updateInstantAxes();
-
-               
 }
-void wxContourMainFrame :: updateInstantOutlines(){
-       
+
+
+void wxContourMainFrame :: updateInstantOutlines()
+{
        _theViewPanel->removeSceneContours();
        _theViewPanel->addNameWrapperToScene();
 
@@ -613,7 +619,8 @@ std::string wxContourMainFrame::getNameWrapping(int i){
        return kernelManager->getNameWrapping(i);
 }
 
-void wxContourMainFrame::updateInstantImageData(){
+void wxContourMainFrame::updateInstantImageData()
+{
        std::vector<int> inst;
        _instantPanel->getInstant(inst);
 
@@ -627,9 +634,11 @@ void wxContourMainFrame::updateInstantImageData(){
        }
 }
 
-void wxContourMainFrame::updateInstantAxes(){
+void wxContourMainFrame::updateInstantAxes()
+{
 }
 
+
 void wxContourMainFrame::onChangeDeep(int val){
        _instantPanel->setConceptValue( "Axe Depth", (int)val );        
        changeInstant();
@@ -794,7 +803,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;
@@ -923,177 +933,176 @@ void wxContourMainFrame::onSegmentationOneSliceITK(wxString distance, wxString s
 
 void wxContourMainFrame::SegmentationOneSliceITK(int x, int y, int z, wxString distanc, wxString sigm, wxString alf, wxString bet, wxString prop, wxString iter, wxString inflation)
 {
-       
        int typeofcontour = 1;
        //Image Data
        vtkImageData    *imagedata      = getImageData();
        
        //Tipo de pixeles a utilizar internamente en ITK
-  typedef   float  InternalPixelType;
-  const     unsigned int    Dimension = 2;
-  typedef itk::Image< InternalPixelType, Dimension >  InternalImageType;
+       typedef   float  InternalPixelType;
+       const     unsigned int    Dimension = 2;
+       typedef itk::Image< InternalPixelType, Dimension >  InternalImageType;
 
-  //Tipo de pixeles de salida 1
-  typedef unsigned char OutputPixelType;
-  typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
+       //Tipo de pixeles de salida 1
+       typedef unsigned char OutputPixelType;
+       typedef itk::Image< OutputPixelType, Dimension > OutputImageType;
 
-  //Tipo de pixeles de salida 2
-  typedef unsigned short OutputPixelType2;
-  typedef itk::Image< OutputPixelType2, Dimension > OutputImageType2;
+       //Tipo de pixeles de salida 2
+       typedef unsigned short OutputPixelType2;
+       typedef itk::Image< OutputPixelType2, Dimension > OutputImageType2;
 
-  //Definición del thresholder
-  typedef itk::BinaryThresholdImageFilter< 
-                        InternalImageType, 
-                        OutputImageType    >    ThresholdingFilterType;
-  
-  //Definición del primer filtro de conversión de pixeles
-  typedef itk::CastImageFilter<
-               OutputImageType, OutputImageType2 >  CastFilterType;
+       //DefiniciÛn del thresholder
+       typedef itk::BinaryThresholdImageFilter< 
+                                                       InternalImageType, 
+                                                       OutputImageType    >    ThresholdingFilterType;
+         
+       //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
-  typedef itk::CastImageFilter<
-               OutputImageType2, InternalImageType >  CastFilterType2;
+       //DefiniciÛn del segundo tipo de conversiÛn de pixeles
+       typedef itk::CastImageFilter<
+                               OutputImageType2, InternalImageType >  CastFilterType2;
 
-  //Tercer tipo de conversión
-  typedef itk::RescaleIntensityImageFilter< 
-                               InternalImageType, 
-                               OutputImageType >   CastFilterType3;
+       //Tercer tipo de conversiÛn
+       typedef itk::RescaleIntensityImageFilter< 
+                                                               InternalImageType, 
+                                                               OutputImageType >   CastFilterType3;
 
-  //Cuarto tipo de conversión
-  typedef itk::RescaleIntensityImageFilter< 
-                               OutputImageType, 
-                               OutputImageType >   CastFilterType4;
+       //Cuarto tipo de conversiÛn
+       typedef itk::RescaleIntensityImageFilter< 
+                                                               OutputImageType, 
+                                                               OutputImageType >   CastFilterType4;
 
-  ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New();
-                        
-  thresholder->SetLowerThreshold( 0.0 );
-  thresholder->SetUpperThreshold( 128 );
+       ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New();
+                               
+       thresholder->SetLowerThreshold( 0.0 );
+       thresholder->SetUpperThreshold( 128 );
 
-  thresholder->SetOutsideValue(  255  );
-  thresholder->SetInsideValue(  0 );
+       thresholder->SetOutsideValue(  255  );
+       thresholder->SetInsideValue(  0 );
 
-  //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;
+       //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;
 
-  ConnectorType::Pointer connector= ConnectorType::New();
-  ConnectorType2::Pointer connector2= ConnectorType2::New();
-  
+       ConnectorType::Pointer connector= ConnectorType::New();
+       ConnectorType2::Pointer connector2= ConnectorType2::New();
+         
 
-  CastFilterType::Pointer filter=CastFilterType::New();
-  CastFilterType2::Pointer filter2=CastFilterType2::New();
+       CastFilterType::Pointer filter=CastFilterType::New();
+       CastFilterType2::Pointer filter2=CastFilterType2::New();
 
-  connector->SetInput( imagedata );
-  filter2->SetInput(connector->GetOutput());
+       connector->SetInput( imagedata );
+       filter2->SetInput(connector->GetOutput());
 
-  typedef   itk::CurvatureAnisotropicDiffusionImageFilter< 
-                               InternalImageType, 
-                               InternalImageType >  SmoothingFilterType;
+       typedef   itk::CurvatureAnisotropicDiffusionImageFilter< 
+                                                               InternalImageType, 
+                                                               InternalImageType >  SmoothingFilterType;
 
-  SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New();
+       SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New();
 
-  typedef   itk::GradientMagnitudeRecursiveGaussianImageFilter< 
-                               InternalImageType, 
-                               InternalImageType >  GradientFilterType;
+       typedef   itk::GradientMagnitudeRecursiveGaussianImageFilter< 
+                                                               InternalImageType, 
+                                                               InternalImageType >  GradientFilterType;
 
-  typedef   itk::SigmoidImageFilter<                               
-                               InternalImageType, 
-                               InternalImageType >  SigmoidFilterType;
+       typedef   itk::SigmoidImageFilter<                               
+                                                               InternalImageType, 
+                                                               InternalImageType >  SigmoidFilterType;
 
-  GradientFilterType::Pointer  gradientMagnitude = GradientFilterType::New();
+       GradientFilterType::Pointer  gradientMagnitude = GradientFilterType::New();
 
-  SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();
+       SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();
 
-  sigmoid->SetOutputMinimum(  0.0  );
-  sigmoid->SetOutputMaximum(  255.0  );
+       sigmoid->SetOutputMinimum(  0.0  );
+       sigmoid->SetOutputMaximum(  255.0  );
 
 
-  typedef  itk::FastMarchingImageFilter< 
-                              InternalImageType, 
-                              InternalImageType >    FastMarchingFilterType;
+       typedef  itk::FastMarchingImageFilter< 
+                                                               InternalImageType, 
+                                                               InternalImageType >    FastMarchingFilterType;
 
 
-  FastMarchingFilterType::Pointer  fastMarching = FastMarchingFilterType::New();
+       FastMarchingFilterType::Pointer  fastMarching = FastMarchingFilterType::New();
 
-  typedef  itk::GeodesicActiveContourLevelSetImageFilter< InternalImageType, 
-                InternalImageType >    GeodesicActiveContourFilterType;
-  GeodesicActiveContourFilterType::Pointer geodesicActiveContour = 
-                                     GeodesicActiveContourFilterType::New();
+       typedef  itk::GeodesicActiveContourLevelSetImageFilter< InternalImageType, 
+                                       InternalImageType >    GeodesicActiveContourFilterType;
+       GeodesicActiveContourFilterType::Pointer geodesicActiveContour = 
+                                                                               GeodesicActiveContourFilterType::New();
 
-  typedef  itk::ZeroCrossingImageFilter< 
-                              InternalImageType, 
-                              InternalImageType >    ZeroCrossingFilterType;
-ZeroCrossingFilterType::Pointer zeroCrossing =
-                                                                       ZeroCrossingFilterType::New();
+       typedef  itk::ZeroCrossingImageFilter< 
+                                                               InternalImageType, 
+                                                               InternalImageType >    ZeroCrossingFilterType;
+       ZeroCrossingFilterType::Pointer zeroCrossing =
+                                                       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->SetPropagationScaling( propagationScaling );
+       geodesicActiveContour->SetCurvatureScaling( 1.0 );
+       geodesicActiveContour->SetAdvectionScaling( 1.0 );
 
-  geodesicActiveContour->SetMaximumRMSError( 0.02 );
-  int it=atoi( iter );
-  geodesicActiveContour->SetNumberOfIterations( it );
+       geodesicActiveContour->SetMaximumRMSError( 0.02 );
+       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->SetFeatureImage( sigmoid->GetOutput() );
-  
-  zeroCrossing->SetInput( geodesicActiveContour->GetOutput() );
-  //thresholder->SetInput( zeroCrossing->GetOutput() );
-  thresholder->SetInput( geodesicActiveContour->GetOutput() );
-  connector2->SetInput( thresholder->GetOutput()  );
-  
+       smoothing->SetInput( filter2->GetOutput() );
+       gradientMagnitude->SetInput( smoothing->GetOutput() );
+       sigmoid->SetInput( gradientMagnitude->GetOutput() );
+       fastMarching->SetInput( sigmoid->GetOutput() );
+       geodesicActiveContour->SetInput( fastMarching->GetOutput() );
+       geodesicActiveContour->SetFeatureImage( sigmoid->GetOutput() );
+         
+       zeroCrossing->SetInput( geodesicActiveContour->GetOutput() );
+       //thresholder->SetInput( zeroCrossing->GetOutput() );
+       thresholder->SetInput( geodesicActiveContour->GetOutput() );
+       connector2->SetInput( thresholder->GetOutput()  );
+         
 
-  smoothing->SetTimeStep( 0.125 );
-  smoothing->SetNumberOfIterations(  5 );
-  smoothing->SetConductanceParameter( 9.0 );
+       smoothing->SetTimeStep( 0.125 );
+       smoothing->SetNumberOfIterations(  5 );
+       smoothing->SetConductanceParameter( 9.0 );
 
 
-  const double sigma = atof( sigm );
-  gradientMagnitude->SetSigma(  sigma  );
+       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  );
-  
-  typedef FastMarchingFilterType::NodeContainer  NodeContainer;
-  typedef FastMarchingFilterType::NodeType       NodeType;
+       sigmoid->SetAlpha( alpha );
+       sigmoid->SetBeta(  beta  );
+         
+       typedef FastMarchingFilterType::NodeContainer  NodeContainer;
+       typedef FastMarchingFilterType::NodeType       NodeType;
 
-  NodeContainer::Pointer seeds = NodeContainer::New();
+       NodeContainer::Pointer seeds = NodeContainer::New();
 
-  InternalImageType::IndexType  seedPosition;
-  seedPosition[0] = x;
-  seedPosition[1] = y;
+       InternalImageType::IndexType  seedPosition;
+       seedPosition[0] = x;
+       seedPosition[1] = y;
 
-  const double initialDistance = atof( distanc );
+       const double initialDistance = atof( crea::wx2std(distanc).c_str() );
 
-  NodeType node;
+       NodeType node;
 
-  const double seedValue = - initialDistance;
+       const double seedValue = - initialDistance;
 
-  node.SetValue( seedValue );
-  node.SetIndex( seedPosition );
-       
-  seeds->Initialize();
-  seeds->InsertElement( 0, node );
-
-  fastMarching->SetTrialPoints(  seeds  );
-
-  fastMarching->SetSpeedConstant( 1.0 );
-  
-  fastMarching->SetOutputSize( 
-           connector->GetOutput()->GetBufferedRegion().GetSize() );
-  
-  fastMarching->SetStoppingValue( 800 );
-  try
+       node.SetValue( seedValue );
+       node.SetIndex( seedPosition );
+               
+       seeds->Initialize();
+       seeds->InsertElement( 0, node );
+
+       fastMarching->SetTrialPoints( seeds );
+
+       fastMarching->SetSpeedConstant( 1.0 );
+         
+       fastMarching->SetOutputSize( 
+                       connector->GetOutput()->GetBufferedRegion().GetSize() );
+         
+       fastMarching->SetStoppingValue( 800 );
+       try
     {
                
        connector2->Update();
@@ -1126,26 +1135,26 @@ 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();
 
-//EED
-       /*
-ofstream myfile;
-myfile.open ("C:/Creatis/example.txt");
-myfile << "\n";
-polyDataResult->Print(myfile);
-myfile << "-------------------------------------\n";
-polyDataResult->GetLines()->Print(myfile);
-myfile.close();*/
+       //EED
+               /*
+       ofstream myfile;
+       myfile.open ("C:/Creatis/example.txt");
+       myfile << "\n";
+       polyDataResult->Print(myfile);
+       myfile << "-------------------------------------\n";
+       polyDataResult->GetLines()->Print(myfile);
+       myfile.close();*/
 
        cntVTK          -> Delete();
        cpd                     -> Delete();
        conn            -> Delete();
 
 
-//--Calculating control points
+       //--Calculating control points
 
        std::vector<double> vecX;
        std::vector<double> vecY;
@@ -1164,8 +1173,8 @@ myfile.close();*/
        double xAct=0;
        double yAct=0;
        int ii,size=polyDataResult->GetNumberOfPoints();
-ofstream myfile;
-myfile.open ("C:/Creatis/example2.txt");
+       ofstream myfile;
+       myfile.open ("C:/Creatis/example2.txt");
 
        size=polyDataResult->GetNumberOfPoints();
        for (ii=0;ii<size;ii++)
@@ -1188,7 +1197,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;
                        }
@@ -1208,11 +1217,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;
                }
@@ -1223,9 +1232,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())
        {
@@ -1254,7 +1263,7 @@ myfile.open ("C:/Creatis/example2.txt");
 
        extractcontrolpoints2d->SetContour( &vecX , &vecY , &vecZ );
        
-int method=2;
+       int method=2;
        if (method==0){
                extractcontrolpoints2d->GetInitialControlPoints( &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
        }
@@ -1479,7 +1488,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] );
        }
 
@@ -1576,49 +1585,53 @@ 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 );
+               vtkInteractorStyleBaseView* style = (vtkInteractorStyleBaseView*)viewer2D->GetInteractorStyleBaseView();
+               style->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
@@ -1626,9 +1639,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();
+               }
        }
 }
 
@@ -1637,18 +1655,24 @@ 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 );
+                       vtkInteractorStyleBaseView* style = (vtkInteractorStyleBaseView*)viewer2D->GetInteractorStyleBaseView();
+                       style->AddInteractorStyleMaracas( _refLineControl );
+                       _refLineControl->CreateNewManualContour();
+                       _refLineControl->SetActive(true);
+                       _refLineView->RefreshContour();
+
+                       RefreshInterface();
+               }
        }
 }
 
@@ -1695,66 +1719,193 @@ void wxContourMainFrame::onMirror()
        //_refName = "";
 }
 
-void wxContourMainFrame::onThreshold(int minVal, int maxVal)
+void wxContourMainFrame::onThreshold()
 {
-       
-       vtkImageData * img = _theViewPanel->getImageData();
-       
+       int     z = _theViewPanel->GetZ();
        double range[2];
+
+       vtkImageData * img = getImageData();
        img->GetScalarRange(range);
 
-       //vtkImageData * fakeImage = new vtkImageData();
+       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();
+               }
 
-       //Lookup Table
-       vtkLookupTable *lookup = vtkLookupTable::New();
-       lookup->SetNumberOfTableValues(range[1]+1);
-       lookup->SetTableRange(range); 
-       lookup->SetAlphaRange(0, 1);
-       lookup->SetValueRange(0, 1);
-       lookup->SetSaturationRange(0, 0); 
-       lookup->SetRampToLinear( );
+               _imageReslicer->SetResliceAxesOrigin(0,0,z);
 
+               img = _imageReslicer->GetOutput();
+               img->Update();
+               img->UpdateInformation();
 
+               wxVtkBaseView * baseView = _theViewPanel->getWxVtkBaseView();
 
-       //Assign a fake color for the upper image, and set the white as transparent
-       for(int i = range[0]; i < range[1]; i++)
-       {
-               if( i >= minVal && i <= maxVal )
+               if (_thresholdTable==NULL)
                {
-                       lookup->SetTableValue(i, 1.0, 0.0, 0.0, 1);
+                       //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( );
                }
-               else if( i >= range[0] && i < minVal )
+
+               //Assign a fake color for the upper image, and set the white as transparent
+               int i;
+               for(i = minTot; i <= maxTot; i++)
                {
-                       lookup->SetTableValue(i, 0.0, 0.0, 0.0, 0); //transparent
+                       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
+                       }
                }
-               else if( i > maxVal && i < range[1] )
+               _thresholdTable->Build( );
+       
+               if (_thresholdMapper==NULL)
                {
-                       lookup->SetTableValue(i, 0.0, 0.0, 0.0, 0); //transparent
+                       _thresholdMapper = vtkImageMapToColors::New( );
                }
-       }
                
-               lookup->Build( );
+               _thresholdMapper->SetLookupTable( _thresholdTable );
+               _thresholdMapper->SetInput( img );
 
-               vtkImageMapToColors *mapperImage = vtkImageMapToColors::New( );
-               mapperImage->SetLookupTable( lookup );
-               mapperImage->SetInput( img );
-               //mapperImage->SetOutputFormatToRGBA( );
+               if (_thresholdActor==NULL)
+               {
+                       _thresholdActor = vtkImageActor::New( );
+                       _thresholdActor->SetOpacity( 0.6 );
+                       _thresholdActor->InterpolateOn(  );
+                       _thresholdActor->SetPosition( 0,0, 900-1 );
+               }
+               
+               _thresholdActor->SetInput( _thresholdMapper->GetOutput() );
 
-               vtkImageActor * upperImageActor = vtkImageActor::New( );
-               upperImageActor->SetInput( mapperImage->GetOutput() );
-               upperImageActor->SetOpacity( 1 );
+               baseView->GetRenderer()->AddActor( _thresholdActor );
+               _actorPresent = true;
+       }
 
-               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();
+       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
+                       }
+               }
 
-               RefreshInterface();
+               _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);
@@ -1802,7 +1953,6 @@ int wxContourMainFrame::getWindowLevel(){
 void wxContourMainFrame::onBrigthnessColorWindowLevel(int colorwindow,int windowlevel){
        _theViewPanel->onBrigthnessColorWindowLevel(colorwindow, windowlevel);
 
-       
        RefreshInterface();
 }
 
@@ -2438,4 +2588,8 @@ void wxContourMainFrame::saveFileWithContoursAutomatique(){
        }else{
                onSave();
        }
-}
\ No newline at end of file
+}
+void wxContourMainFrame::ShowToolsPanel(bool show){
+       _pannew->Show(show);
+}
+