]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp
#3312 creaMaracasVisu Feature New Normal - Optifisation fill tool in manual _paint
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualPaint / FillFilter.cpp
1 /*# ---------------------------------------------------------------------
2 #
3 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
4 #                        pour la Sant�)
5 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
6 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
7 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
8 #
9 #  This software is governed by the CeCILL-B license under French law and
10 #  abiding by the rules of distribution of free software. You can  use,
11 #  modify and/ or redistribute the software under the terms of the CeCILL-B
12 #  license as circulated by CEA, CNRS and INRIA at the following URL
13 #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
14 #  or in the file LICENSE.txt.
15 #
16 #  As a counterpart to the access to the source code and  rights to copy,
17 #  modify and redistribute granted by the license, users are provided only
18 #  with a limited warranty  and the software's author,  the holder of the
19 #  economic rights,  and the successive licensors  have only  limited
20 #  liability.
21 #
22 #  The fact that you are presently reading this means that you have had
23 #  knowledge of the CeCILL-B license and that you accept its terms.
24 # ------------------------------------------------------------------------ */
25
26 #include "FillFilter.h"
27 #include "creaVtk_MACROS.h"
28
29 #include <vector>
30
31
32
33 FillFilter::FillFilter() 
34 {
35         _tolerancefill          = 50;
36         _distancefill           = 500;
37 /*
38         _limitRecursionFill = 50000;
39 */
40         _auxImageFill           = NULL;
41         _maxXback                       = 0;
42         _maxYback                       = 0;
43         _maxZback                       = 0;
44 }
45
46 //---------------------------------------------------------------------------
47 FillFilter::~FillFilter() 
48 {
49         if (_auxImageFill != NULL)
50         {
51                 _auxImageFill->Delete();
52         }
53 }
54
55 //---------------------------------------------------------------------------
56 void FillFilter::SetImages(vtkImageData *image,vtkImageData *image2) // virtual
57 {       
58         baseFilterManualPaint::SetImages(image,image2); 
59         if ((_maxX!=_maxXback) || (_maxY!=_maxYback) || (_maxZ!=_maxZback)) 
60         {
61                 if (_auxImageFill != NULL)
62                 {
63                         _auxImageFill->Delete();
64                 }
65                 _auxImageFill = vtkImageData::New();
66                 _auxImageFill->SetDimensions(_maxX + 1, _maxY + 1, _maxZ + 1);
67                 _auxImageFill->SetOrigin(0, 0, 0);
68                 _auxImageFill->SetExtent(0, _maxX, 0, _maxY, 0, _maxZ);
69 //EED 2017-01-01 Migration VTK7
70 #if VTK_MAJOR_VERSION <= 5
71                 _auxImageFill->SetWholeExtent(0, _maxX, 0, _maxY, 0, _maxZ);
72                 _auxImageFill->SetScalarTypeToUnsignedChar();
73                 _auxImageFill->AllocateScalars();
74 #else
75                 _auxImageFill->AllocateScalars(VTK_UNSIGNED_CHAR,1);
76 #endif
77                 unsigned char   * ptrAuxImageFill = (unsigned char      *)_auxImageFill->GetScalarPointer();
78                 memset(ptrAuxImageFill, 0, (_maxX+1) * (_maxY+1) * (_maxZ+1) );
79         }
80
81         _maxXback=_maxX;
82         _maxYback=_maxY;
83         _maxZback=_maxZ;        
84 }
85
86
87
88
89 //---------------------------------------------------------------------------
90 void FillFilter::Run() // virtual
91 {
92         long int ivi;
93         if ((_px >= _minX) && (_px <= _maxX) && (_py >= _minY) && (_py <= _maxY)
94                         && (_pz >= _minZ) && (_pz <= _maxZ)) 
95         {
96                 _graylevelbasefill                      = _image->GetScalarComponentAsDouble(_px, _py, _pz,0);
97                 _distbasefill                           = _distancefill * _distancefill;
98 /*
99                 _pxfill                                         = _px;
100                 _pyfill                                         = _py;
101                 _pzfill                                         = _pz;
102                 _countRecursiveFill             = 0;
103                 _countRecursiveFillProblem      = 0;
104                 _countProgressingFill           = 0;
105                 DEF_POINTER_IMAGE_VTK_CREA_set(v_image,ss_image,p_image,st_image,_image)                
106                 if (_image2!=NULL)
107                 {
108                         DEF_POINTER_IMAGE_VTK_CREA_set(v_image2,ss_image2,p_image2,st_image2,_image2)           
109                 } // if _image2
110 */
111
112 //              _usingAuxImageFill                      = false;
113                 ivi                                             = _px + _py*(_maxX+1) + _pz*(_maxX+1)*(_maxY+1);  // index vector image
114
115                 FillToolLoop(_px, _py, _pz, ivi);
116         } //if _minX _maxX _minY _maxY _minZ _maxZ
117 }
118
119
120
121
122 //---------------------------------------------------------------------------
123 void FillFilter::FillToolLoop(int px, int py, int pz,long int iviA) 
124 {
125         double difX,difY,difZ,_tmpDistfill;
126         std::vector<int> lstX;
127         std::vector<int> lstY;
128         std::vector<int> lstZ;
129         std::vector<long long int> lstivi;
130         lstX.push_back(px);
131         lstY.push_back(py);
132         lstZ.push_back(pz);
133         lstivi.push_back( iviA );
134
135
136         DEF_POINTER_IMAGE_VTK_CREA_set(v_image,ss_image,p_image,st_image,_image)                
137         if (_image2!=NULL)
138         {
139                 DEF_POINTER_IMAGE_VTK_CREA_set(v_image2,ss_image2,p_image2,st_image2,_image2)           
140         } // if _image2
141
142
143
144
145         DEF_POINTER_IMAGE_VTK_CREA(v_auxImageFill,ss_auxImageFill,p_auxImageFill,st_auxImageFill,_auxImageFill)         
146         while ( lstX.size()!=0 )
147         {
148                 // if point inside image
149                 if ((lstX[0] >= _minX) && (lstX[0] <= _maxX) && (lstY[0] >= _minY) && (lstY[0] <= _maxY) && (lstZ[0] >= _minZ) && (lstZ[0] <= _maxZ)) 
150                 {   
151                         difX = px-lstX[0];
152                         difY = py-lstY[0];
153                         difZ = pz-lstZ[0];
154                         _tmpDistfill = difX*difX + difY*difY + difZ*difZ;
155                         // if distance of center point
156                         if (_tmpDistfill<=_distbasefill)
157                         {
158                                 // if point not visited
159                                 GETVALUE2_VTK_CREA(v_auxImageFill,p_auxImageFill,st_auxImageFill,lstivi[0] );   
160                                 if (v_auxImageFill==0)
161                                 { 
162                                         // If Gray Level valid
163
164                                         //EED01 
165                                         //              _tmpiglfill     = _image->GetScalarComponentAsDouble(px, py, pz, 0);
166                                         GETVALUE2_VTK_CREA(_tmpiglfill,p_image,st_image,lstivi[0])      
167
168                                         if (_image2!=NULL)
169                                         {
170                                                 //EED01
171                                                 //                      _tmpiglfill2    =       _image2->GetScalarComponentAsDouble(px, py, pz, 0);
172                                                 GETVALUE2_VTK_CREA(_tmpiglfill2,p_image2,st_image2,lstivi[0])   
173                                         } else {
174                                                 _tmpiglfill2    =       _tmpiglfill;
175                                         }
176
177                                         float grayLBFMTOL       = _graylevelbasefill - _tolerancefill;
178                                         float grayLBFPTOL       = _graylevelbasefill + _tolerancefill;
179                                         bool isInRange          = false;
180                                         //DFCH
181                                         if (_RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
182                                                 isInRange               = true;
183                                         } //fi esle
184                                         else if (_RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
185                                                 grayLBFMTOL     = _RangeMin;
186                                                 isInRange               = true;
187                                         } //fi esle
188                                         else if (_RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL) {
189                                                 grayLBFPTOL     = _RangeMax;
190                                                 isInRange               = true;
191                                         } //fi esle
192                                         else if ((_RangeMin <= _graylevelbasefill) && (_graylevelbasefill <= _RangeMax)) {
193                                                 grayLBFMTOL     = _RangeMin;
194                                                 grayLBFPTOL     = _RangeMax;
195                                                 isInRange               = true;
196                                         } //fi Range
197
198                                         if (isInRange) 
199                                         {
200                                                 _auxGrayLevelValidationFill = (_tmpiglfill != _graylevel)
201                                                                 && (_tmpiglfill2 != _graylevel)
202                                                                 && (_tmpiglfill  >= grayLBFMTOL)
203                                                                 && (_tmpiglfill  <= grayLBFPTOL)
204                                                                 && (_tmpDistfill <= _distbasefill); //DFCH
205                                         } else {
206                                                 _auxGrayLevelValidationFill = false;
207                                         } // if isInRange
208
209                                         if (_auxGrayLevelValidationFill)  
210                                         {
211                                                 // Modifie image
212                                                 if (_image2!=NULL)
213                                                 {
214                                                         //                              _image2->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
215                                                         SETVALUE2_VTK_CREA(_graylevel,p_image2,st_image2,lstivi[0])
216                                                 } else {
217                                                         //                              _image->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
218                                                         SETVALUE2_VTK_CREA(_graylevel,p_image,st_image,lstivi[0])
219                                                 } // if _image2
220
221                                                 // Add neighborhood points in the list 
222                                                 if (_2D3D == 0) //2D
223                                                 {
224                                                         if (_direction == 0) // YZ
225                                                         {
226                                                                 //lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
227                                                                 //lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
228                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
229                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
230                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
231                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
232                                                         }
233                                                         if (_direction == 1) // XZ
234                                                         {
235                                                                 lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
236                                                                 lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
237                                                                 // lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
238                                                                 // lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
239                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
240                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
241                                                         }
242                                                         if (_direction == 2) // XY
243                                                         {
244                                                                 lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
245                                                                 lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
246                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
247                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
248                                                                 //lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
249                                                                 //lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
250                                                         }
251                                                 } else { // 3D
252                                                         lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
253                                                         lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
254                                                         lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
255                                                         lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
256                                                         lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
257                                                         lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
258                                                 } // 2D 3D
259
260
261
262
263
264
265
266                                         } // if gray level valid      _auxGrayLevelValidationFill
267
268                                 } // if point not visited
269                                 // Add point to already visited
270                                 SETVALUE2_VTK_CREA(1,p_auxImageFill,st_auxImageFill,lstivi[0]);
271                         } // if distance of center point
272                 } // if point inside image
273                 // Remove point from the list
274                 lstX.erase( lstX.begin() );
275                 lstY.erase( lstY.begin() );
276                 lstZ.erase( lstZ.begin() );
277                 lstivi.erase( lstivi.begin() );
278         } // while _lstX.size
279 }
280
281
282 /*
283
284
285 //---------------------------------------------------------------------------
286 void FillFilter::Run2() // virtual
287 {
288
289         long int ivi;
290         if ((_px >= _minX) && (_px <= _maxX) && (_py >= _minY) && (_py <= _maxY)
291                         && (_pz >= _minZ) && (_pz <= _maxZ)) 
292         {
293                 _graylevelbasefill                      = _image->GetScalarComponentAsDouble(_px, _py, _pz,0);
294                 _pxfill                                         = _px;
295                 _pyfill                                         = _py;
296                 _pzfill                                         = _pz;
297                 _distbasefill                           = _distancefill * _distancefill;
298                 _countRecursiveFill             = 0;
299                 _countRecursiveFillProblem      = 0;
300                 _countProgressingFill           = 0;
301                 _usingAuxImageFill                      = false;
302
303                 ivi                                             = _px + _py*(_maxX+1) + _pz*(_maxX+1)*(_maxY+1);  // index vector image
304
305 DEF_POINTER_IMAGE_VTK_CREA_set(v_image,ss_image,p_image,st_image,_image)                
306 if (_image2!=NULL)
307 {
308         DEF_POINTER_IMAGE_VTK_CREA_set(v_image2,ss_image2,p_image2,st_image2,_image2)           
309 }
310
311 //EED01
312 //              FillToolRecursive(_px, _py, _pz);
313                 FillToolRecursive(_px, _py, _pz, ivi);
314                 unsigned char *pImage;
315                 pImage                                          = (unsigned char *) _auxImageFill->GetScalarPointer();
316                 int ii, jj, kk;
317                 ivi                                                     = 0;
318
319                 while (_countRecursiveFillProblem != 0) 
320                 {
321                         _countRecursiveFillProblem  = 0;
322                         _usingAuxImageFill                      = true;
323                         for (kk = 0; kk <= _maxZ; kk++) 
324                         {
325                                 for (jj = 0; jj <= _maxY; jj++) 
326                                 {
327                                         for (ii = 0; ii <= _maxX; ii++) 
328                                         {
329                                                 if (pImage[ivi] == 1) 
330                                                 {
331 //EED01
332 //                                                      FillToolRecursive(ii, jj, kk);
333                                                         FillToolRecursive(ii, jj, kk, ivi);
334                                                 }  // if
335                                                 ivi++;
336                                         } // for ii
337                                 } // for jj
338                         } //for kk
339 //                      printf("-\n");
340                 } // while
341         } //if _minX _maxX _minY _maxY _minZ _maxZ
342 }
343
344
345
346 //---------------------------------------------------------------------------
347 void FillFilter::FillToolRecursive(int px, int py, int pz,long int ivi) 
348 {
349 //ups ??EED   DEF_POINTER_IMAGE_VTK_CREA(v_image,ss_image,p_image,st_image,_image)              
350 //ups ??EED   DEF_POINTER_IMAGE_VTK_CREA(v_image2,ss_image2,p_image2,st_image2,_image2)         
351
352         _countRecursiveFill++;
353         _countProgressingFill++;
354         if (_countProgressingFill > 200000) 
355         {
356                 printf("R %ld \n", _countRecursiveFill);
357                 _countProgressingFill = 0;
358         }
359
360         if ((px >= _minX) && (px <= _maxX) && (py >= _minY) && (py <= _maxY)
361                         && (pz >= _minZ) && (pz <= _maxZ)) 
362         {
363                 if (_usingAuxImageFill == true) 
364                 {
365 //UPS ??EED                     this->_IMManager->AddModifiedPixel(px, py, pz); //DFCH
366 //EED01
367 //                      _auxImageFill->SetScalarComponentFromFloat(px, py, pz, 0, 0);
368                         _ptrAuxImageFill[ ivi ]=0;
369                 }
370                 difX=px-_pxfill;
371                 difY=py-_pyfill;
372                 difZ=pz-_pzfill;
373                 _tmpDistfill = difX*difX + difY*difY + difZ*difZ;
374 //              _tmpDistfill = (px-_pxfill)*(px-_pxfill)
375 //                                      +  (py-_pyfill)*(py-_pyfill)
376 //                                      +  (pz-_pzfill)*(pz-_pzfill);
377
378 //if (_countRecursiveFill >1 )
379 //{
380 //      printf("   -> %d %d %d   cr=%ld  r=%f\n", px,py,pz,_countRecursiveFill , _tmpDistfill);
381 //}
382  
383
384 //EED01 
385 //              _tmpiglfill     = _image->GetScalarComponentAsDouble(px, py, pz, 0);
386 GETVALUE2_VTK_CREA(_tmpiglfill,p_image,st_image,ivi)    
387
388                 if (_image2!=NULL)
389                 {
390 //EED01
391 //                      _tmpiglfill2    =       _image2->GetScalarComponentAsDouble(px, py, pz, 0);
392 GETVALUE2_VTK_CREA(_tmpiglfill2,p_image2,st_image2,ivi)         
393                 } else {
394                         _tmpiglfill2    =       _tmpiglfill;
395                 }
396
397                 float grayLBFMTOL       = _graylevelbasefill - _tolerancefill;
398                 float grayLBFPTOL       = _graylevelbasefill + _tolerancefill;
399                 bool isInRange          = false;
400                 //DFCH
401                 if (_RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
402                         isInRange               = true;
403                 } //fi esle
404                 else if (_RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
405                         grayLBFMTOL     = _RangeMin;
406                         isInRange               = true;
407                 } //fi esle
408                 else if (_RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL) {
409                         grayLBFPTOL     = _RangeMax;
410                         isInRange               = true;
411                 } //fi esle
412                 else if ((_RangeMin <= _graylevelbasefill) && (_graylevelbasefill <= _RangeMax)) {
413                         grayLBFMTOL     = _RangeMin;
414                         grayLBFPTOL     = _RangeMax;
415                         isInRange               = true;
416                 } //fi Range
417
418                 if (isInRange) 
419                 {
420                         _auxGrayLevelValidationFill = (_tmpiglfill != _graylevel)
421                                         && (_tmpiglfill2 != _graylevel)
422                                         && (_tmpiglfill >= grayLBFMTOL)
423                                         && (_tmpiglfill <= grayLBFPTOL)
424                                         && (_tmpDistfill <= _distbasefill); //DFCH
425                 } else {
426                         _auxGrayLevelValidationFill = false;
427                 } // if isInRange
428
429
430                 if (_auxGrayLevelValidationFill == true) 
431                 {
432 //UPS ??EED                     this->_IMManager->AddModifiedPixel(px, py, pz); //DFCH
433                         if (_image2!=NULL)
434                         {
435 //EED01
436 //                              _image2->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
437 SETVALUE2_VTK_CREA(_graylevel,p_image2,st_image2,ivi)
438                         } else {
439 //EED01
440 //                              _image->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
441 SETVALUE2_VTK_CREA(_graylevel,p_image,st_image,ivi)
442                         }
443
444                         if (_countRecursiveFill < _limitRecursionFill) 
445                         {
446
447                                 if (_2D3D == 0) //2D
448                                 {
449                                         if (_direction == 0) // YZ
450                                         {
451                                                 //FillToolRecursive(px+1,py,pz);
452                                                 //FillToolRecursive(px-1,py,pz);
453                                                 FillToolRecursive(px, py + 1, pz, ivi+_OneLine  );
454                                                 FillToolRecursive(px, py - 1, pz, ivi-_OneLine  );
455                                                 FillToolRecursive(px, py, pz - 1, ivi-_OnePlane );
456                                                 FillToolRecursive(px, py, pz + 1, ivi+_OnePlane );
457                                         }
458                                         if (_direction == 1) // XZ
459                                                         {
460                                                 FillToolRecursive(px + 1, py, pz, ivi+_OneColumn);
461                                                 FillToolRecursive(px - 1, py, pz, ivi-_OneColumn);
462                                                 //FillToolRecursive(px,py+1,pz);
463                                                 //FillToolRecursive(px,py-1,pz);
464                                                 FillToolRecursive(px, py, pz - 1, ivi-_OnePlane );
465                                                 FillToolRecursive(px, py, pz + 1, ivi+_OnePlane );
466                                         }
467                                         if (_direction == 2) // XY
468                                                         {
469                                                 FillToolRecursive(px + 1, py, pz, ivi+_OneColumn);
470                                                 FillToolRecursive(px, py + 1, pz, ivi+_OneLine);
471                                                 FillToolRecursive(px - 1, py, pz, ivi-_OneColumn);
472                                                 FillToolRecursive(px, py - 1, pz, ivi-_OneLine);
473                                                 //FillToolRecursive(px,py,pz-1);
474                                                 //FillToolRecursive(px,py,pz+1);
475                                         }
476                                 } else { // 3D
477                                         FillToolRecursive(px + 1, py, pz, ivi+_OneColumn );
478                                         FillToolRecursive(px - 1, py, pz, ivi-_OneColumn );
479                                         FillToolRecursive(px, py + 1, pz, ivi+_OneLine );
480                                         FillToolRecursive(px, py - 1, pz, ivi-_OneLine );
481                                         FillToolRecursive(px, py, pz - 1, ivi-_OnePlane );
482                                         FillToolRecursive(px, py, pz + 1, ivi+_OnePlane );
483                                 } // 2D 3D
484
485                         } //_countRecursiveFill
486                 } // _graylevel
487
488                 if ((_auxGrayLevelValidationFill == true) && (_countRecursiveFill >= _limitRecursionFill)) 
489                 {
490                         _countRecursiveFillProblem++;
491                         if (_2D3D == 0) //2D
492                         {
493                                 if (_direction == 0) // YZ
494                                 {
495                                         //SetAuxImageFill(px+1,py,pz);
496                                         //SetAuxImageFill(px-1,py,pz);
497                                         SetAuxImageFill(px, py + 1, pz,ivi+_OneLine);
498                                         SetAuxImageFill(px, py - 1, pz,ivi-_OneLine);
499                                         SetAuxImageFill(px, py, pz - 1,ivi-_OnePlane);
500                                         SetAuxImageFill(px, py, pz + 1,ivi+_OnePlane);
501                                 }
502                                 if (_direction == 1) // XZ
503                                 {
504                                         SetAuxImageFill(px + 1, py, pz,ivi+_OneColumn);
505                                         SetAuxImageFill(px - 1, py, pz,ivi-_OneColumn);
506                                         //SetAuxImageFill(px,py+1,pz);
507                                         //SetAuxImageFill(px,py-1,pz);
508                                         SetAuxImageFill(px, py, pz - 1,ivi-_OnePlane);
509                                         SetAuxImageFill(px, py, pz + 1,ivi+_OnePlane);
510                                 }
511                                 if (_direction == 2) // XY
512                                 {
513                                         SetAuxImageFill(px + 1, py, pz,ivi+_OneColumn);
514                                         SetAuxImageFill(px - 1, py, pz,ivi-_OneColumn);
515                                         SetAuxImageFill(px, py + 1, pz,ivi+_OneLine);
516                                         SetAuxImageFill(px, py - 1, pz,ivi-_OneLine);
517                                         //SetAuxImageFill(px,py,pz-1);
518                                         //SetAuxImageFill(px,py,pz+1);
519                                 }
520                         } else { // 3D
521                                 SetAuxImageFill(px + 1, py, pz,ivi+_OneColumn);
522                                 SetAuxImageFill(px - 1, py, pz,ivi-_OneColumn);
523                                 SetAuxImageFill(px, py + 1, pz,ivi+_OneLine);
524                                 SetAuxImageFill(px, py - 1, pz,ivi-_OneLine);
525                                 SetAuxImageFill(px, py, pz - 1,ivi-_OnePlane);
526                                 SetAuxImageFill(px, py, pz + 1,ivi+_OnePlane);
527                         } // 2D 3D
528
529                 } // _graylevel   //_limitRecursionFill
530
531         } //if _minX _maxX _minY _maxY _minZ _maxZ
532         _countRecursiveFill--;
533 }
534
535
536 //---------------------------------------------------------------------------
537 void FillFilter::SetAuxImageFill(int px, int py, int pz, long int ivi) 
538 {
539         if ((px >= _minX) && (px <= _maxX) && (py >= _minY) && (py <= _maxY)
540                         && (pz >= _minZ) && (pz <= _maxZ)) 
541         {
542                 this->_IMManager->AddModifiedPixel(px, py, pz); //DFCH
543 //EED01
544 //              _auxImageFill->SetScalarComponentFromFloat(px, py, pz, 0, 1);
545                         _ptrAuxImageFill[ ivi ]=1;
546         } // if px py pz
547 }
548 */
549
550
551 //---------------------------------------------------------------------------
552 void FillFilter::SetToleranceFill(double tolerancefill) 
553 {
554         _tolerancefill = tolerancefill;
555 }
556
557 //---------------------------------------------------------------------------
558 void FillFilter::SetDistanceFill(int distancefill) 
559 {
560         _distancefill = distancefill;
561 }
562
563