]> 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 a9a84e0b074fb23248bd587d133f58e635732beb..32d682779874ed9b65493bf13184d5b8c00884de 100644 (file)
 
 ManualPaintModel::ManualPaintModel()
 {
-    _graylevel=0.0;
-    _brushsize=1;
+    _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;
+
+    int ext[6];
+    _image->GetWholeExtent(ext);
+    _minX=0;
+    _minY=0;
+    _minZ=0;
+    _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)
+    {
+        BrushTool(px,py,pz);
+    }
+    if (_brushtool==1)
+    {
+        FillTool(px,py,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;
+        _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++;
+
+    _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)
+        {
+            _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::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);
+    }
+}
+
+//---------------------------------------------------------------------------
+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;
 
         for (i=minX; i<=maxX; i++)
         {
+            xx=px-i;
+            xx=xx*xx;
             for (j=minY; j<=maxY; j++)
             {
+                yy=py-j;
+                yy=yy*yy;
                 for (k=minZ; k<=maxZ; k++)
                 {
-                    _image->SetScalarComponentFromFloat (i,j,k, 0, value );
-                }
-            }
-        }
+                    if ((i>=_minX) && (i<=_maxX) && (j>=_minY) && (j<=_maxY) && (k>=_minZ) && (k<=_maxZ))
+                    {
+                        zz=pz-k;
+                        zz=zz*zz;
+                        if (_brushform==0)
+                        {
+                            _image->SetScalarComponentFromFloat (i,j,k, 0, value );
+                        } else if (_brushform==1)
+                        {
+                            if ((xx+yy+zz)<=rr)
+                            {
+                                _image->SetScalarComponentFromFloat (i,j,k, 0, value );
+                            }
+                        } // _brushform
+
+                    } //if _minX _maxX _minY _maxY _minZ _maxZ
+
+                }//k
+            }//j
+        }//i
         _image->Modified();
-        _image->UpdateInformation();
-        _image->Update();
-        _image->UpdateData();
     } else  {
         printf("ERROR : bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage :  Image not set. \n");
-    }
+    } // _image
 }
 
 
 //---------------------------------------------------------------------------
 void ManualPaintModel::SetBrushSize( int brushsize )
 {
-    printf("EED %p ManualPaintModel::SetBrushSize \n", this);
     _brushsize = brushsize;
 }
 
 //---------------------------------------------------------------------------
 void ManualPaintModel::SetGrayLevel( double graylevel )
 {
-    printf("EED %p ManualPaintModel::SetGrayLevel \n", this);
     _graylevel = graylevel;
 }
 
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetBrushForm( int brushform )
+{
+    _brushform = brushform;
+}
+
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetBrushTool( int brushtool )
+{
+    _brushtool = brushtool;
+}
+
+//---------------------------------------------------------------------------
+void ManualPaintModel::Set2D3D( int dim2D3D )
+{
+    _2D3D = dim2D3D;
+}
+
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetToleranceFill(double tolerancefill)
+{
+    _tolerancefill = tolerancefill;
+}
+
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetDistanceFill(int distancefill)
+{
+    _distancefill = distancefill;
+}
+
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetDirection(int direction)
+{
+    _direction = direction;
+}