]> Creatis software - creaContours.git/blobdiff - lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx
*** empty log message ***
[creaContours.git] / lib / Interface_ManagerContour_NDimensions / wxContourMainFrame.cxx
index 335d165fd741c0027e86f921c6aa433255f41cf9..4cfa08134be989b9946325c498bb01b7ab4ca905 100644 (file)
@@ -55,6 +55,10 @@ char wxContourMainFrame::COPY = 'C';
                //_actualInstant                                = NULL;
                _numberOfVariablesStatistics = 6+1;
 
+               _refLineControl                         = NULL;
+               _refLineModel                           = NULL;
+               _refLineView                            = NULL;
+
                // set up default notebook style
 //             m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER;
 //             m_notebook_theme = 0;   
@@ -68,65 +72,58 @@ char wxContourMainFrame::COPY = 'C';
                m_mgr.SetManagedWindow(this);
                _creatingContoursActive         = false;
                _theViewPanel                           = NULL;
-//             _modelManager                           = NULL;
+
                _instantPanel                           = NULL;
-//             _buttonsBar                                     = NULL;
-//             _gridPanel                                      = NULL; 
-//             _drawToolsPanel                         = NULL;
-//             _operationsToolsPanel           = NULL;
-//             _autoFormsPanel                         = NULL; 
-//             _standardToolsPanel                     = NULL;
-//             _editionToolsPanel                      = NULL;
-//             _listViewPanel                          = NULL;
-//             _sceneManager                           = NULL;
-               //_actualInstant                                = NULL;
+               _refLineControl                         = NULL;
+               _refLineModel                           = NULL;
+               _refLineView                            = NULL;
 
                // set up default notebook style
                m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER;
                m_notebook_theme = 0;   
                //wxContour_ActionCommandsID a;
-               _numberOfVariablesStatistics = 6+1;
+               _numberOfVariablesStatistics = 7;
 
+               _datadir = datadir;
 
-               _performingOperation                    = new PerformingOperation();
-//JCP 17 - 10 - 2008
-
+       
        inredo = 0;
        inundo = 0;
 
-       kernelManager = new KernelManagerContour(images,datadir+"/data/");
-       //kernelManager->setVectImages(images);
-       //kernelManager->initializeEnvironment();
-                       
-       //vtkImageData* selectedimage = kernelManager->getVectImages()[0];
-       
-//-------------------------------------------------------------
+       interfMainPanel* pannew = interfMainPanel::getInstance(parent,datadir+"/data/Icons");//, eventHandler);
+       _performingOperation                    = new PerformingOperation();
+
 
-       /*frame = new wxContourMainFrame(_builder->getImSourceEnv(), _builder->getImSectionEnv(), _builder->getAxesEnv(),  _builder->getContourEnv(),NULL, wxID_ANY, wxT("ROI Application Sample"), wxPoint(50,50), wxSize(800, 600)); 
-       frame->Show(TRUE);*/
 
-       //Creating the evtHandler of the panels
-       //wxContourEventHandler * eventHandler = new wxContourEventHandler();
+       if(images.size() > 0){
+               this->setVectImages(images);
+       }
+
+}
 
