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 this->_MRegion->value = (float) _graylevel;
90 _countRecursiveFill++;
92 _countProgressingFill++;
93 if (_countProgressingFill>200000)
95 printf("R %ld \n", _countRecursiveFill );
96 _countProgressingFill=0;
99 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
101 if (_usingAuxImageFill==true)
103 this->CalculateMinMaxRegion(px,py,pz); //DFCH
104 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
106 _tmpDistfill=(px-_pxfill)*(px-_pxfill) + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
107 _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
109 float grayLBFMTOL = _graylevelbasefill-_tolerancefill;
110 float grayLBFPTOL = _graylevelbasefill+_tolerancefill;
111 bool isInRange = false;
113 if( _RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL )
117 else if( _RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL )
119 grayLBFMTOL = _RangeMin;
122 else if( _RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL )
124 grayLBFPTOL = _RangeMax;
127 else if( ( _RangeMin <= _graylevelbasefill ) && ( _graylevelbasefill <= _RangeMax ) )
129 grayLBFMTOL = _RangeMin;
130 grayLBFPTOL = _RangeMax;
136 _auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) &&
137 (_tmpiglfill>=grayLBFMTOL) &&
138 (_tmpiglfill<=grayLBFPTOL) &&
139 (_tmpDistfill<=_distbasefill); //DFCH
143 _auxGrayLevelValidationFill = false;
146 /*_auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) &&
147 (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
148 (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
149 (_tmpDistfill<=_distbasefill);*/ //DFCH
152 if ( _auxGrayLevelValidationFill==true )
154 this->CalculateMinMaxRegion(px,py,pz); //DFCH
155 _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
157 if (_countRecursiveFill< _limitRecursionFill)
162 if (_direction==0) // YZ
164 //FillToolRecursive(px+1,py,pz);
165 //FillToolRecursive(px-1,py,pz);
166 FillToolRecursive(px,py+1,pz);
167 FillToolRecursive(px,py-1,pz);
168 FillToolRecursive(px,py,pz-1);
169 FillToolRecursive(px,py,pz+1);
171 if (_direction==1) // XZ
173 FillToolRecursive(px+1,py,pz);
174 FillToolRecursive(px-1,py,pz);
175 //FillToolRecursive(px,py+1,pz);
176 //FillToolRecursive(px,py-1,pz);
177 FillToolRecursive(px,py,pz-1);
178 FillToolRecursive(px,py,pz+1);
180 if (_direction==2) // XY
182 FillToolRecursive(px+1,py,pz);
183 FillToolRecursive(px,py+1,pz);
184 FillToolRecursive(px-1,py,pz);
185 FillToolRecursive(px,py-1,pz);
186 //FillToolRecursive(px,py,pz-1);
187 //FillToolRecursive(px,py,pz+1);
191 FillToolRecursive(px+1,py,pz);
192 FillToolRecursive(px-1,py,pz);
193 FillToolRecursive(px,py+1,pz);
194 FillToolRecursive(px,py-1,pz);
195 FillToolRecursive(px,py,pz-1);
196 FillToolRecursive(px,py,pz+1);
199 } //_countRecursiveFill
203 if ( (_auxGrayLevelValidationFill==true ) &&
204 (_countRecursiveFill>= _limitRecursionFill)
207 _countRecursiveFillProblem++;
211 if (_direction==0) // YZ
213 //SetAuxImageFill(px+1,py,pz);
214 //SetAuxImageFill(px-1,py,pz);
215 SetAuxImageFill(px,py+1,pz);
216 SetAuxImageFill(px,py-1,pz);
217 SetAuxImageFill(px,py,pz-1);
218 SetAuxImageFill(px,py,pz+1);
220 if (_direction==1) // XZ
222 SetAuxImageFill(px+1,py,pz);
223 SetAuxImageFill(px-1,py,pz);
224 //SetAuxImageFill(px,py+1,pz);
225 //SetAuxImageFill(px,py-1,pz);
226 SetAuxImageFill(px,py,pz-1);
227 SetAuxImageFill(px,py,pz+1);
229 if (_direction==2) // XY
231 SetAuxImageFill(px+1,py,pz);
232 SetAuxImageFill(px-1,py,pz);
233 SetAuxImageFill(px,py+1,pz);
234 SetAuxImageFill(px,py-1,pz);
235 //SetAuxImageFill(px,py,pz-1);
236 //SetAuxImageFill(px,py,pz+1);
240 SetAuxImageFill(px+1,py,pz);
241 SetAuxImageFill(px-1,py,pz);
242 SetAuxImageFill(px,py+1,pz);
243 SetAuxImageFill(px,py-1,pz);
244 SetAuxImageFill(px,py,pz-1);
245 SetAuxImageFill(px,py,pz+1);
248 } // _graylevel //_limitRecursionFill
251 } //if _minX _maxX _minY _maxY _minZ _maxZ
254 _countRecursiveFill--;
258 //---------------------------------------------------------------------------
259 void FillFilter::SetAuxImageFill(int px,int py, int pz)
261 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
263 this->CalculateMinMaxRegion(px,py,pz); //DFCH
264 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
269 //---------------------------------------------------------------------------
270 void FillFilter::SetToleranceFill(double tolerancefill)
272 _tolerancefill = tolerancefill;
275 //---------------------------------------------------------------------------
276 void FillFilter::SetDistanceFill(int distancefill)
278 _distancefill = distancefill;
281 //---------------------------------------------------------------------------
282 void FillFilter::SetRangeMin( int min )
287 //---------------------------------------------------------------------------
288 void FillFilter::SetRangeMax( int max )
293 //---------------------------------------------------------------------------
294 int FillFilter::GetRangeMin( )
299 //---------------------------------------------------------------------------
300 int FillFilter::GetRangeMax( )