]> Creatis software - creaContours.git/blobdiff - lib/Interface_ManagerContour_NDimensions/wxContourMainFrame.cxx
use wx2std
[creaContours.git] / lib / Interface_ManagerContour_NDimensions / wxContourMainFrame.cxx
index e81e73084b2cd0225ef3ecb515e20eb8240cd06d..3070d426e1bf0325c8ae1fa9655246512d548af6 100644 (file)
@@ -72,19 +72,8 @@ 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;
 
+               _instantPanel                           = NULL;
                _refLineControl                         = NULL;
                _refLineModel                           = NULL;
                _refLineView                            = NULL;
@@ -93,48 +82,47 @@ char wxContourMainFrame::COPY = 'C';
                m_notebook_style =wxAUI_NB_TAB_SPLIT | wxAUI_NB_TAB_EXTERNAL_MOVE | wxNO_BORDER;
                m_notebook_theme = 0;   
                //wxContour_ActionCommandsID a;
-               _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];
        
-//-------------------------------------------------------------
+               inredo = 0;
+               inundo = 0;
 
-       /*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);*/
+               _pannew = interfMainPanel::getInstance(this,datadir+"/data/Icons");//, eventHandler);
+               _performingOperation = new PerformingOperation();
 
-       //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;
-       
 
+       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);
                
 
@@ -145,22 +133,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
+       this->configurePanels( );
 
-
-       }
+}
 
 
        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 ){
@@ -170,25 +145,41 @@ char wxContourMainFrame::COPY = 'C';
                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()
+       {
+               delete instance;
+               instance = NULL;
        }
 
        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();
+               //_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;
        }
 
 
@@ -208,45 +199,44 @@ char wxContourMainFrame::COPY = 'C';
        //------------------------------------------------------------------------------------------------------------
        // 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;
        }
 
        //------------------------------------------------------------------------------------------------------------
@@ -587,7 +577,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 );
@@ -635,6 +626,7 @@ void wxContourMainFrame::updateInstantImageData(){
                _theViewPanel->setImageSlice(z);
        }
 }
+
 void wxContourMainFrame::updateInstantAxes(){
 }
 
@@ -709,10 +701,10 @@ void wxContourMainFrame :: createMirrorContourOf ( std::string anExistingKName,
 
        double pnt1X = refPoint1->GetX();
        double pnt1Y = refPoint1->GetY();
-       double pnt1Z = refPoint1->GetZ();
+//     double pnt1Z = refPoint1->GetZ();
        double pnt2X = refPoint2->GetX();
        double pnt2Y = refPoint2->GetY();
-       double pnt2Z = refPoint2->GetZ();
+//     double pnt2Z = refPoint2->GetZ();
 
        double angle = (atan2(pnt2Y - pnt1Y, pnt2X - pnt1X) * 180 / 3.1415926535897932384626433832795)+90;
        vtkTransform *t = vtkTransform::New();
@@ -1033,23 +1025,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() );
@@ -1063,11 +1055,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  );
@@ -1081,7 +1073,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;
 
@@ -1093,7 +1085,7 @@ const double propagationScaling = atof( prop );
   seeds->Initialize();
   seeds->InsertElement( 0, node );
 
-  fastMarching->SetTrialPoints(  seeds  );
+  fastMarching->SetTrialPoints( seeds );
 
   fastMarching->SetSpeedConstant( 1.0 );
   
@@ -1483,8 +1475,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 );
@@ -1548,7 +1540,6 @@ myfile.close();
                }       // if addedModel
        } // if sizeCtrPt
 }
-
 int wxContourMainFrame::GetImageDataSizeZ(){
        return _theViewPanel->GetImageDataSizeZ();
 }
@@ -1611,21 +1602,21 @@ void wxContourMainFrame::referenceLine()
        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);
 
        _refLineModel->AddPoint(50,100,z);
        _refLineModel->AddPoint(80,40,z);
-
-       _refLineControl->AddPoint(50,100,z);
-       _refLineControl->AddPoint(80,40,z);
+       _refLineModel->UpdateSpline();
 
        _refLineView->UpdateViewPoint(0);
        _refLineView->UpdateViewPoint(1);
-
-       _refLineControl->SetCompleteCreation(true);
-       _refLineControl->SetEditable(true);
 */
+
        _refLineControl->SetActive(true);
        _refLineView->RefreshContour();
 }
@@ -1635,7 +1626,9 @@ void wxContourMainFrame::refLineHide()
 {
        if (_refLineControl!=NULL)
        {
-               _refLineView->RemoveCompleteContourActor();     
+               _refLineView->RemoveCompleteContourActor();
+               _refLineControl->SetEditable(false);
+               _refLineControl->SetActive(false);
        }
 }
 
@@ -1654,12 +1647,20 @@ void wxContourMainFrame::refLineShow()
                _refLineControl->SetModelView( _refLineModel , _refLineView );
                viewer2D->GetInteractorStyleBaseView()->AddInteractorStyleMaracas( _refLineControl );
                _refLineControl->CreateNewManualContour();
-               //_refLineControl->SetActive(true);
-               //_refLineControl->SetEditable(true);
+               _refLineControl->SetActive(true);
                _refLineView->RefreshContour();
        }
 }
 
+void wxContourMainFrame::refLineChangeWidth(int width)
+{
+       _refLineView->SetWidthLine(width);
+       _refLineView->RefreshContour();
+
+       RefreshInterface();
+}
+
+
 void wxContourMainFrame::onMirror()
 {
        //AD:02-09
@@ -1694,7 +1695,68 @@ void wxContourMainFrame::onMirror()
        //_refName = "";
 }
 
-void wxContourMainFrame::showAxis(bool show){
+void wxContourMainFrame::onThreshold(int minVal, int maxVal)
+{
+       
+       vtkImageData * img = _theViewPanel->getImageData();
+       
+       double range[2];
+       img->GetScalarRange(range);
+
+       //vtkImageData * fakeImage = new vtkImageData();
+
+       //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( );
+
+
+
+       //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 )
+               {
+                       lookup->SetTableValue(i, 1.0, 0.0, 0.0, 1);
+               }
+               else if( i >= range[0] && i < minVal )
+               {
+                       lookup->SetTableValue(i, 0.0, 0.0, 0.0, 0); //transparent
+               }
+               else if( i > maxVal && i < range[1] )
+               {
+                       lookup->SetTableValue(i, 0.0, 0.0, 0.0, 0); //transparent
+               }
+       }
+               
+               lookup->Build( );
+
+               vtkImageMapToColors *mapperImage = vtkImageMapToColors::New( );
+               mapperImage->SetLookupTable( lookup );
+               mapperImage->SetInput( img );
+               //mapperImage->SetOutputFormatToRGBA( );
+
+               vtkImageActor * upperImageActor = vtkImageActor::New( );
+               upperImageActor->SetInput( mapperImage->GetOutput() );
+               upperImageActor->SetOpacity( 1 );
+
+               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();
+
+               RefreshInterface();
+}
+
+
+void wxContourMainFrame::showAxis(bool show)
+{
        _theViewPanel->SetVisibleAxis(show);
        _theViewPanel->Refresh();
 }
@@ -2035,7 +2097,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+");
@@ -2049,7 +2114,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" );
 
@@ -2194,8 +2260,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();
@@ -2274,20 +2339,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);
@@ -2301,7 +2365,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( );
@@ -2320,15 +2384,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);
@@ -2358,7 +2424,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 
 
@@ -2371,4 +2438,5 @@ void wxContourMainFrame::saveFileWithContoursAutomatique(){
        }else{
                onSave();
        }
-}
\ No newline at end of file
+}
+