--- /dev/null
+
+#include "BrushFilter.h"
+
+
+BrushFilter::BrushFilter()
+{
+ _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
+ _minX = 0;
+ _minY = 0;
+ _minZ = 0;
+ _maxX = 0;
+ _maxY = 0;
+ _maxZ = 0;
+
+ _pMinX = 0;
+ _pMinY = 0;
+ _pMinZ = 0;
+ _pMaxX = 0;
+ _pMaxY = 0;
+ _pMaxZ = 0;
+
+}
+
+//---------------------------------------------------------------------------
+BrushFilter::~BrushFilter()
+{
+}
+
+//---------------------------------------------------------------------------
+void BrushFilter::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];
+
+}
+
+//---------------------------------------------------------------------------
+void BrushFilter::ResetGeneralMinMax()
+{
+ _pMinX=10000;
+ _pMinY=10000;
+ _pMinZ=10000;
+ _pMaxX=-10000;
+ _pMaxY=-10000;
+ _pMaxZ=-10000;
+}
+
+
+//---------------------------------------------------------------------------
+void BrushFilter::SetGeneralMinMax(int minX,int maxX,int minY,int maxY,int minZ,int maxZ)
+{
+ if (_pMinX>minX)
+ {
+ _pMinX=minX;
+ }
+
+ if (_pMinY>minY)
+ {
+ _pMinY=minY;
+ }
+
+ if (_pMinZ>minZ)
+ {
+ _pMinZ=minZ;
+ }
+
+ if (_pMaxX<maxX)
+ {
+ _pMaxX=maxX;
+ }
+
+ if (_pMaxY<maxY)
+ {
+ _pMaxY=maxY;
+ }
+
+ if (_pMaxZ<maxZ)
+ {
+ _pMaxZ=maxZ;
+ }
+
+}
+
+
+//---------------------------------------------------------------------------
+void BrushFilter::FindMinMaxBrush(int &minxX,int &maxX,int &minY,int &maxY,int &minZ,int &maxZ,int &size)
+{
+ size = _brushsize-1;
+ minX = _px-size;
+ maxX = _px+size;
+ minY = _py-size;
+ maxY = _py+size;
+ minZ = _pz-size;
+ 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
+ {
+ }
+
+ if (minX<_minX)
+ {
+ minX=_minX;
+ }
+
+ if (minY<_minY)
+ {
+ minY=_minY;
+ }
+
+ if (minZ<_minZ)
+ {
+ minZ=_minZ;
+ }
+
+ if (maxX>_maxX)
+ {
+ maxX=_maxX;
+ }
+
+ if (maxY>_maxY)
+ {
+ maxY=_maxY;
+ }
+
+ if (maxZ>_maxZ)
+ {
+ maxZ=_maxZ;
+ }
+
+ //--
+ SetGeneralMinMax(minX,maxX,minY,maxY,minZ,maxZ);
+}
+
+
+
+//---------------------------------------------------------------------------
+void BrushFilter::Run()
+{
+ if (_image!=NULL)
+ {
+ float value=(float)_graylevel;
+ int i,j,k;
+
+ int size;
+ int minX,maxX,minY,maxY,minZ,maxZ;
+ FindMinMaxBrush(minxX,maxX,minY,maxY,minZ,maxZ,size);
+
+ 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++)
+ {
+// 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();
+ } else {
+ printf("ERROR : bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage : Image not set. \n");
+ } // _image
+}
+
+
+//---------------------------------------------------------------------------
+void BrushFilter::SetBrushSize( int brushsize )
+{
+ _brushsize = brushsize;
+}
+
+//---------------------------------------------------------------------------
+void BrushFilter::SetGrayLevel( double graylevel )
+{
+ _graylevel = graylevel;
+}
+
+//---------------------------------------------------------------------------
+void BrushFilter::SetBrushForm( int brushform )
+{
+ _brushform = brushform;
+}
+
+//---------------------------------------------------------------------------
+void BrushFilter::SetBrushTool( int brushtool )
+{
+ _brushtool = brushtool;
+}
+
+//---------------------------------------------------------------------------
+void BrushFilter::Set2D3D( int dim2D3D )
+{
+ _2D3D = dim2D3D;
+}
+
+//---------------------------------------------------------------------------
+void BrushFilter::SetDirection(int direction)
+{
+ _direction = direction;
+}
+
+//---------------------------------------------------------------------------
+void BrushFilter::Set(int px,int py, int pz)
+{
+ _px=px;
+ _py=py;
+ _pz=pz;
+}
+
+
--- /dev/null
+
+#include "ManualPaintModel.h"
+
+
+ManualPaintModel::ManualPaintModel()
+{
+ _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;
+
+ 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++)
+ {
+ 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();
+ } else {
+ printf("ERROR : bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage : Image not set. \n");
+ } // _image
+}
+
+
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetBrushSize( int brushsize )
+{
+ _brushsize = brushsize;
+}
+
+//---------------------------------------------------------------------------
+void ManualPaintModel::SetGrayLevel( double graylevel )
+{
+ _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;
+}