-       //Creating the window that will show the panels
+void wxContourMainFrame::setVectImages( std::vector<vtkImageData*> images ){
 
-       //Getting the parent for the panels ( using aui )
-       wxAuiNotebook * notebook = this->createNotebook();
+       #if defined(__GNUC__)
+               std::string str_home(getenv("HOME"));
+       #elif defined(_WIN32)
+                       std::string str_home(getenv("USERPROFILE"));
+       #endif
+               std::string strCreaContourDataTmp = str_home + "/.creaContourDataTemp/";
 
-       //JCP 17 - 11 - 08
-       //wxInstantChooserPanel * instantPanel                          = new wxInstantChooserPanel( notebook, "Instant Chooser", true);
-       //JCP 17 - 11 - 08
        std::vector<std::string> conceptNameVect;
        std::vector<int> conceptSizeVect;
-       
 
+       wxAuiNotebook * notebook = this->createNotebook();              
 
-       _instantPanel                           = new wxInstantChooserPanel( notebook, "Instant Chooser", true, false, "c" );
-       _theViewPanel                           = new wxContourViewPanel( kernelManager->getSourceImage(), notebook );  
 
+       kernelManager = new KernelManagerContour( images , _datadir+"/data/" , strCreaContourDataTmp );
 
 
-    kernelManager->getConceptsInformation(conceptNameVect, conceptSizeVect);
+       _instantPanel                           = new wxInstantChooserPanel( notebook, "Instant Chooser", true, false, "c" );
+       _theViewPanel                           = new wxContourViewPanel( kernelManager->getSourceImage(), notebook );  
+               
+//-------------------------------------------------------------
+       kernelManager->getConceptsInformation(conceptNameVect, conceptSizeVect);
        _instantPanel->addConcepts(conceptNameVect, conceptSizeVect);
                
 
@@ -137,22 +134,9 @@ char wxContourMainFrame::COPY = 'C';
        //*******************changeInstant();
        _theViewPanel->setVerticalConcept( "Axe Depth", data->getMinValue(), data->getMaxValue(), data->getMinShowedValue(),  data->getMaxShowedValue(), data->getActualValue() );
 
-       //eventHandler->setModelManager( kernelManager->getOutlineModelManager() );
-       //eventHandler->setViewPanel( _theViewPanel );
-       //_theViewPanel->initializeScenceManager();
-       //eventHandler->setInstantChooserPanel( _instantPanel );
-       
-       //bool successConfiuration = eventHandler->configureEventsHandling();
-
-       //successConfiuration &= this->configurePanels( notebook );
        this->configurePanels( notebook );
 
-       interfMainPanel* pannew = interfMainPanel::getInstance(parent,datadir+"/data/Icons");//, eventHandler);
-
-//JCP 17 -10 - 2008
-
-
-       }
+}
 
 
        wxContourMainFrame* wxContourMainFrame :: getInstance(wxWindow* parent, wxWindowID id,const wxString& title,const wxPoint& pos,const wxSize& size,std::vector<vtkImageData*> images, long style,std::string datadir ){
@@ -475,7 +459,8 @@ void wxContourMainFrame :: deleteContours( std::vector<std::string>  keyNamesVec
 }
 
 void wxContourMainFrame :: deleteContour( std::string theKeyName ){
-       /*manualContourModel                    * cModel;
+       /*
+       manualContourModel                      * cModel;
        manualViewBaseContour           * cViewer;
        manualContourBaseControler      * cControler;
 
@@ -694,17 +679,18 @@ void wxContourMainFrame :: createMirrorContourOf ( std::string anExistingKName,
 {
        std::string cloneName = kernelManager->createCopyContourOf( anExistingKName, instantNoTouchData );
        manualContourModel * manualModel = kernelManager->getOutlineByKeyName(cloneName);
-       manualContourModel * refModel = kernelManager->getOutlineByKeyName(_refName);
 
-       manualPoint * refPoint1 = refModel->GetManualPoint(0);
-       manualPoint * refPoint2 = refModel->GetManualPoint(1);
+       manualPoint * refPoint1 = _refLineModel->GetManualPoint(0);
+       manualPoint * refPoint2 = _refLineModel->GetManualPoint(1);
 
        double pnt1X = refPoint1->GetX();
        double pnt1Y = refPoint1->GetY();
+//     double pnt1Z = refPoint1->GetZ();
        double pnt2X = refPoint2->GetX();
        double pnt2Y = refPoint2->GetY();
+//     double pnt2Z = refPoint2->GetZ();
+
        double angle = (atan2(pnt2Y - pnt1Y, pnt2X - pnt1X) * 180 / 3.1415926535897932384626433832795)+90;
-printf("ang=%f\n",angle);
        vtkTransform *t = vtkTransform::New();
 
        t->PostMultiply();
@@ -905,6 +891,454 @@ vtkImageData* wxContourMainFrame::getImageData(){
        return _theViewPanel->getImageData();
 }
 
+void wxContourMainFrame::onSegmentationOneSliceITK(wxString distance, wxString sigma, wxString alfa, wxString beta, wxString propagation, wxString iterations, wxString inflation)
+{
+       //JCP 20-10-08 Undo redo implementation
+       saveState();
+       //JCP 20-10-08 Undo redo implementation
+       
+       wxBusyCursor wait;
+       int                                     x                                       = _theViewPanel->GetX();
+       int                                     y                                       = _theViewPanel->GetY();
+       int                                     z                                       = _theViewPanel->GetZ();
+       SegmentationOneSliceITK( x,y,z,distance, sigma, alfa, beta, propagation, iterations, inflation);
+       RefreshInterface();
+}
+
+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;
+
+  //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;
+
+  //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;
+
+  //Tercer tipo de conversión
+  typedef itk::RescaleIntensityImageFilter< 
+                               InternalImageType, 
+                               OutputImageType >   CastFilterType3;
+
+  //Cuarto tipo de conversión
+  typedef itk::RescaleIntensityImageFilter< 
+                               OutputImageType, 
+                               OutputImageType >   CastFilterType4;
+
+  ThresholdingFilterType::Pointer thresholder = ThresholdingFilterType::New();
+                        
+  thresholder->SetLowerThreshold( 0.0 );
+  thresholder->SetUpperThreshold( 128 );
+
+  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;
+
+  ConnectorType::Pointer connector= ConnectorType::New();
+  ConnectorType2::Pointer connector2= ConnectorType2::New();
+  
+
+  CastFilterType::Pointer filter=CastFilterType::New();
+  CastFilterType2::Pointer filter2=CastFilterType2::New();
+
+  connector->SetInput( imagedata );
+  filter2->SetInput(connector->GetOutput());
+
+  typedef   itk::CurvatureAnisotropicDiffusionImageFilter< 
+                               InternalImageType, 
+                               InternalImageType >  SmoothingFilterType;
+
+  SmoothingFilterType::Pointer smoothing = SmoothingFilterType::New();
+
+  typedef   itk::GradientMagnitudeRecursiveGaussianImageFilter< 
+                               InternalImageType, 
+                               InternalImageType >  GradientFilterType;
+
+  typedef   itk::SigmoidImageFilter<                               
+                               InternalImageType, 
+                               InternalImageType >  SigmoidFilterType;
+
+  GradientFilterType::Pointer  gradientMagnitude = GradientFilterType::New();
+
+  SigmoidFilterType::Pointer sigmoid = SigmoidFilterType::New();
+
+  sigmoid->SetOutputMinimum(  0.0  );
+  sigmoid->SetOutputMaximum(  255.0  );
+
+
+  typedef  itk::FastMarchingImageFilter< 
+                              InternalImageType, 
+                              InternalImageType >    FastMarchingFilterType;
+
+
+  FastMarchingFilterType::Pointer  fastMarching = FastMarchingFilterType::New();
+
+  typedef  itk::GeodesicActiveContourLevelSetImageFilter< InternalImageType, 
+                InternalImageType >    GeodesicActiveContourFilterType;
+  GeodesicActiveContourFilterType::Pointer geodesicActiveContour = 
+                                     GeodesicActiveContourFilterType::New();
+
+  typedef  itk::ZeroCrossingImageFilter< 
+                              InternalImageType, 
+                              InternalImageType >    ZeroCrossingFilterType;
+ZeroCrossingFilterType::Pointer zeroCrossing =
+                                                                       ZeroCrossingFilterType::New();
+
+const double propagationScaling = atof( prop );
+
+  geodesicActiveContour->SetPropagationScaling( propagationScaling );
+  geodesicActiveContour->SetCurvatureScaling( 1.0 );
+  geodesicActiveContour->SetAdvectionScaling( 1.0 );
+
+  geodesicActiveContour->SetMaximumRMSError( 0.02 );
+  int it=atoi( iter );
+  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->SetTimeStep( 0.125 );
+  smoothing->SetNumberOfIterations(  5 );
+  smoothing->SetConductanceParameter( 9.0 );
+
+
+  const double sigma = atof( sigm );
+  gradientMagnitude->SetSigma(  sigma  );
+
+  const double alpha =  atof( alf );
+  const double beta  =  atof( bet );
+
+  sigmoid->SetAlpha( alpha );
+  sigmoid->SetBeta(  beta  );
+  
+  typedef FastMarchingFilterType::NodeContainer  NodeContainer;
+  typedef FastMarchingFilterType::NodeType       NodeType;
+
+  NodeContainer::Pointer seeds = NodeContainer::New();
+
+  InternalImageType::IndexType  seedPosition;
+  seedPosition[0] = x;
+  seedPosition[1] = y;
+
+  const double initialDistance = atof( distanc );
+
+  NodeType node;
+
+  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
+    {
+               
+       connector2->Update();
+       vtkImageData *idata = connector2->GetOutput();
+
+       vtkMarchingContourFilter* cntVTK = vtkMarchingContourFilter::New( );
+       
+       cntVTK->SetInput( idata );
+       
+       cntVTK->SetNumberOfContours( 1 );
+       cntVTK->SetValue( 0, 255 );
+       cntVTK->Update( );
+       cntVTK->UpdateInformation();
+               
+       vtkCleanPolyData* cpd = vtkCleanPolyData::New( );
+       cpd->SetInput( cntVTK->GetOutput( ) );
+       cpd->Update( );
+       cpd->UpdateInformation();
+
+       vtkPolyDataConnectivityFilter* conn = vtkPolyDataConnectivityFilter::New( );
+       conn->SetExtractionModeToLargestRegion( );
+       conn->SetInput( cpd->GetOutput( ) );
+       conn->Update( );
+       conn->UpdateInformation();
+
+       vtkStripper* vtkstripper = vtkStripper::New( );
+       vtkstripper->SetInput( conn->GetOutput() );
+       vtkstripper->Update();
+       vtkstripper->UpdateInformation();
+
+
+       vtkPolyData* polyDataResult =  cntVTK->GetOutput();
+       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();*/
+
+       cntVTK          -> Delete();
+       cpd                     -> Delete();
+       conn            -> Delete();
+
+
+//--Calculating control points
+
+       std::vector<double> vecX;
+       std::vector<double> vecY;
+       std::vector<double> vecXo;
+       std::vector<double> vecYo;
+       std::vector<double>::iterator vecXoi;
+       std::vector<double>::iterator vecYoi;
+       std::vector<double> vecZ;
+
+       std::vector<double> vecCtrlPointX;
+       std::vector<double> vecCtrlPointY;
+       std::vector<double> vecCtrlPointZ;
+
+
+       double *p;
+       double xAct=0;
+       double yAct=0;
+       int ii,size=polyDataResult->GetNumberOfPoints();
+ofstream myfile;
+myfile.open ("C:/Creatis/example2.txt");
+
+       size=polyDataResult->GetNumberOfPoints();
+       for (ii=0;ii<size;ii++)
+       {
+               if(ii==0)
+               {
+                       xAct=x;
+                       yAct=y;
+               }
+               p       = polyDataResult->GetPoint(ii);
+               double x=p[0];
+               double y=p[1];
+               /*if(fabs(yAct-y)>20)
+               {
+                       if((xAct-x)>1 || (xAct-x)<-1)
+                       {
+                       vecX.push_back( p[0] );
+                       vecY.push_back( p[1] );
+                       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;
+                       vecZ.push_back( -900 );
+                       xAct=x;
+                       yAct=y;
+                       }
+                       else
+                       {
+                               vecXo.push_back(p[0]);
+                               vecYo.push_back(p[1]);
+                       }
+                       
+               }
+               else*/ if(fabs(xAct-x)>11)
+               {
+                       vecXo.push_back(p[0]);
+                       vecYo.push_back(p[1]);
+               }
+               else
+               {
+               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;
+               vecY.push_back( p[1] );
+               vecZ.push_back( -900 );
+               xAct=x;
+               yAct=y;
+               }
+               
+               
+       }
+
+       while(!vecXo.empty())
+       {
+               vecX.push_back(vecXo.back());
+               std::cout<<" x Siguiente "<<vecXo.back();
+               vecXo.pop_back();
+               vecZ.push_back( -900 );
+       }
+       while(!vecYo.empty())
+       {
+               vecY.push_back(vecYo.back());
+                       vecYo.pop_back();
+       }
+       myfile.close();
+
+       /*for(int l=0;l<vecX.size();l++)
+       {
+               if(l==0)
+               {
+            vecXo.push_back(p[0]);
+                       vecYo.push_back(p[1]);
+               }
+               else
+               {
+                       if(vecXoi[l-1]==)
+                       {
+                       }
+               }
+
+       }*/
+
+       ExtractControlPoints2D *extractcontrolpoints2d = new ExtractControlPoints2D();
+
+       extractcontrolpoints2d->SetContour( &vecX , &vecY , &vecZ );
+       
+int method=2;
+       if (method==0){
+               extractcontrolpoints2d->GetInitialControlPoints( &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
+       }
+       else if (method==1){
+               extractcontrolpoints2d->GetControlPoints(  &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
+       }
+       else if (method==2){
+               extractcontrolpoints2d->SetSamplingControlPoints( 15 );
+               extractcontrolpoints2d->GetSamplingControlPoints(  &vecCtrlPointX , &vecCtrlPointY , &vecCtrlPointZ );
+       }
+       //--Adding contour to the system
+
+       std::vector<int> actualInstantVector;
+       _instantPanel->getInstant( actualInstantVector );
+       actualInstantVector[1]=z;
+
+       int j,sizeCtrPt = vecCtrlPointX.size();
+       
+       manualContourModel *manModelContour =  kernelManager->factoryManualContourModel( typeofcontour );
+       manModelContour->SetNumberOfPointsSpline( ((sizeCtrPt/100)+1)*100 );
+       if (sizeCtrPt>=3){
+               for (j=0 ; j<sizeCtrPt ; j++)
+               {
+                       manModelContour->AddPoint( vecCtrlPointX[j] , vecCtrlPointY[j] , vecCtrlPointZ[j]  );
+               } // for
+               std::string theName;
+               //theName = _modelManager->createOutline( manModelContour, actualInstantVector );
+               theName = kernelManager->createOutline( manModelContour, actualInstantVector );
+               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->configureViewControlTo(theName, manModelContour, spc, typeofcontour);
+                       //_theViewPanel->getSceneManager()->configureViewControlTo( theName, manModelContour,spc, typeofcontour ) ;
+               }       // if addedModel
+       } // if sizeCtrPt
+
+               
+                
+                WriterType::Pointer writer = WriterType::New();
+         CastFilterType3::Pointer caster = CastFilterType3::New();
+                
+                caster->SetInput( gradientMagnitude->GetOutput() );
+                writer->SetInput( caster->GetOutput() );
+                writer->SetFileName("Gradient Magnitude.png");
+                caster->SetOutputMinimum(   0 );
+                caster->SetOutputMaximum( 255 );
+                writer->Update();
+               
+                CastFilterType3::Pointer caster2 = CastFilterType3::New();
+                WriterType::Pointer writer2 = WriterType::New();
+
+                caster2->SetInput( sigmoid->GetOutput() );
+                writer2->SetInput( caster2->GetOutput() );
+                writer2->SetFileName("Sigmoid.png");
+                caster2->SetOutputMinimum(   0 );
+                caster2->SetOutputMaximum( 255 );
+                writer2->Update();
+
+                CastFilterType3::Pointer caster3 = CastFilterType3::New();
+                WriterType::Pointer writer3 = WriterType::New();
+
+                caster3->SetInput( fastMarching->GetOutput() );
+                writer3->SetInput( caster3->GetOutput() );
+                writer3->SetFileName("FastMarching.bmp");
+                caster3->SetOutputMinimum(   0 );
+                caster3->SetOutputMaximum( 255 );
+                writer3->Update();
+
+                CastFilterType3::Pointer caster4 = CastFilterType3::New();
+                WriterType::Pointer writer4 = WriterType::New();
+
+                caster4->SetInput( geodesicActiveContour->GetOutput() );
+                writer4->SetInput( caster4->GetOutput() );
+                writer4->SetFileName("GeodesicActiveContour.png");
+                caster4->SetOutputMinimum(   0 );
+                caster4->SetOutputMaximum( 255 );
+                writer4->Update();
+
+                CastFilterType3::Pointer caster5 = CastFilterType3::New();
+                WriterType::Pointer writer5 = WriterType::New();
+
+                caster5->SetInput( zeroCrossing->GetOutput() );
+                writer5->SetInput( caster5->GetOutput() );
+                writer5->SetFileName("ZeroCrossing.bmp");
+                caster5->SetOutputMinimum(   0 );
+                caster5->SetOutputMaximum( 255 );
+                writer5->Update();
+    }
+  catch( itk::ExceptionObject & excep )
+    {
+    std::cerr << "Exception caught !" << std::endl;
+    std::cerr << excep << std::endl;
+    }
+}
+
 void wxContourMainFrame::onSegmentationOneSlice(int isovalue,int sampling,int method){
        
        //JCP 20-10-08 Undo redo implementation
@@ -1025,8 +1459,8 @@ myfile.close();
        {
                id      = polyDataResult->GetLines()->GetData()->GetValue(ii);
                p       = polyDataResult->GetPoint(id);
-               double x=p[0];
-               double y=p[1];
+//             double x=p[0];
+//             double y=p[1];
                vecX.push_back( p[0] );
                vecY.push_back( p[1] );
                vecZ.push_back( -900 );
@@ -1127,117 +1561,95 @@ 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];
-       
+
        vtkImageData *vtkimagedata = _theViewPanel->getImageData();
-       vtkimagedata->UpdateInformation();
-       vtkimagedata->SetUpdateExtent(vtkimagedata->GetWholeExtent());
-       vtkimagedata->Update();
-       vtkImageData _data = vtkimagedata;
-       _data->GetSpacing(spc);
-       //_vtkbasedata_1 = new vtkBaseData();
-       //_vtkbasedata_1->SetMarImageData(marimagedata);        
-       //_imageviewer2D_1->SetVtkBaseData( _vtkbasedata_1 );
-       //_imageviewer2D_1->Configure();
-
-
-       // Contorno 1
-       manualContourControler _manContourControl_1     = new manualContourControler();
-       manualContourModel _mContourModel_1     = new manualContourModel();
-       manualViewContour _mViewContour_1 = new manualViewContour();
-       _mViewContour_1->SetModel( _mContourModel_1 );
-//     _mViewContour_1->SetWxVtkBaseView( _imageviewer2D_1 );
-       _mViewContour_1->SetRange( 2 );
-       _mViewContour_1->SetZ( 1200 );
-
-
-//EED 3 oct 2006
-       _mViewContour_1->SetSpacing(spc);
-
-
-//EED 3 oct 2006
-       _mViewContour_1->SetColorNormalContour(0, 0, 1);
-       _mViewContour_1->SetColorEditContour(0, 0.5, 0.5);
-
-       _manContourControl_1->SetModelView( _mContourModel_1 , _mViewContour_1 );
-//     _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manContourControl_1 );
-       _manContourControl_1->CreateNewManualContour();
-       _manContourControl_1->SetActive(false);
-       _mViewContour_1->RefreshContour();
-
-       // Rectangulo
-//     _manRoiControl  = new manualRoiControler();
-//     _mContourModel  = new manualContourModel();
-//     _mViewRoi               = new manualViewRoi();
-       _mViewRoi->SetModel( _mContourModel );
-       _mViewRoi->SetWxVtkBaseView( _imageviewer2D_1 );
-       _mViewRoi->SetRange( 2 );
-       _mViewRoi->SetZ( 1200 );
-
-//EED 3 oct 2006
-       _mViewRoi->SetSpacing(spc);
-
-//     _manRoiControl->SetModelView( _mContourModel , _mViewRoi );
-//     _imageviewer2D_1->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _manRoiControl );
-//     _manRoiControl->CreateNewManualContour();
-//     _manRoiControl->SetActive(true);
-//     _mViewRoi->RefreshContour();
-
-CreateNewPoint( 0,0);
-
-       Refresh();      
+       vtkimagedata->GetSpacing(spc);
 
-*/
+       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 );
 
+       _refLineView->SetSpacing(spc);
 
+       _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();
 
-       //Crea una linea de referencia
-       manualContourModel * refLine = kernelManager->factoryManualContourModel(6);
+       double z = _refLineControl->GetZ();
+/*
+       _refLineControl->AddPoint(50,100,z);
+       _refLineControl->AddPoint(80,40,z);
+       _refLineControl->SetCompleteCreation(true);
 
-       std::vector<int> instantVector;
-       _instantPanel->getInstant( instantVector );
-       std::string nameLine = kernelManager->createOutline(refLine, instantVector);
-       bool addedModel = nameLine.compare("") != 0;
-       if( addedModel )
-       {
-               double spc[3];
-               _theViewPanel->getSpacing(spc);                                 
-               _theViewPanel->getSceneManager()->configureViewControlTo( nameLine, refLine,spc , 6);
-       }       
+       _refLineModel->AddPoint(50,100,z);
+       _refLineModel->AddPoint(80,40,z);
+       _refLineModel->UpdateSpline();
 
-       _refName = nameLine;
+       _refLineView->UpdateViewPoint(0);
+       _refLineView->UpdateViewPoint(1);
+*/
+
+       _refLineControl->SetActive(true);
+       _refLineView->RefreshContour();
+}
 
