From: Eduardo Davila Date: Wed, 3 Nov 2010 07:55:06 +0000 (+0000) Subject: *** empty log message *** X-Git-Tag: ManualPaint~8 X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=commitdiff_plain;h=9e00f1118ca3093ed12dd7d49d312b85ae417994;p=creaMaracasVisu.git *** empty log message *** --- diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/BrushFilter.cpp b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/BrushFilter.cpp new file mode 100644 index 0000000..311072d --- /dev/null +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/BrushFilter.cpp @@ -0,0 +1,262 @@ + +#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) + { + 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; +} + + diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/BrushFilter.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/BrushFilter.h new file mode 100644 index 0000000..03af3fa --- /dev/null +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/BrushFilter.h @@ -0,0 +1,75 @@ +#ifndef _BRUSH_FILTER_H_ +#define _BRUSH_FILTER_H_ + +#include + + +class BrushFilter { +public: + BrushFilter(); + virtual ~BrushFilter(); + + void SetImage(vtkImageData *image); + void SetPoint(int px,int py, int pz); + void SetBrushSize( int brushsize ); + void SetBrushForm( int brushform ); + void SetBrushTool( int brushtool ); + void Set2D3D( int dim2D3D ); + void SetGrayLevel( double graylevel ); + void SetDirection(int direction); + void FindMinMaxBrush(int &minxX,int &maxX,int &minY,int &maxY,int &minZ,int &maxZ,int &size); + void ResetGeneralMinMax(); + void SetGeneralMinMax(int minX,int maxX,int minY,int maxY,int minZ,int maxZ); + void Run(); + + +private: + vtkImageData *_image; + int _px; // start point of the brush + int _py; + int _pz; + int _pMinX; // General min max of many brush actions + int _pMinY; + int _pMinZ; + int _pMaxX; + int _pMaxY; + int _pMaxZ; + int _minX; // min max of the image + int _maxX; + int _minY; + int _maxY; + int _minZ; + int _maxZ; + int _brushsize; + int _brushform; + int _brushtool; + bool _2D3D; + double _graylevel; + + +// EED Borrame +// double _tolerancefill; +// int _distancefill; +// double _graylevelbasefill; +// int _direction; +// int _pxfill; +// int _pyfill; +// int _pzfill; +// double _distbasefill; +// double _tmpDistfill; +// double _tmpiglfill; +// long int _countRecursiveFill; +// long int _countRecursiveFillProblem; +// vtkImageData *_auxImageFill; +// bool _usingAuxImageFill; +// bool _auxGrayLevelValidationFill; +// long int _countProgressingFill; +// long int _limitRecursionFill; +// void SetAuxImageFill(int px,int py, int pz); + +protected: + +}; + + +#endif // _BRUSH_FILTER_H_ diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp new file mode 100644 index 0000000..32d6827 --- /dev/null +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp @@ -0,0 +1,388 @@ + +#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; +} diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.h b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.h new file mode 100644 index 0000000..a0d7af8 --- /dev/null +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.h @@ -0,0 +1,68 @@ +#ifndef _MANUAL_PAINT_MODEL_H_ +#define _MANUAL_PAINT_MODEL_H_ + +#include + + +class ManualPaintModel { +public: + ManualPaintModel(); + virtual ~ManualPaintModel(); + + void SetImage(vtkImageData *image); + void PaintImage(int px,int py, int pz); + void SetBrushSize( int brushsize ); + void SetBrushForm( int brushform ); + void SetBrushTool( int brushtool ); + void Set2D3D( int dim2D3D ); + void SetGrayLevel( double graylevel ); + + void FillTool(int px,int py, int pz); + void FillToolRecursive(int px,int py, int pz); + + void BrushTool(int px,int py, int pz); + void SetToleranceFill(double tolerancefill); + void SetDistanceFill(int distancefill); + void SetDirection(int direction); + +private: + vtkImageData *_image; + int _minX; + int _maxX; + int _minY; + int _maxY; + int _minZ; + int _maxZ; + int _brushsize; + int _brushform; + int _brushtool; + bool _2D3D; + double _graylevel; + double _tolerancefill; + int _distancefill; + double _graylevelbasefill; + int _direction; + + int _pxfill; + int _pyfill; + int _pzfill; + double _distbasefill; + double _tmpDistfill; + double _tmpiglfill; + long int _countRecursiveFill; + long int _countRecursiveFillProblem; + vtkImageData *_auxImageFill; + bool _usingAuxImageFill; + bool _auxGrayLevelValidationFill; + long int _countProgressingFill; + long int _limitRecursionFill; + + + void SetAuxImageFill(int px,int py, int pz); + +protected: + +}; + + +#endif // _MANUAL_PAINT_MODEL_H_