2 #include "FillFilter.h"
5 FillFilter::FillFilter()
8 _2D3D = 1; // 0 2D , 1 true 3D
9 _direction = 0; // 1 XZ , 0 YZ , 2 XY
12 _limitRecursionFill = 100000;
22 //---------------------------------------------------------------------------
23 FillFilter::~FillFilter()
25 if (_auxImageFill!=NULL)
27 _auxImageFill->Delete();
31 //---------------------------------------------------------------------------
32 void FillFilter::SetImage(vtkImageData *image)
37 _image->GetWholeExtent(ext);
46 if (_auxImageFill!=NULL)
48 _auxImageFill->Delete();
50 _auxImageFill = vtkImageData::New();
51 _auxImageFill->SetDimensions(_maxX+1,_maxY+1,_maxZ+1);
52 _auxImageFill->SetOrigin(0,0,0);
53 _auxImageFill->SetExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
54 _auxImageFill->SetWholeExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
55 _auxImageFill->SetScalarTypeToUnsignedChar();
56 _auxImageFill->AllocateScalars();
60 //---------------------------------------------------------------------------
61 void FillFilter::FillTool(int px,int py, int pz)
63 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
65 _graylevelbasefill = _image->GetScalarComponentAsDouble(px,py,pz, 0);
69 _distbasefill = _distancefill*_distancefill;
70 _countRecursiveFill = 0;
71 _countRecursiveFillProblem = 0;
72 _countProgressingFill = 0;
73 unsigned char *pImage = (unsigned char *)_auxImageFill->GetScalarPointer();
74 _usingAuxImageFill=false;
75 memset ( pImage , 0 , _maxX*_maxY*_maxZ );
77 FillToolRecursive(px,py,pz);
81 while (_countRecursiveFillProblem!=0)
83 _countRecursiveFillProblem = 0;
84 _usingAuxImageFill=true;
85 for(ii=0;ii<=_maxX;ii++)
87 for(jj=0;jj<=_maxY;jj++)
89 for(kk=0;kk<=_maxZ;kk++)
91 pImage=(unsigned char *)_auxImageFill->GetScalarPointer(ii,jj,kk);
94 FillToolRecursive(ii,jj,kk);
102 } //if _minX _maxX _minY _maxY _minZ _maxZ
106 //---------------------------------------------------------------------------
107 void FillFilter::FillToolRecursive(int px,int py, int pz)
109 _countRecursiveFill++;
111 _countProgressingFill++;
112 if (_countProgressingFill>200000)
114 printf("R %ld \n", _countRecursiveFill );
115 _countProgressingFill=0;
118 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
120 if (_usingAuxImageFill==true)
122 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
124 _tmpDistfill=(px-_pxfill)*(px-_pxfill) + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
125 _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
127 _auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) &&
128 (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
129 (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
130 (_tmpDistfill<=_distbasefill);
132 if ( _auxGrayLevelValidationFill==true )
134 _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
136 if (_countRecursiveFill< _limitRecursionFill)
141 if (_direction==0) // YZ
143 //FillToolRecursive(px+1,py,pz);
144 //FillToolRecursive(px-1,py,pz);
145 FillToolRecursive(px,py+1,pz);
146 FillToolRecursive(px,py-1,pz);
147 FillToolRecursive(px,py,pz-1);
148 FillToolRecursive(px,py,pz+1);
150 if (_direction==1) // XZ
152 FillToolRecursive(px+1,py,pz);
153 FillToolRecursive(px-1,py,pz);
154 //FillToolRecursive(px,py+1,pz);
155 //FillToolRecursive(px,py-1,pz);
156 FillToolRecursive(px,py,pz-1);
157 FillToolRecursive(px,py,pz+1);
159 if (_direction==2) // XY
161 FillToolRecursive(px+1,py,pz);
162 FillToolRecursive(px,py+1,pz);
163 FillToolRecursive(px-1,py,pz);
164 FillToolRecursive(px,py-1,pz);
165 //FillToolRecursive(px,py,pz-1);
166 //FillToolRecursive(px,py,pz+1);
170 FillToolRecursive(px+1,py,pz);
171 FillToolRecursive(px-1,py,pz);
172 FillToolRecursive(px,py+1,pz);
173 FillToolRecursive(px,py-1,pz);
174 FillToolRecursive(px,py,pz-1);
175 FillToolRecursive(px,py,pz+1);
178 } //_countRecursiveFill
182 if ( (_auxGrayLevelValidationFill==true ) &&
183 (_countRecursiveFill>= _limitRecursionFill)
186 _countRecursiveFillProblem++;
190 if (_direction==0) // YZ
192 //SetAuxImageFill(px+1,py,pz);
193 //SetAuxImageFill(px-1,py,pz);
194 SetAuxImageFill(px,py+1,pz);
195 SetAuxImageFill(px,py-1,pz);
196 SetAuxImageFill(px,py,pz-1);
197 SetAuxImageFill(px,py,pz+1);
199 if (_direction==1) // XZ
201 SetAuxImageFill(px+1,py,pz);
202 SetAuxImageFill(px-1,py,pz);
203 //SetAuxImageFill(px,py+1,pz);
204 //SetAuxImageFill(px,py-1,pz);
205 SetAuxImageFill(px,py,pz-1);
206 SetAuxImageFill(px,py,pz+1);
208 if (_direction==2) // XY
210 SetAuxImageFill(px+1,py,pz);
211 SetAuxImageFill(px-1,py,pz);
212 SetAuxImageFill(px,py+1,pz);
213 SetAuxImageFill(px,py-1,pz);
214 //SetAuxImageFill(px,py,pz-1);
215 //SetAuxImageFill(px,py,pz+1);
219 SetAuxImageFill(px+1,py,pz);
220 SetAuxImageFill(px-1,py,pz);
221 SetAuxImageFill(px,py+1,pz);
222 SetAuxImageFill(px,py-1,pz);
223 SetAuxImageFill(px,py,pz-1);
224 SetAuxImageFill(px,py,pz+1);
227 } // _graylevel //_limitRecursionFill
230 } //if _minX _maxX _minY _maxY _minZ _maxZ
233 _countRecursiveFill--;
237 //---------------------------------------------------------------------------
238 void FillFilter::SetAuxImageFill(int px,int py, int pz)
240 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
242 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
246 //---------------------------------------------------------------------------
247 void FillFilter::BrushTool(int px,int py, int pz)
251 float value=(float)_graylevel;
253 int size = _brushsize-1;
264 if (_direction==0) // YZ
269 if (_direction==1) // XZ
274 if (_direction==2) // XY
286 double xx,yy,zz,rr=size*size;
288 for (i=minX; i<=maxX; i++)
292 for (j=minY; j<=maxY; j++)
296 for (k=minZ; k<=maxZ; k++)
298 if ((i>=_minX) && (i<=_maxX) && (j>=_minY) && (j<=_maxY) && (k>=_minZ) && (k<=_maxZ))
304 _image->SetScalarComponentFromFloat (i,j,k, 0, value );
305 } else if (_brushform==1)
309 _image->SetScalarComponentFromFloat (i,j,k, 0, value );
313 } //if _minX _maxX _minY _maxY _minZ _maxZ
320 printf("ERROR : bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage : Image not set. \n");
326 //---------------------------------------------------------------------------
327 void FillFilter::SetGrayLevel( double graylevel )
329 _graylevel = graylevel;
334 //---------------------------------------------------------------------------
335 void FillFilter::Set2D3D( int dim2D3D )
340 //---------------------------------------------------------------------------
341 void FillFilter::SetToleranceFill(double tolerancefill)
343 _tolerancefill = tolerancefill;
346 //---------------------------------------------------------------------------
347 void FillFilter::SetDistanceFill(int distancefill)
349 _distancefill = distancefill;
352 //---------------------------------------------------------------------------
353 void FillFilter::SetDirection(int direction)
355 _direction = direction;