2 #include "FillFilter.h"
5 FillFilter::FillFilter()
9 _limitRecursionFill = 50000;
13 //---------------------------------------------------------------------------
14 FillFilter::~FillFilter()
16 if (_auxImageFill!=NULL)
18 _auxImageFill->Delete();
22 //---------------------------------------------------------------------------
23 void FillFilter::SetImage(vtkImageData *image) // virtual
25 baseFilterManualPaint::SetImage(image);
26 if (_auxImageFill!=NULL)
28 _auxImageFill->Delete();
30 _auxImageFill = vtkImageData::New();
31 _auxImageFill->SetDimensions(_maxX+1,_maxY+1,_maxZ+1);
32 _auxImageFill->SetOrigin(0,0,0);
33 _auxImageFill->SetExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
34 _auxImageFill->SetWholeExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
35 _auxImageFill->SetScalarTypeToUnsignedChar();
36 _auxImageFill->AllocateScalars();
40 //---------------------------------------------------------------------------
41 void FillFilter::Run() // virtual
43 if ((_px>=_minX) && (_px<=_maxX) && (_py>=_minY) && (_py<=_maxY) && (_pz>=_minZ) && (_pz<=_maxZ))
45 _graylevelbasefill = _image->GetScalarComponentAsDouble(_px,_py,_pz, 0);
49 _distbasefill = _distancefill*_distancefill;
50 _countRecursiveFill = 0;
51 _countRecursiveFillProblem = 0;
52 _countProgressingFill = 0;
53 unsigned char *pImage = (unsigned char *)_auxImageFill->GetScalarPointer();
54 _usingAuxImageFill=false;
55 memset ( pImage , 0 , _maxX*_maxY*_maxZ );
57 FillToolRecursive(_px,_py,_pz);
61 while (_countRecursiveFillProblem!=0)
63 _countRecursiveFillProblem = 0;
64 _usingAuxImageFill=true;
65 for(ii=0;ii<=_maxX;ii++)
67 for(jj=0;jj<=_maxY;jj++)
69 for(kk=0;kk<=_maxZ;kk++)
71 pImage=(unsigned char *)_auxImageFill->GetScalarPointer(ii,jj,kk);
74 FillToolRecursive(ii,jj,kk);
82 } //if _minX _maxX _minY _maxY _minZ _maxZ
86 //---------------------------------------------------------------------------
87 void FillFilter::FillToolRecursive(int px,int py, int pz)
89 _countRecursiveFill++;
91 _countProgressingFill++;
92 if (_countProgressingFill>200000)
94 printf("R %ld \n", _countRecursiveFill );
95 _countProgressingFill=0;
98 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
100 if (_usingAuxImageFill==true)
102 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
104 _tmpDistfill=(px-_pxfill)*(px-_pxfill) + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
105 _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
107 float grayLBFMTOL = _graylevelbasefill-_tolerancefill;
108 float grayLBFPTOL = _graylevelbasefill+_tolerancefill;
109 bool isInRange = false;
111 if( _RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL )
115 else if( _RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL )
117 grayLBFMTOL = _RangeMin;
120 else if( _RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL )
122 grayLBFPTOL = _RangeMax;
125 else if( ( _RangeMin <= _graylevelbasefill ) && ( _graylevelbasefill <= _RangeMax ) )
127 grayLBFMTOL = _RangeMin;
128 grayLBFPTOL = _RangeMax;
134 _auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) &&
135 (_tmpiglfill>=grayLBFMTOL) &&
136 (_tmpiglfill<=grayLBFPTOL) &&
137 (_tmpDistfill<=_distbasefill); //DFCH
141 _auxGrayLevelValidationFill = false;
144 /*_auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) &&
145 (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
146 (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
147 (_tmpDistfill<=_distbasefill);*/ //DFCH
150 if ( _auxGrayLevelValidationFill==true )
152 _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
154 if (_countRecursiveFill< _limitRecursionFill)
159 if (_direction==0) // YZ
161 //FillToolRecursive(px+1,py,pz);
162 //FillToolRecursive(px-1,py,pz);
163 FillToolRecursive(px,py+1,pz);
164 FillToolRecursive(px,py-1,pz);
165 FillToolRecursive(px,py,pz-1);
166 FillToolRecursive(px,py,pz+1);
168 if (_direction==1) // XZ
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);
177 if (_direction==2) // XY
179 FillToolRecursive(px+1,py,pz);
180 FillToolRecursive(px,py+1,pz);
181 FillToolRecursive(px-1,py,pz);
182 FillToolRecursive(px,py-1,pz);
183 //FillToolRecursive(px,py,pz-1);
184 //FillToolRecursive(px,py,pz+1);
188 FillToolRecursive(px+1,py,pz);
189 FillToolRecursive(px-1,py,pz);
190 FillToolRecursive(px,py+1,pz);
191 FillToolRecursive(px,py-1,pz);
192 FillToolRecursive(px,py,pz-1);
193 FillToolRecursive(px,py,pz+1);
196 } //_countRecursiveFill
200 if ( (_auxGrayLevelValidationFill==true ) &&
201 (_countRecursiveFill>= _limitRecursionFill)
204 _countRecursiveFillProblem++;
208 if (_direction==0) // YZ
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);
217 if (_direction==1) // XZ
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);
226 if (_direction==2) // XY
228 SetAuxImageFill(px+1,py,pz);
229 SetAuxImageFill(px-1,py,pz);
230 SetAuxImageFill(px,py+1,pz);
231 SetAuxImageFill(px,py-1,pz);
232 //SetAuxImageFill(px,py,pz-1);
233 //SetAuxImageFill(px,py,pz+1);
237 SetAuxImageFill(px+1,py,pz);
238 SetAuxImageFill(px-1,py,pz);
239 SetAuxImageFill(px,py+1,pz);
240 SetAuxImageFill(px,py-1,pz);
241 SetAuxImageFill(px,py,pz-1);
242 SetAuxImageFill(px,py,pz+1);
245 } // _graylevel //_limitRecursionFill
248 } //if _minX _maxX _minY _maxY _minZ _maxZ
251 _countRecursiveFill--;
255 //---------------------------------------------------------------------------
256 void FillFilter::SetAuxImageFill(int px,int py, int pz)
258 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
260 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
265 //---------------------------------------------------------------------------
266 void FillFilter::SetToleranceFill(double tolerancefill)
268 _tolerancefill = tolerancefill;
271 //---------------------------------------------------------------------------
272 void FillFilter::SetDistanceFill(int distancefill)
274 _distancefill = distancefill;
277 //---------------------------------------------------------------------------
278 void FillFilter::SetRangeMin( int min )
283 //---------------------------------------------------------------------------
284 void FillFilter::SetRangeMax( int max )
289 //---------------------------------------------------------------------------
290 int FillFilter::GetRangeMin( )
295 //---------------------------------------------------------------------------
296 int FillFilter::GetRangeMax( )