X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FmaracasVisuLib%2Fsrc%2Finterface%2FwxWindows%2Fwidgets%2FmanualPaint%2FManualPaintModel.cpp;h=32d682779874ed9b65493bf13184d5b8c00884de;hb=ce96cc4630ea5d769ff8d6ab2ba73ad03d5f113c;hp=ab44d0afe8d0c856963e233c53edad95f827a9ce;hpb=23b33a3a7e3f42eacbaad218510fb77e27aa9c2f;p=creaMaracasVisu.git diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/ManualPaintModel.cpp b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/ManualPaintModel.cpp index ab44d0a..32d6827 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/ManualPaintModel.cpp +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/ManualPaintModel.cpp @@ -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; +}