#include "ManualPaintModel.h" 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; } //--------------------------------------------------------------------------- ManualPaintModel::~ManualPaintModel() { } 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]; } 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; FillToolRecursive(px,py,pz); } //if _minX _maxX _minY _maxY _minZ _maxZ } void ManualPaintModel::FillToolRecursive(int px,int py, int pz) { double dist=(px-_pxfill) * (px-_pxfill) + (py-_pyfill) * (py-_pyfill) + (pz-_pzfill) * (pz-_pzfill); 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) ) { // _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); } } //if _minX _maxX _minY _maxY _minZ _maxZ } void ManualPaintModel::BrushTool(int px,int py, int pz) { printf("EED ManualPaintModel::PaintImage %d %d %d\n", px,py,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; 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; 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; }