]> Creatis software - creaMaracasVisu.git/blobdiff - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp
DFCH: Manualpaint + imageUndoRedo Big changes, new class for the management of the...
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualPaint / FillFilter.cpp
index 9dc1cb43686f4e2334b74b99411d9c3ba2019a2a..c12e1f9c89491bb8c249af66b52b131c00627638 100644 (file)
-
 #include "FillFilter.h"
 
-
-FillFilter::FillFilter()
-{
-    _tolerancefill      =   50;
-    _distancefill       =   500;
-    _limitRecursionFill =   50000;
-    _auxImageFill       =   NULL;
+FillFilter::FillFilter() {
+       _tolerancefill = 50;
+       _distancefill = 500;
+       _limitRecursionFill = 50000;
+       _auxImageFill = NULL;
 }
 
 //---------------------------------------------------------------------------
-FillFilter::~FillFilter()
-{
-    if (_auxImageFill!=NULL)
-    {
-        _auxImageFill->Delete();
-    }
+FillFilter::~FillFilter() {
+       if (_auxImageFill != NULL)
+       {
+               _auxImageFill->Delete();
+       }
 }
 
 //---------------------------------------------------------------------------
 void FillFilter::SetImage(vtkImageData *image) // virtual
-{
-    baseFilterManualPaint::SetImage(image);
-    if (_auxImageFill!=NULL)
-    {
-        _auxImageFill->Delete();
-    }
+               {
+       baseFilterManualPaint::SetImage(image);
+       if (_auxImageFill != NULL)
+       {
+               _auxImageFill->Delete();
+       }
        _auxImageFill = vtkImageData::New();
-       _auxImageFill->SetDimensions(_maxX+1,_maxY+1,_maxZ+1);
-       _auxImageFill->SetOrigin(0,0,0);
-       _auxImageFill->SetExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
-       _auxImageFill->SetWholeExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
+       _auxImageFill->SetDimensions(_maxX + 1, _maxY + 1, _maxZ + 1);
+       _auxImageFill->SetOrigin(0, 0, 0);
+       _auxImageFill->SetExtent(0, _maxX, 0, _maxY, 0, _maxZ);
+       _auxImageFill->SetWholeExtent(0, _maxX, 0, _maxY, 0, _maxZ);
        _auxImageFill->SetScalarTypeToUnsignedChar();
        _auxImageFill->AllocateScalars();
 }
 
-
 //---------------------------------------------------------------------------
 void FillFilter::Run() // virtual
 {
-    if ((_px>=_minX) && (_px<=_maxX) && (_py>=_minY) && (_py<=_maxY) && (_pz>=_minZ) && (_pz<=_maxZ))
-    {
-        _graylevelbasefill          = _image->GetScalarComponentAsDouble(_px,_py,_pz, 0);
-        _pxfill                     = _px;
-        _pyfill                     = _py;
-        _pzfill                     = _pz;
-        _distbasefill               = _distancefill*_distancefill;
-        _countRecursiveFill         = 0;
-        _countRecursiveFillProblem  = 0;
-        _countProgressingFill       = 0;
-        unsigned char *pImage = (unsigned char *)_auxImageFill->GetScalarPointer();
-        _usingAuxImageFill=false;
-        memset ( pImage , 0 , _maxX*_maxY*_maxZ );
-
-        FillToolRecursive(_px,_py,_pz);
-        printf("--\n");
-
-        int ii,jj,kk;
-        while (_countRecursiveFillProblem!=0)
-        {
-            _countRecursiveFillProblem  = 0;
-            _usingAuxImageFill=true;
-            for(ii=0;ii<=_maxX;ii++)
-            {
-                for(jj=0;jj<=_maxY;jj++)
-                {
-                    for(kk=0;kk<=_maxZ;kk++)
-                    {
-                        pImage=(unsigned char *)_auxImageFill->GetScalarPointer(ii,jj,kk);
-                        if ( (*pImage)==1 )
-                        {
-                            FillToolRecursive(ii,jj,kk);
-                        }
-                    } // for kk
-                } // for jj
-            } //for ii
-            printf("-\n");
-        } // while
-
-    } //if _minX _maxX _minY _maxY _minZ _maxZ
+       if ((_px >= _minX) && (_px <= _maxX) && (_py >= _minY) && (_py <= _maxY)
+                       && (_pz >= _minZ) && (_pz <= _maxZ)) {
+               _graylevelbasefill = _image->GetScalarComponentAsDouble(_px, _py, _pz,
+                               0);
+               _pxfill = _px;
+               _pyfill = _py;
+               _pzfill = _pz;
+               _distbasefill = _distancefill * _distancefill;
+               _countRecursiveFill = 0;
+               _countRecursiveFillProblem = 0;
+               _countProgressingFill = 0;
+               unsigned char *pImage =
+                               (unsigned char *) _auxImageFill->GetScalarPointer();
+               _usingAuxImageFill = false;
+               memset(pImage, 0, _maxX * _maxY * _maxZ);
+
+               FillToolRecursive(_px, _py, _pz);
+               printf("--\n");
+
+               int ii, jj, kk;
+               while (_countRecursiveFillProblem != 0) {
+                       _countRecursiveFillProblem = 0;
+                       _usingAuxImageFill = true;
+                       for (ii = 0; ii <= _maxX; ii++) {
+                               for (jj = 0; jj <= _maxY; jj++) {
+                                       for (kk = 0; kk <= _maxZ; kk++) {
+                                               pImage =
+                                                               (unsigned char *) _auxImageFill->GetScalarPointer(
+                                                                               ii, jj, kk);
+                                               if ((*pImage) == 1) {
+                                                       FillToolRecursive(ii, jj, kk);
+                                               }
+                                       } // for kk
+                               } // for jj
+                       } //for ii
+                       printf("-\n");
+               } // while
+
+       } //if _minX _maxX _minY _maxY _minZ _maxZ
 }
 
-
 //---------------------------------------------------------------------------
-void FillFilter::FillToolRecursive(int px,int py, int pz)
-{
-       this->_MRegion->value = (float) _graylevel;
-    _countRecursiveFill++;
-
-    _countProgressingFill++;
-    if (_countProgressingFill>200000)
-    {
-        printf("R %ld \n", _countRecursiveFill );
-        _countProgressingFill=0;
-    }
-
-    if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
-    {
-        if (_usingAuxImageFill==true)
-        {
-               this->CalculateMinMaxRegion(px,py,pz); //DFCH
-            _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
-        }
-        _tmpDistfill=(px-_pxfill)*(px-_pxfill)  + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
-        _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
-
-        float grayLBFMTOL = _graylevelbasefill-_tolerancefill;
-        float grayLBFPTOL = _graylevelbasefill+_tolerancefill;
-        bool isInRange = false;
-        //DFCH
-        if( _RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL )
-        {
-               isInRange = true;
-        }//fi esle
-        else if( _RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL )
-        {
-               grayLBFMTOL = _RangeMin;
-               isInRange = true;
-        }//fi esle
-        else if( _RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL )
-        {
-               grayLBFPTOL = _RangeMax;
-               isInRange = true;
-        }//fi esle
-        else if(  ( _RangeMin <= _graylevelbasefill ) && ( _graylevelbasefill <= _RangeMax ) )
-        {
-               grayLBFMTOL = _RangeMin;
-               grayLBFPTOL = _RangeMax;
-               isInRange = true;
-        }//fi esle
-
-        if( isInRange )
-        {
-               _auxGrayLevelValidationFill =  (_tmpiglfill!=_graylevel) &&
-                                           (_tmpiglfill>=grayLBFMTOL) &&
-                                           (_tmpiglfill<=grayLBFPTOL) &&
-                                           (_tmpDistfill<=_distbasefill); //DFCH
-        }//fi
-        else
-        {
-               _auxGrayLevelValidationFill = false;
-        }//esle
-        //DFCH
-        /*_auxGrayLevelValidationFill =   (_tmpiglfill!=_graylevel) &&
-                                        (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
-                                        (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
-                                        (_tmpDistfill<=_distbasefill);*/ //DFCH
-
-
-        if (  _auxGrayLevelValidationFill==true )
-        {
-               this->CalculateMinMaxRegion(px,py,pz); //DFCH
-            _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
-
-            if (_countRecursiveFill< _limitRecursionFill)
-            {
-
-                if (_2D3D==0) //2D
-                {
-                    if (_direction==0)  // YZ
-                    {
-                        //FillToolRecursive(px+1,py,pz);
-                        //FillToolRecursive(px-1,py,pz);
-                        FillToolRecursive(px,py+1,pz);
-                        FillToolRecursive(px,py-1,pz);
-                        FillToolRecursive(px,py,pz-1);
-                        FillToolRecursive(px,py,pz+1);
-                    }
-                    if (_direction==1) // XZ
-                    {
-                        FillToolRecursive(px+1,py,pz);
-                        FillToolRecursive(px-1,py,pz);
-                        //FillToolRecursive(px,py+1,pz);
-                        //FillToolRecursive(px,py-1,pz);
-                        FillToolRecursive(px,py,pz-1);
-                        FillToolRecursive(px,py,pz+1);
-                    }
-                    if (_direction==2) // XY
-                    {
-                        FillToolRecursive(px+1,py,pz);
-                        FillToolRecursive(px,py+1,pz);
-                        FillToolRecursive(px-1,py,pz);
-                        FillToolRecursive(px,py-1,pz);
-                        //FillToolRecursive(px,py,pz-1);
-                        //FillToolRecursive(px,py,pz+1);
-                    }
-                } else  {   // 3D
-
-                    FillToolRecursive(px+1,py,pz);
-                    FillToolRecursive(px-1,py,pz);
-                    FillToolRecursive(px,py+1,pz);
-                    FillToolRecursive(px,py-1,pz);
-                    FillToolRecursive(px,py,pz-1);
-                    FillToolRecursive(px,py,pz+1);
-                } // 2D 3D
-
-            } //_countRecursiveFill
-        } // _graylevel
-
-
-        if (  (_auxGrayLevelValidationFill==true ) &&
-              (_countRecursiveFill>= _limitRecursionFill)
-            )
-        {
-            _countRecursiveFillProblem++;
-
-                if (_2D3D==0) //2D
-                {
-                    if (_direction==0)  // YZ
-                    {
-                        //SetAuxImageFill(px+1,py,pz);
-                        //SetAuxImageFill(px-1,py,pz);
-                        SetAuxImageFill(px,py+1,pz);
-                        SetAuxImageFill(px,py-1,pz);
-                        SetAuxImageFill(px,py,pz-1);
-                        SetAuxImageFill(px,py,pz+1);
-                    }
-                    if (_direction==1) // XZ
-                    {
-                        SetAuxImageFill(px+1,py,pz);
-                        SetAuxImageFill(px-1,py,pz);
-                        //SetAuxImageFill(px,py+1,pz);
-                        //SetAuxImageFill(px,py-1,pz);
-                        SetAuxImageFill(px,py,pz-1);
-                        SetAuxImageFill(px,py,pz+1);
-                    }
-                    if (_direction==2) // XY
-                    {
-                        SetAuxImageFill(px+1,py,pz);
-                        SetAuxImageFill(px-1,py,pz);
-                        SetAuxImageFill(px,py+1,pz);
-                        SetAuxImageFill(px,py-1,pz);
-                        //SetAuxImageFill(px,py,pz-1);
-                        //SetAuxImageFill(px,py,pz+1);
-                    }
-                } else  {   // 3D
-
-                    SetAuxImageFill(px+1,py,pz);
-                    SetAuxImageFill(px-1,py,pz);
-                    SetAuxImageFill(px,py+1,pz);
-                    SetAuxImageFill(px,py-1,pz);
-                    SetAuxImageFill(px,py,pz-1);
-                    SetAuxImageFill(px,py,pz+1);
-                } // 2D 3D
-
-        } // _graylevel   //_limitRecursionFill
-
-
-    } //if _minX _maxX _minY _maxY _minZ _maxZ
-
-
-    _countRecursiveFill--;
+void FillFilter::FillToolRecursive(int px, int py, int pz) {
+       _countRecursiveFill++;
+
+       _countProgressingFill++;
+       if (_countProgressingFill > 200000) {
+               printf("R %ld \n", _countRecursiveFill);
+               _countProgressingFill = 0;
+       }
+
+       if ((px >= _minX) && (px <= _maxX) && (py >= _minY) && (py <= _maxY)
+                       && (pz >= _minZ) && (pz <= _maxZ)) {
+               if (_usingAuxImageFill == true) {
+                       this->_IMManager->AddModifiedPixel(px, py, pz); //DFCH
+                       _auxImageFill->SetScalarComponentFromFloat(px, py, pz, 0, 0);
+               }
+               _tmpDistfill = (px - _pxfill) * (px - _pxfill)
+                               + (py - _pyfill) * (py - _pyfill)
+                               + (pz - _pzfill) * (pz - _pzfill);
+               _tmpiglfill = _image->GetScalarComponentAsDouble(px, py, pz, 0);
+
+               float grayLBFMTOL = _graylevelbasefill - _tolerancefill;
+               float grayLBFPTOL = _graylevelbasefill + _tolerancefill;
+               bool isInRange = false;
+               //DFCH
+               if (_RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
+                       isInRange = true;
+               } //fi esle
+               else if (_RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
+                       grayLBFMTOL = _RangeMin;
+                       isInRange = true;
+               } //fi esle
+               else if (_RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL) {
+                       grayLBFPTOL = _RangeMax;
+                       isInRange = true;
+               } //fi esle
+               else if ((_RangeMin <= _graylevelbasefill)
+                               && (_graylevelbasefill <= _RangeMax)) {
+                       grayLBFMTOL = _RangeMin;
+                       grayLBFPTOL = _RangeMax;
+                       isInRange = true;
+               } //fi esle
+
+               if (isInRange) {
+                       _auxGrayLevelValidationFill = (_tmpiglfill != _graylevel)
+                                       && (_tmpiglfill >= grayLBFMTOL)
+                                       && (_tmpiglfill <= grayLBFPTOL)
+                                       && (_tmpDistfill <= _distbasefill); //DFCH
+               } //fi
+               else {
+                       _auxGrayLevelValidationFill = false;
+               } //esle
+                 //DFCH
+               /*_auxGrayLevelValidationFill =   (_tmpiglfill!=_graylevel) &&
+                (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
+                (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
+                (_tmpDistfill<=_distbasefill);*/ //DFCH
+               if (_auxGrayLevelValidationFill == true) {
+                       this->_IMManager->AddModifiedPixel(px, py, pz); //DFCH
+                       _image->SetScalarComponentFromFloat(px, py, pz, 0,
+                                       (float) _graylevel);
+
+                       if (_countRecursiveFill < _limitRecursionFill) {
+
+                               if (_2D3D == 0) //2D
+                                               {
+                                       if (_direction == 0) // YZ
+                                                       {
+                                               //FillToolRecursive(px+1,py,pz);
+                                               //FillToolRecursive(px-1,py,pz);
+                                               FillToolRecursive(px, py + 1, pz);
+                                               FillToolRecursive(px, py - 1, pz);
+                                               FillToolRecursive(px, py, pz - 1);
+                                               FillToolRecursive(px, py, pz + 1);
+                                       }
+                                       if (_direction == 1) // XZ
+                                                       {
+                                               FillToolRecursive(px + 1, py, pz);
+                                               FillToolRecursive(px - 1, py, pz);
+                                               //FillToolRecursive(px,py+1,pz);
+                                               //FillToolRecursive(px,py-1,pz);
+                                               FillToolRecursive(px, py, pz - 1);
+                                               FillToolRecursive(px, py, pz + 1);
+                                       }
+                                       if (_direction == 2) // XY
+                                                       {
+                                               FillToolRecursive(px + 1, py, pz);
+                                               FillToolRecursive(px, py + 1, pz);
+                                               FillToolRecursive(px - 1, py, pz);
+                                               FillToolRecursive(px, py - 1, pz);
+                                               //FillToolRecursive(px,py,pz-1);
+                                               //FillToolRecursive(px,py,pz+1);
+                                       }
+                               } else { // 3D
+
+                                       FillToolRecursive(px + 1, py, pz);
+                                       FillToolRecursive(px - 1, py, pz);
+                                       FillToolRecursive(px, py + 1, pz);
+                                       FillToolRecursive(px, py - 1, pz);
+                                       FillToolRecursive(px, py, pz - 1);
+                                       FillToolRecursive(px, py, pz + 1);
+                               } // 2D 3D
+
+                       } //_countRecursiveFill
+               } // _graylevel
+
+               if ((_auxGrayLevelValidationFill == true)
+                               && (_countRecursiveFill >= _limitRecursionFill)) {
+                       _countRecursiveFillProblem++;
+
+                       if (_2D3D == 0) //2D
+                                       {
+                               if (_direction == 0) // YZ
+                                               {
+                                       //SetAuxImageFill(px+1,py,pz);
+                                       //SetAuxImageFill(px-1,py,pz);
+                                       SetAuxImageFill(px, py + 1, pz);
+                                       SetAuxImageFill(px, py - 1, pz);
+                                       SetAuxImageFill(px, py, pz - 1);
+                                       SetAuxImageFill(px, py, pz + 1);
+                               }
+                               if (_direction == 1) // XZ
+                                               {
+                                       SetAuxImageFill(px + 1, py, pz);
+                                       SetAuxImageFill(px - 1, py, pz);
+                                       //SetAuxImageFill(px,py+1,pz);
+                                       //SetAuxImageFill(px,py-1,pz);
+                                       SetAuxImageFill(px, py, pz - 1);
+                                       SetAuxImageFill(px, py, pz + 1);
+                               }
+                               if (_direction == 2) // XY
+                                               {
+                                       SetAuxImageFill(px + 1, py, pz);
+                                       SetAuxImageFill(px - 1, py, pz);
+                                       SetAuxImageFill(px, py + 1, pz);
+                                       SetAuxImageFill(px, py - 1, pz);
+                                       //SetAuxImageFill(px,py,pz-1);
+                                       //SetAuxImageFill(px,py,pz+1);
+                               }
+                       } else { // 3D
+
+                               SetAuxImageFill(px + 1, py, pz);
+                               SetAuxImageFill(px - 1, py, pz);
+                               SetAuxImageFill(px, py + 1, pz);
+                               SetAuxImageFill(px, py - 1, pz);
+                               SetAuxImageFill(px, py, pz - 1);
+                               SetAuxImageFill(px, py, pz + 1);
+                       } // 2D 3D
+
+               } // _graylevel   //_limitRecursionFill
+
+       } //if _minX _maxX _minY _maxY _minZ _maxZ
+
+       _countRecursiveFill--;
 
 }
 
 //---------------------------------------------------------------------------
-void FillFilter::SetAuxImageFill(int px,int py, int pz)
-{
-    if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
-    {
-       this->CalculateMinMaxRegion(px,py,pz); //DFCH
-        _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
-    }
+void FillFilter::SetAuxImageFill(int px, int py, int pz) {
+       if ((px >= _minX) && (px <= _maxX) && (py >= _minY) && (py <= _maxY)
+                       && (pz >= _minZ) && (pz <= _maxZ)) {
+               this->_IMManager->AddModifiedPixel(px, py, pz); //DFCH
+               _auxImageFill->SetScalarComponentFromFloat(px, py, pz, 0, 1);
+       }
 }
 
-
 //---------------------------------------------------------------------------
-void FillFilter::SetToleranceFill(double tolerancefill)
-{
-    _tolerancefill = tolerancefill;
+void FillFilter::SetToleranceFill(double tolerancefill) {
+       _tolerancefill = tolerancefill;
 }
 
 //---------------------------------------------------------------------------
-void FillFilter::SetDistanceFill(int distancefill)
-{
-    _distancefill = distancefill;
+void FillFilter::SetDistanceFill(int distancefill) {
+       _distancefill = distancefill;
 }
 
 //---------------------------------------------------------------------------
-void FillFilter::SetRangeMin(  int min )
-{
-       _RangeMin  = min;
+void FillFilter::SetRangeMin(int min) {
+       _RangeMin = min;
 }
 
 //---------------------------------------------------------------------------
-void FillFilter::SetRangeMax(  int max )
-{
-       _RangeMax  = max;
+void FillFilter::SetRangeMax(int max) {
+       _RangeMax = max;
 }
 
 //---------------------------------------------------------------------------
-int FillFilter::GetRangeMin( )
-{
-       return( _RangeMin );
+int FillFilter::GetRangeMin() {
+       return (_RangeMin);
 }
 
 //---------------------------------------------------------------------------
-int FillFilter::GetRangeMax(  )
-{
-       return( _RangeMax );
+int FillFilter::GetRangeMax() {
+       return (_RangeMax);
 }