]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp
Clean Code
[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           = 125;
36         _GeneralAuxImageFill = NULL;
37 //EED 2020-04-28  BORRAME Change to local variables to use with openmp
38 //      _auxImageFill           = NULL;
39 //      _maxXback                       = 0;
40 //      _maxYback                       = 0;
41 //      _maxZback                       = 0;
42         SetDistanceFill(5);
43 }
44
45 //---------------------------------------------------------------------------
46 FillFilter::~FillFilter() 
47 {
48 /*//EED 2020-04-28  BORRAME Change to local variables to use with openmp
49         if (_auxImageFill != NULL)
50         {
51                 _auxImageFill->Delete();
52         }//_auxImageFill
53 */
54 }
55
56 //---------------------------------------------------------------------------
57 void FillFilter::SetImages(vtkImageData *image,vtkImageData *image2) // virtual
58 {       
59         baseFilterManualPaint::SetImages(image,image2); 
60
61 /* //EED 2020-04-28  BORRAME Change to local variables to use with openmp
62         if ((_maxX!=_maxXback) || (_maxY!=_maxYback) || (_maxZ!=_maxZback)) 
63         {
64                 if (_auxImageFill != NULL)
65                 {
66                         _auxImageFill->Delete();
67                 }
68                 _auxImageFill = vtkImageData::New();
69                 _auxImageFill->SetDimensions(_maxX + 1, _maxY + 1, _maxZ + 1);
70                 _auxImageFill->SetOrigin(0, 0, 0);
71                 _auxImageFill->SetExtent(0, _maxX, 0, _maxY, 0, _maxZ);
72 //EED 2017-01-01 Migration VTK7
73 #if VTK_MAJOR_VERSION <= 5
74                 _auxImageFill->SetWholeExtent(0, _maxX, 0, _maxY, 0, _maxZ);
75                 _auxImageFill->SetScalarTypeToUnsignedChar();
76                 _auxImageFill->AllocateScalars();
77 #else
78                 _auxImageFill->AllocateScalars(VTK_UNSIGNED_CHAR,1);
79 #endif
80         }
81         unsigned char   * ptrAuxImageFill = (unsigned char      *)_auxImageFill->GetScalarPointer();
82         memset(ptrAuxImageFill, 0, (_maxX+1) * (_maxY+1) * (_maxZ+1) );
83         _maxXback = _maxX;
84         _maxYback = _maxY;
85         _maxZback = _maxZ;      
86 */
87
88                 if (_GeneralAuxImageFill != NULL)
89                 {
90                         _GeneralAuxImageFill->Delete();
91                 }
92                 _GeneralAuxImageFill = vtkImageData::New();
93                 _GeneralAuxImageFill->SetDimensions(_dimX,_dimY,_dimZ );
94                 _GeneralAuxImageFill->SetOrigin(0, 0, 0);
95                 _GeneralAuxImageFill->SetExtent(0, _dimX-1, 0, _dimY-1, 0, _dimZ-1);
96                 _GeneralAuxImageFill->AllocateScalars(VTK_UNSIGNED_CHAR,1);
97                 unsigned char *ptrAuxImageFill = (unsigned char*)_GeneralAuxImageFill->GetScalarPointer();
98                 memset(ptrAuxImageFill, 0, _dimX*_dimY*_dimZ*sizeof(unsigned char) );
99 }
100
101 //---------------------------------------------------------------------------
102 void FillFilter::Run(int px, int py, int pz) // virtual
103 {
104         long int ivi;
105
106 /* //EED 2020-04-28  BORRAME Change to local variables to use with openmp
107         if (    (_px >= _minX) && (_px < _dimX) && 
108                         (_py >= _minY) && (_py < _dimY) && 
109                         (_pz >= _minZ) && (_pz < _dimZ)         ) 
110         {
111                 this->_IMManager->BaseInitialPoint(_px, _py ,_pz);
112                 FillToolLoop(_px, _py, _pz);
113         } //if _minX _maxX _minY _maxY _minZ _maxZ
114 */
115
116         if (    (px >= _minX) && (px < _dimX) && 
117                         (py >= _minY) && (py < _dimY) && 
118                         (pz >= _minZ) && (pz < _dimZ)           ) 
119         {
120                 this->_IMManager->BaseInitialPoint(px, py ,pz);
121                 FillToolLoop(px, py, pz);
122         } //if _minX _maxX _minY _maxY _minZ _maxZ
123
124
125
126 }
127
128
129 //---------------------------------------------------------------------------
130 vtkImageData* FillFilter::CreateAuxImageFill(   long int &OneColumnAux, long int &OneLineAux , long int &OnePlaneAux, 
131                                                                                                 int px,                 int py,                 int pz, 
132                                                                                                 int &pxAux,             int &pyAux,     int &pzAux,
133                                                                                                 int &minXAux,   int &minYAux,   int &minZAux )
134 {
135         // _2D3D = 1     3D
136
137         minXAux = px-_distancefill;  if (minXAux>=0) { pxAux=px-minXAux; } else { pxAux=px; minXAux=0; }
138         minYAux = py-_distancefill;  if (minYAux>=0) { pyAux=py-minYAux; } else { pyAux=py; minYAux=0; }
139         minZAux = pz-_distancefill;  if (minZAux>=0) { pzAux=pz-minZAux; } else { pzAux=pz; minZAux=0; }
140
141         int maxXAux = px+_distancefill;  if (maxXAux>_dimX) { maxXAux=_dimX; }
142         int maxYAux = py+_distancefill;  if (maxYAux>_dimY) { maxYAux=_dimY; }
143         int maxZAux = pz+_distancefill;  if (maxZAux>_dimZ) { maxZAux=_dimZ; }
144
145
146         int auxDimX = maxXAux-minXAux+1;
147         int auxDimY = maxYAux-minYAux+1;
148         int auxDimZ = maxZAux-minZAux+1;
149
150         // new vtkImageData
151         if (_2D3D==0)  // 2D
152         {       
153                 if (_direction==0) // YZ
154                 {
155                         auxDimX = 1;
156                 }
157                 if (_direction==1) // XZ
158                 {
159                         auxDimY = 1;
160                 }
161                 if (_direction==2) // XY
162                 {
163                         auxDimZ = 1;
164                 }
165         } // if 2D
166
167         OneColumnAux    = 1;
168         OneLineAux              = auxDimX;
169         OnePlaneAux             = auxDimX*auxDimY;
170
171         vtkImageData *auxImageFill;
172         auxImageFill = vtkImageData::New();
173         auxImageFill->SetDimensions(auxDimX, auxDimY, auxDimZ);
174         auxImageFill->SetOrigin(0, 0, 0);
175         auxImageFill->SetExtent(0, auxDimX-1, 0, auxDimY-1, 0, auxDimZ-1);
176         auxImageFill->AllocateScalars(VTK_UNSIGNED_CHAR,1);
177         unsigned char   * ptrAuxImageFill = (unsigned char      *)auxImageFill->GetScalarPointer();
178         memset( ptrAuxImageFill, 0, auxDimX*auxDimY*auxDimZ );
179         return auxImageFill;
180 }
181
182 void FillFilter::Copy_AuxImageFill_To_GeneralAuxFill(int minXAux, int minYAux, int minZAux, vtkImageData *auxImageFill)
183 {
184         // copy information from the litle image auxImageFill to the big image _GeneralAuxImageFill
185         DEF_POINTER_IMAGE_VTK_CREA(vAuxImageFill,ssAuxImageFill,pAuxImageFill,stAuxImageFill,auxImageFill)
186         DEF_POINTER_IMAGE_VTK_CREA(v_GeneralAuxImageFill,ss_GeneralAuxImageFill,p_GeneralAuxImageFill,st_GeneralAuxImageFill,_GeneralAuxImageFill)
187         int ext[6];
188         auxImageFill->GetExtent(ext);
189         int auxDimX = ext[1]-ext[0]+1;
190         int auxDimY = ext[3]-ext[2]+1;
191         int auxDimZ = ext[5]-ext[4]+1;
192         int i,j,k;      
193         long int indexAux=0;
194         long int indexGeneralAux;
195         for (k=0;k<auxDimZ;k++)
196         {
197                 for (j=0;j<auxDimY;j++)
198                 {
199                         indexGeneralAux=minXAux + (minYAux+j)*_OneLine + (minZAux+k)*_OnePlane;
200 //                      indexAux = j*OneLineAux + k*OnePlaneAux;
201                         for (i=0;i<auxDimX;i++)
202                         {
203                                 GETVALUE2_VTK_CREA(vAuxImageFill,pAuxImageFill,stAuxImageFill,indexAux)         
204                                 indexAux++;
205                                 if (vAuxImageFill==1) 
206                                 {
207                                         SETVALUE2_VTK_CREA(vAuxImageFill,p_GeneralAuxImageFill,st_GeneralAuxImageFill,indexGeneralAux)
208                                 } // if vAuxImageFill
209                                 indexGeneralAux = indexGeneralAux+_OneColumn;
210                         } //  for i
211                 } // for j
212         } // for k
213 }
214
215 void FillFilter::Copy_GeneralAuxFill_to_Results()
216 {
217         DEF_POINTER_IMAGE_VTK_CREA(v_GeneralAuxImageFill,ss_GeneralAuxImageFill,p_GeneralAuxImageFill,st_GeneralAuxImageFill,_GeneralAuxImageFill)
218         long int i,size = _dimX*_dimY*_dimZ;
219         if (_image2==NULL)
220         {
221                         DEF_POINTER_IMAGE_VTK_CREA(v_image,ss_image,p_image,st_image,_image)
222 //                      DEF_POINTER_IMAGE_VTK_CREA_set(v_image,ss_image,p_image,st_image,_image)                
223 #pragma omp parallel for 
224                         for (i=0;i<size;i++)
225                         {
226                                 int value;
227                                 GETVALUE2_VTK_CREA(value,p_GeneralAuxImageFill,st_GeneralAuxImageFill,i)
228                                 if (value!=0) 
229                                 {
230                                         SETVALUE2_VTK_CREA(_graylevel,p_image,st_image,i)
231                                 } // if v_GeneralAuxImageFill
232                         } // for        
233         }  else {
234                         DEF_POINTER_IMAGE_VTK_CREA(v_image2,ss_image2,p_image2,st_image2,_image2)
235 //                      DEF_POINTER_IMAGE_VTK_CREA_set(v_image2,ss_image2,p_image2,st_image2,_image2)           
236 #pragma omp parallel for 
237                         for (i=0;i<size;i++)
238                         {
239                                 int value;
240                                 GETVALUE2_VTK_CREA(value,p_GeneralAuxImageFill,st_GeneralAuxImageFill,i)
241                                 if (value!=0) 
242                                 {
243                                         SETVALUE2_VTK_CREA(_graylevel,p_image2,st_image2,i)
244                                 } // if v_GeneralAuxImageFill
245                         } // for        
246         }// if _image2
247         
248
249 }
250
251
252
253 //---------------------------------------------------------------------------
254 void FillFilter::FillToolLoop(int px, int py, int pz) 
255 {
256     double          distbasefill;
257     double          graylevelbasefill;
258     double          tmpiglfill;
259     double          tmpiglfill2;
260     bool            auxGrayLevelValidationFill;
261
262         distbasefill    = _distancefill * _distancefill;
263         double difX,difY,difZ,_tmpDistfill;
264         std::vector<int> lstX;
265         std::vector<int> lstY;
266         std::vector<int> lstZ;
267         lstX.push_back(px);
268         lstY.push_back(py);
269         lstZ.push_back(pz);
270         std::vector<long long int> lstivi;
271         lstivi.push_back( px + py*_OneLine+ pz*_OnePlane );
272
273         long int OneColumnAux, OneLineAux, OnePlaneAux;  // how to jump in the little image auxImageFill
274         int pxAux, pyAux, pzAux;                                                 // position inside little image auxImageFill
275         int minXAux, minYAux, minZAux;                                   // Where start the little image auxImageFill in the big image
276         vtkImageData* auxImageFill = CreateAuxImageFill(        OneColumnAux,OneLineAux,OnePlaneAux,
277                                                                                                                 px,py,pz,
278                                                                                                                 pxAux,pyAux,pzAux, 
279                                                                                                                 minXAux,minYAux,minZAux );
280         std::vector<long long int> lstiviAux;
281         lstiviAux.push_back( pxAux + pyAux*OneLineAux + pzAux*OnePlaneAux );
282
283         DEF_POINTER_IMAGE_VTK_CREA(v_image,ss_image,p_image,st_image,_image)
284 //      DEF_POINTER_IMAGE_VTK_CREA_set(v_image,ss_image,p_image,st_image,_image)                
285
286         double                  v_image2;
287         int                     ss_image2;
288         char               *p_image2;
289         int                             st_image2;
290
291
292         if (_image2!=NULL)
293         {
294 //              DEF_POINTER_IMAGE_VTK_CREA(v_image2,ss_image2,p_image2,st_image2,_image2)               
295                 DEF_POINTER_IMAGE_VTK_CREA_set(v_image2,ss_image2,p_image2,st_image2,_image2)           
296         } // if _image2
297
298         GETVALUE2_VTK_CREA(graylevelbasefill,p_image,st_image,lstivi[0])        
299
300 //EED 2020-04-28  BORRAME Change to local variables to use with openmp
301 //      DEF_POINTER_IMAGE_VTK_CREA(v_auxImageFill,ss_auxImageFill,p_auxImageFill,st_auxImageFill,_auxImageFill)         
302         DEF_POINTER_IMAGE_VTK_CREA(vAuxImageFill,ssAuxImageFill,pAuxImageFill,stAuxImageFill,auxImageFill)
303
304         while ( lstX.size()!=0 )
305         {
306                 // if point inside image
307                 if ((lstX[0] >= _minX) && (lstX[0] < _dimX) && (lstY[0] >= _minY) && (lstY[0] < _dimY) && (lstZ[0] >= _minZ) && (lstZ[0] < _dimZ)) 
308                 {   
309                         difX = px-lstX[0];
310                         difY = py-lstY[0];
311                         difZ = pz-lstZ[0];
312                         _tmpDistfill = difX*difX + difY*difY + difZ*difZ;
313                         // if distance of center point
314                         if (_tmpDistfill<=distbasefill)
315                         {
316                                 // if point not visited
317                                 GETVALUE2_VTK_CREA(vAuxImageFill,pAuxImageFill,stAuxImageFill,lstiviAux[0] );   
318                                 if (vAuxImageFill==0)
319                                 { 
320                                         // If Gray Level valid
321
322                                         //EED01 
323                                         //              tmpiglfill      = _image->GetScalarComponentAsDouble(px, py, pz, 0);
324                                         GETVALUE2_VTK_CREA(tmpiglfill,p_image,st_image,lstivi[0])       
325
326                                         if (_image2!=NULL)
327                                         {
328                                                 //EED01
329                                                 //                      tmpiglfill2     =       _image2->GetScalarComponentAsDouble(px, py, pz, 0);
330                                                 GETVALUE2_VTK_CREA(tmpiglfill2,p_image2,st_image2,lstivi[0])    
331                                         } else {
332                                                 tmpiglfill2     =       tmpiglfill;
333                                         }
334
335                                         float grayLBFMTOL       = graylevelbasefill - _tolerancefill;
336                                         float grayLBFPTOL       = graylevelbasefill + _tolerancefill;
337                                         bool isInRange          = false;
338                                         //DFCH
339                                         if (_RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
340                                                 isInRange               = true;
341                                         } //fi esle
342                                         else if (_RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
343                                                 grayLBFMTOL     = _RangeMin;
344                                                 isInRange               = true;
345                                         } //fi esle
346                                         else if (_RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL) {
347                                                 grayLBFPTOL     = _RangeMax;
348                                                 isInRange               = true;
349                                         } //fi esle
350                                         else if ((_RangeMin <= graylevelbasefill) && (graylevelbasefill <= _RangeMax)) {
351                                                 grayLBFMTOL     = _RangeMin;
352                                                 grayLBFPTOL     = _RangeMax;
353                                                 isInRange               = true;
354                                         } //fi Range
355
356                                         if (isInRange) 
357                                         {
358                                                 auxGrayLevelValidationFill =    (tmpiglfill  != _graylevel)     && 
359                                                                                                                 (tmpiglfill2 != _graylevel)     &&  // <<<<<<<<< xxxxxxxxxxxxxxxxxxxxxx
360                                                                                                                 (tmpiglfill  >= grayLBFMTOL)    && 
361                                                                                                                 (tmpiglfill  <= grayLBFPTOL)    && 
362                                                                                                                 (_tmpDistfill <= distbasefill) ; //DFCH
363                                         } else {
364                                                 auxGrayLevelValidationFill = false;
365                                         } // if isInRange
366
367                                         if (auxGrayLevelValidationFill==true)  
368                                         {
369                                                 this->_IMManager->AddModifiedPixel(lstX[0], lstY[0], lstZ[0]); //DFCH
370 /*
371                                                 // Modifie image
372                                                 if (_image2!=NULL)
373                                                 {
374                                                         //                              _image2->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
375                                                         SETVALUE2_VTK_CREA(_graylevel,p_image2,st_image2,lstivi[0])
376                                                 } else {
377                                                         //                              _image->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
378                                                         SETVALUE2_VTK_CREA(_graylevel,p_image,st_image,lstivi[0])
379                                                 } // if _image2
380
381 */
382                                                 // Add point to already visited
383                                                 SETVALUE2_VTK_CREA(1,pAuxImageFill,stAuxImageFill,lstiviAux[0]);
384
385                                                 // Add neighborhood points in the list 
386
387
388                                                 if (_2D3D == 0) //2D
389                                                 {
390                                                         if (_direction == 0) // YZ
391                                                         {
392 //lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]+_OneColumn); lstiviAux.push_back(lstiviAux[0]+OneColumnAux);
393 //lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]-_OneColumn); lstiviAux.push_back(lstiviAux[0]-OneColumnAux); 
394   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]+_OneLine);   lstiviAux.push_back(lstiviAux[0]+OneLineAux);
395   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]-_OneLine);   lstiviAux.push_back(lstiviAux[0]-OneLineAux);
396   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back(lstivi[0]+_OnePlane);  lstiviAux.push_back(lstiviAux[0]+OnePlaneAux);
397   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back(lstivi[0]-_OnePlane);  lstiviAux.push_back(lstiviAux[0]-OnePlaneAux);
398                                                         }
399                                                         if (_direction == 1) // XZ
400                                                         {
401   lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]+_OneColumn); lstiviAux.push_back(lstiviAux[0]+OneColumnAux);
402   lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]-_OneColumn); lstiviAux.push_back(lstiviAux[0]-OneColumnAux); 
403 //  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]+_OneLine);   lstiviAux.push_back(lstiviAux[0]+OneLineAux);
404 //  lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]-_OneLine);   lstiviAux.push_back(lstiviAux[0]-OneLineAux);
405   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back(lstivi[0]+_OnePlane);  lstiviAux.push_back(lstiviAux[0]+OnePlaneAux);
406   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back(lstivi[0]-_OnePlane);  lstiviAux.push_back(lstiviAux[0]-OnePlaneAux);
407                                                         }
408                                                         if (_direction == 2) // XY
409                                                         {
410 lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]+_OneColumn); lstiviAux.push_back(lstiviAux[0]+OneColumnAux);
411 lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]-_OneColumn); lstiviAux.push_back(lstiviAux[0]-OneColumnAux); 
412   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]+_OneLine);   lstiviAux.push_back(lstiviAux[0]+OneLineAux);
413   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]-_OneLine);   lstiviAux.push_back(lstiviAux[0]-OneLineAux);
414 //lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back(lstivi[0]+_OnePlane);  lstiviAux.push_back(lstiviAux[0]+OnePlaneAux);
415 //lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back(lstivi[0]-_OnePlane);  lstiviAux.push_back(lstiviAux[0]-OnePlaneAux);
416                                                         }
417                                                 } else { // 3D
418   lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]+_OneColumn); lstiviAux.push_back(lstiviAux[0]+OneColumnAux);
419   lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]);   lstZ.push_back(lstZ[0]);   lstivi.push_back(lstivi[0]-_OneColumn); lstiviAux.push_back(lstiviAux[0]-OneColumnAux); 
420   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]+_OneLine);   lstiviAux.push_back(lstiviAux[0]+OneLineAux);
421   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back(lstivi[0]-_OneLine);   lstiviAux.push_back(lstiviAux[0]-OneLineAux);
422   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back(lstivi[0]+_OnePlane);  lstiviAux.push_back(lstiviAux[0]+OnePlaneAux);
423   lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back(lstivi[0]-_OnePlane);  lstiviAux.push_back(lstiviAux[0]-OnePlaneAux);
424                                                 } // 2D 3D
425                                         } // if gray level valid      auxGrayLevelValidationFill
426                                 } // if point not visited
427                         } // if distance of center point        
428                 } // if point inside image
429                 // Remove point from the list
430                 lstX.erase( lstX.begin() );
431                 lstY.erase( lstY.begin() );
432                 lstZ.erase( lstZ.begin() );
433                 lstivi.erase( lstivi.begin() );
434                 lstiviAux.erase( lstiviAux.begin() );
435         } // while _lstX.size
436
437         Copy_AuxImageFill_To_GeneralAuxFill( minXAux, minYAux, minZAux, auxImageFill );
438         
439         auxImageFill->Delete();
440 }
441
442 //---------------------------------------------------------------------------
443 void FillFilter::SetToleranceFill(double tolerancefill) 
444 {
445         _tolerancefill = tolerancefill;
446 }
447
448 //---------------------------------------------------------------------------
449 void FillFilter::SetDistanceFill(int distancefill) 
450 {
451         _distancefill = distancefill;
452 }
453
454 /*//EED 2020-04-28  BORRAME Change to local variables to use with openmp
455 //---------------------------------------------------------------------------
456 vtkImageData* FillFilter::GetAuxImageFill() 
457 {
458         return _auxImageFill;
459 }
460 */
461