+//Hides the referenceLine
+void wxContourMainFrame::refLineHide()
+{
+       if (_refLineControl!=NULL)
+       {
+               _refLineView->RemoveCompleteContourActor();
+               _refLineControl->SetEditable(false);
+               _refLineControl->SetActive(false);
+       }
 }
 
+//Shows the referenceLine
+void wxContourMainFrame::refLineShow()
+{
+       if (_refLineControl!=NULL)
+       {
+               wxVtkBaseView * viewer2D = _theViewPanel->getWxVtkBaseView();
+
+               _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();
+       }
+}
 
 void wxContourMainFrame::onMirror()
 {
        //AD:02-09
        std::vector<std::string> currentSelection = _theViewPanel->getSelectedObjects();
        std::vector<std::string> filterCurrentSelection;
-       
-       std::vector<std::string>::iterator iter;
-       for (iter=currentSelection.begin(); iter!=currentSelection.end(); ++iter)
-       {
-               //Diferente de la linea de referencia
-               if ((_refName.compare(*iter))!=0)
-               {
-                       filterCurrentSelection.push_back(*iter);        
-               }
-       }
 
        std::vector<int> tempVector;
        _instantPanel->getInstant( tempVector );
     _performingOperation->reset();
        _performingOperation->setStartCommand( COPY );
        _performingOperation->setStartOperationInstantVector( tempVector );
-       _performingOperation->setKeyNamesOperationElems( filterCurrentSelection );
+       _performingOperation->setKeyNamesOperationElems( currentSelection );
 
-       //AD:02-09
        char theStartCommand = _performingOperation->getStartCommand();
        if (  theStartCommand == COPY )
        {
@@ -1255,8 +1667,8 @@ void wxContourMainFrame::onMirror()
                }               
        }
 
-       deleteContour( _refName );
-       _refName = "";
+       //deleteContour( _refName );
+       //_refName = "";
 }
 
 void wxContourMainFrame::showAxis(bool show){
@@ -1614,7 +2026,8 @@ void wxContourMainFrame::onSaveResults(std::string directory,std::string namefil
        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,tmpString.c_str() );
+               fprintf(pFile,"-- \t %d-Size \t SizeRange \t Min \t Max \t Ave \t StDv \t" , iTitle );
        }
        fprintf(pFile,"\n" );
 
@@ -1923,7 +2336,8 @@ void wxContourMainFrame::onSnakePressed(){
 
                wxDialog* dialog = new wxDialog(this, -1, wxString(_T("Snake")));
                wxPanel* panel = new wxPanel(dialog,-1); 
-               wxStaticText* sttext = new wxStaticText(panel, -1, wxString(_T("Panel para snake")));
+               //              wxStaticText* sttext = new wxStaticText(panel, -1, wxString(_T("Panel para snake")));
+         new wxStaticText(panel, -1, wxString(_T("Panel para snake")));
                dialog->ShowModal();
        } // if