]> Creatis software - creaMaracasVisu.git/blobdiff - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/ManualPaintModel.cpp
size of upper panel
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualPaint / ManualPaintModel.cpp
index ab44d0afe8d0c856963e233c53edad95f827a9ce..32d682779874ed9b65493bf13184d5b8c00884de 100644 (file)
@@ -4,25 +4,34 @@
 
 ManualPaintModel::ManualPaintModel()
 {
-    _graylevel  =   0.0;
-    _brushsize  =   1;
-    _brushform  =   0;      // 0 rectangle-box  ,   1 circle-sphere
-    _2D3D       =   0;      // 0 2D             ,   1 true 3D
-    _brushtool  =   0;      // 0 pencil         ,   1 fill
-
-    _minX=0;
-    _minY=0;
-    _minZ=0;
-    _maxX=0;
-    _maxY=0;
-    _maxZ=0;
+    _graylevel          =   0.0;
+    _brushsize          =   1;
+    _brushform          =   0;      // 0 rectangle-box  ,   1 circle-sphere
+    _2D3D               =   1;      // 0 2D             ,   1 true 3D
+    _brushtool          =   0;      // 0 pencil         ,   1 fill
+    _direction          =   0;      // 1 XZ             ,   0 YZ            ,   2 XY
+    _tolerancefill      =   50;
+    _distancefill       =   500;
+    _limitRecursionFill =   100000;
+    _minX               =   0;
+    _minY               =   0;
+    _minZ               =   0;
+    _maxX               =   0;
+    _maxY               =   0;
+    _maxZ               =   0;
+    _auxImageFill       =   NULL;
 }
 
 //---------------------------------------------------------------------------
 ManualPaintModel::~ManualPaintModel()
 {
+    if (_auxImageFill!=NULL)
+    {
+        _auxImageFill->Delete();
+    }
 }
 
+//---------------------------------------------------------------------------
 void ManualPaintModel::SetImage(vtkImageData *image)
 {
     _image=image;
@@ -35,8 +44,23 @@ void ManualPaintModel::SetImage(vtkImageData *image)
     _maxX=ext[1]-ext[0];
     _maxY=ext[3]-ext[2];
     _maxZ=ext[5]-ext[4];
+
+
+    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->SetScalarTypeToUnsignedChar();
+       _auxImageFill->AllocateScalars();
+
 }
 
+//---------------------------------------------------------------------------
 void ManualPaintModel::PaintImage(int px,int py, int pz)
 {
     if (_brushtool==0)
@@ -50,66 +74,234 @@ void ManualPaintModel::PaintImage(int px,int py, int pz)
 }
 
 
+//---------------------------------------------------------------------------
 void ManualPaintModel::FillTool(int px,int py, int pz)
 {
     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;
+        _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 ManualPaintModel::FillToolRecursive(int px,int py, int pz)
 {
+    _countRecursiveFill++;
 
-    double dist=(px-_pxfill) * (px-_pxfill)  + (py-_pyfill) * (py-_pyfill)   + (pz-_pzfill) * (pz-_pzfill);
+    _countProgressingFill++;
+    if (_countProgressingFill>200000)
+    {
+        printf("R %ld \n", _countRecursiveFill );
+        _countProgressingFill=0;
+    }
 
     if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
     {
-        float value=(float)_graylevel;
-        double igl=_image->GetScalarComponentAsDouble(px,py,pz, 0);
-        if (  (igl!=_graylevel) &&
-              (igl>=_graylevelbasefill-_tolerancefill) &&
-              (igl<=_graylevelbasefill+_tolerancefill) &&
-              (dist<=_distbasefill)
-            )
+        if (_usingAuxImageFill==true)
         {
-//            _image->SetScalarComponentFromFloat (px,py,pz, 0, dist+500 );
-            _image->SetScalarComponentFromFloat (px,py,pz, 0, value );
-            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);
+            _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);
+
+        _auxGrayLevelValidationFill =   (_tmpiglfill!=_graylevel) &&
+                                        (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
+                                        (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
+                                        (_tmpDistfill<=_distbasefill);
+
+        if (  _auxGrayLevelValidationFill==true )
+        {
+            _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 ManualPaintModel::BrushTool(int px,int py, int pz)
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetAuxImageFill(int px,int py, int pz)
 {
+    if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
+    {
+        _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
+    }
+}
 
-    printf("EED ManualPaintModel::PaintImage %d %d %d\n", px,py,pz);
+//---------------------------------------------------------------------------
+void ManualPaintModel::BrushTool(int px,int py, int pz)
+{
     if (_image!=NULL)
     {
         float value=(float)_graylevel;
         int i,j,k;
         int size = _brushsize-1;
-        int minX=px-size;
-        int maxX=px+size;
-        int minY=py-size;
-        int maxY=py+size;
-        int minZ=pz-size;
-        int maxZ=pz+size;
+
+        int minX = px-size;
+        int maxX = px+size;
+        int minY = py-size;
+        int maxY = py+size;
+        int minZ = pz-size;
+        int maxZ = pz+size;
+
+        if (_2D3D==0) //2D
+        {
+            if (_direction==0)  // YZ
+            {
+                minX=px;
+                maxX=px;
+            }
+            if (_direction==1) // XZ
+            {
+                minY=py;
+                maxY=py;
+            }
+            if (_direction==2) // XY
+            {
+                minZ=pz;
+                maxZ=pz;
+            }
+        }
+
+        if (_2D3D==1) // 3D
+        {
+        }
+
 
         double xx,yy,zz,rr=size*size;
 
-        printf("EED bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage brushForm=%d\n",_brushform);
         for (i=minX; i<=maxX; i++)
         {
             xx=px-i;
@@ -189,3 +381,8 @@ void ManualPaintModel::SetDistanceFill(int distancefill)
     _distancefill = distancefill;
 }
 
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetDirection(int direction)
+{
+    _direction = direction;
+}