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 this->CalculateMinMaxRegion(px,py,pz); //DFCH
103 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
105 _tmpDistfill=(px-_pxfill)*(px-_pxfill) + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
106 _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
108 float grayLBFMTOL = _graylevelbasefill-_tolerancefill;
109 float grayLBFPTOL = _graylevelbasefill+_tolerancefill;
110 bool isInRange = false;
112 if( _RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL )
116 else if( _RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL )
118 grayLBFMTOL = _RangeMin;
121 else if( _RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL )
123 grayLBFPTOL = _RangeMax;
126 else if( ( _RangeMin <= _graylevelbasefill ) && ( _graylevelbasefill <= _RangeMax ) )
128 grayLBFMTOL = _RangeMin;
129 grayLBFPTOL = _RangeMax;
135 _auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) &&
136 (_tmpiglfill>=grayLBFMTOL) &&
137 (_tmpiglfill<=grayLBFPTOL) &&
138 (_tmpDistfill<=_distbasefill); //DFCH
142 _auxGrayLevelValidationFill = false;
145 /*_auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) &&
146 (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
147 (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
148 (_tmpDistfill<=_distbasefill);*/ //DFCH
151 if ( _auxGrayLevelValidationFill==true )
153 this->CalculateMinMaxRegion(px,py,pz); //DFCH
154 _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
156 if (_countRecursiveFill< _limitRecursionFill)
161 if (_direction==0) // YZ
163 //FillToolRecursive(px+1,py,pz);
164 //FillToolRecursive(px-1,py,pz);
165 FillToolRecursive(px,py+1,pz);
166 FillToolRecursive(px,py-1,pz);
167 FillToolRecursive(px,py,pz-1);
168 FillToolRecursive(px,py,pz+1);
170 if (_direction==1) // XZ
172 FillToolRecursive(px+1,py,pz);
173 FillToolRecursive(px-1,py,pz);
174 //FillToolRecursive(px,py+1,pz);
175 //FillToolRecursive(px,py-1,pz);
176 FillToolRecursive(px,py,pz-1);
177 FillToolRecursive(px,py,pz+1);
179 if (_direction==2) // XY
181 FillToolRecursive(px+1,py,pz);
182 FillToolRecursive(px,py+1,pz);
183 FillToolRecursive(px-1,py,pz);
184 FillToolRecursive(px,py-1,pz);
185 //FillToolRecursive(px,py,pz-1);
186 //FillToolRecursive(px,py,pz+1);
190 FillToolRecursive(px+1,py,pz);
191 FillToolRecursive(px-1,py,pz);
192 FillToolRecursive(px,py+1,pz);
193 FillToolRecursive(px,py-1,pz);
194 FillToolRecursive(px,py,pz-1);
195 FillToolRecursive(px,py,pz+1);
198 } //_countRecursiveFill
202 if ( (_auxGrayLevelValidationFill==true ) &&
203 (_countRecursiveFill>= _limitRecursionFill)
206 _countRecursiveFillProblem++;
210 if (_direction==0) // YZ
212 //SetAuxImageFill(px+1,py,pz);
213 //SetAuxImageFill(px-1,py,pz);
214 SetAuxImageFill(px,py+1,pz);
215 SetAuxImageFill(px,py-1,pz);
216 SetAuxImageFill(px,py,pz-1);
217 SetAuxImageFill(px,py,pz+1);
219 if (_direction==1) // XZ
221 SetAuxImageFill(px+1,py,pz);
222 SetAuxImageFill(px-1,py,pz);
223 //SetAuxImageFill(px,py+1,pz);
224 //SetAuxImageFill(px,py-1,pz);
225 SetAuxImageFill(px,py,pz-1);
226 SetAuxImageFill(px,py,pz+1);
228 if (_direction==2) // XY
230 SetAuxImageFill(px+1,py,pz);
231 SetAuxImageFill(px-1,py,pz);
232 SetAuxImageFill(px,py+1,pz);
233 SetAuxImageFill(px,py-1,pz);
234 //SetAuxImageFill(px,py,pz-1);
235 //SetAuxImageFill(px,py,pz+1);
239 SetAuxImageFill(px+1,py,pz);
240 SetAuxImageFill(px-1,py,pz);
241 SetAuxImageFill(px,py+1,pz);
242 SetAuxImageFill(px,py-1,pz);
243 SetAuxImageFill(px,py,pz-1);
244 SetAuxImageFill(px,py,pz+1);
247 } // _graylevel //_limitRecursionFill
250 } //if _minX _maxX _minY _maxY _minZ _maxZ
253 _countRecursiveFill--;
257 //---------------------------------------------------------------------------
258 void FillFilter::SetAuxImageFill(int px,int py, int pz)
260 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
262 this->CalculateMinMaxRegion(px,py,pz); //DFCH
263 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
268 //---------------------------------------------------------------------------
269 void FillFilter::SetToleranceFill(double tolerancefill)
271 _tolerancefill = tolerancefill;
274 //---------------------------------------------------------------------------
275 void FillFilter::SetDistanceFill(int distancefill)
277 _distancefill = distancefill;
280 //---------------------------------------------------------------------------
281 void FillFilter::SetRangeMin( int min )
286 //---------------------------------------------------------------------------
287 void FillFilter::SetRangeMax( int max )
292 //---------------------------------------------------------------------------
293 int FillFilter::GetRangeMin( )
298 //---------------------------------------------------------------------------
299 int FillFilter::GetRangeMax( )