]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp
5b6d3d71aaac84ef7ac49039fb500df3928a4e4d
[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
263
264         distbasefill                            = _distancefill * _distancefill;
265         double difX,difY,difZ,_tmpDistfill;
266         std::vector<int> lstX;
267         std::vector<int> lstY;
268         std::vector<int> lstZ;
269         lstX.push_back(px);
270         lstY.push_back(py);
271         lstZ.push_back(pz);
272         std::vector<long long int> lstivi;
273         lstivi.push_back( px + py*_OneLine+ pz*_OnePlane );
274
275         long int OneColumnAux, OneLineAux, OnePlaneAux;  // how to jump in the little image auxImageFill
276         int pxAux, pyAux, pzAux;                                                 // position inside little image auxImageFill
277         int minXAux, minYAux, minZAux;                                   // Where start the little image auxImageFill in the big image
278         vtkImageData* auxImageFill = CreateAuxImageFill(        OneColumnAux,OneLineAux,OnePlaneAux,
279                                                                                                                 px,py,pz,
280                                                                                                                 pxAux,pyAux,pzAux, 
281                                                                                                                 minXAux,minYAux,minZAux );
282         std::vector<long long int> lstiviAux;
283         lstiviAux.push_back( pxAux + pyAux*OneLineAux + pzAux*OnePlaneAux );
284
285         DEF_POINTER_IMAGE_VTK_CREA(v_image,ss_image,p_image,st_image,_image)
286 //      DEF_POINTER_IMAGE_VTK_CREA_set(v_image,ss_image,p_image,st_image,_image)                
287
288         double                  v_image2;
289         int                     ss_image2;
290         char               *p_image2;
291         int                             st_image2;
292
293
294         if (_image2!=NULL)
295         {
296 //              DEF_POINTER_IMAGE_VTK_CREA(v_image2,ss_image2,p_image2,st_image2,_image2)               
297                 DEF_POINTER_IMAGE_VTK_CREA_set(v_image2,ss_image2,p_image2,st_image2,_image2)           
298         } // if _image2
299
300         GETVALUE2_VTK_CREA(graylevelbasefill,p_image,st_image,lstivi[0])        
301
302 //EED 2020-04-28  BORRAME Change to local variables to use with openmp
303 //      DEF_POINTER_IMAGE_VTK_CREA(v_auxImageFill,ss_auxImageFill,p_auxImageFill,st_auxImageFill,_auxImageFill)         
304         DEF_POINTER_IMAGE_VTK_CREA(vAuxImageFill,ssAuxImageFill,pAuxImageFill,stAuxImageFill,auxImageFill)
305
306         while ( lstX.size()!=0 )
307         {
308                 // if point inside image
309                 if ((lstX[0] >= _minX) && (lstX[0] < _dimX) && (lstY[0] >= _minY) && (lstY[0] < _dimY) && (lstZ[0] >= _minZ) && (lstZ[0] < _dimZ)) 
310                 {   
311                         difX = px-lstX[0];
312                         difY = py-lstY[0];
313                         difZ = pz-lstZ[0];
314                         _tmpDistfill = difX*difX + difY*difY + difZ*difZ;
315                         // if distance of center point
316                         if (_tmpDistfill<=distbasefill)
317                         {
318                                 // if point not visited
319                                 GETVALUE2_VTK_CREA(vAuxImageFill,pAuxImageFill,stAuxImageFill,lstiviAux[0] );   
320                                 if (vAuxImageFill==0)
321                                 { 
322                                         // If Gray Level valid
323
324                                         //EED01 
325                                         //              tmpiglfill      = _image->GetScalarComponentAsDouble(px, py, pz, 0);
326                                         GETVALUE2_VTK_CREA(tmpiglfill,p_image,st_image,lstivi[0])       
327
328                                         if (_image2!=NULL)
329                                         {
330                                                 //EED01
331                                                 //                      tmpiglfill2     =       _image2->GetScalarComponentAsDouble(px, py, pz, 0);
332                                                 GETVALUE2_VTK_CREA(tmpiglfill2,p_image2,st_image2,lstivi[0])    
333                                         } else {
334                                                 tmpiglfill2     =       tmpiglfill;
335                                         }
336
337                                         float grayLBFMTOL       = graylevelbasefill - _tolerancefill;
338                                         float grayLBFPTOL       = graylevelbasefill + _tolerancefill;
339                                         bool isInRange          = false;
340                                         //DFCH
341                                         if (_RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
342                                                 isInRange               = true;
343                                         } //fi esle
344                                         else if (_RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
345                                                 grayLBFMTOL     = _RangeMin;
346                                                 isInRange               = true;
347                                         } //fi esle
348                                         else if (_RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL) {
349                                                 grayLBFPTOL     = _RangeMax;
350                                                 isInRange               = true;
351                                         } //fi esle
352                                         else if ((_RangeMin <= graylevelbasefill) && (graylevelbasefill <= _RangeMax)) {
353                                                 grayLBFMTOL     = _RangeMin;
354                                                 grayLBFPTOL     = _RangeMax;
355                                                 isInRange               = true;
356                                         } //fi Range
357
358                                         if (isInRange) 
359                                         {
360                                                 auxGrayLevelValidationFill =    (tmpiglfill  != _graylevel)     && 
361                                                                                                                 (tmpiglfill2 != _graylevel)     && 
362                                                                                                                 (tmpiglfill  >= grayLBFMTOL)    && 
363                                                                                                                 (tmpiglfill  <= grayLBFPTOL)    && 
364                                                                                                                 (_tmpDistfill <= distbasefill) ; //DFCH
365                                         } else {
366                                                 auxGrayLevelValidationFill = false;
367                                         } // if isInRange
368
369                                         if (auxGrayLevelValidationFill==true)  
370                                         {
371                                                 this->_IMManager->AddModifiedPixel(lstX[0], lstY[0], lstZ[0]); //DFCH
372 /*
373                                                 // Modifie image
374                                                 if (_image2!=NULL)
375                                                 {
376                                                         //                              _image2->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
377                                                         SETVALUE2_VTK_CREA(_graylevel,p_image2,st_image2,lstivi[0])
378                                                 } else {
379                                                         //                              _image->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
380                                                         SETVALUE2_VTK_CREA(_graylevel,p_image,st_image,lstivi[0])
381                                                 } // if _image2
382
383 */
384                                                 // Add point to already visited
385                                                 SETVALUE2_VTK_CREA(1,pAuxImageFill,stAuxImageFill,lstiviAux[0]);
386
387                                                 // Add neighborhood points in the list 
388
389
390                                                 if (_2D3D == 0) //2D
391                                                 {
392                                                         if (_direction == 0) // YZ
393                                                         {
394 //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);
395 //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); 
396   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);
397   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);
398   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);
399   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);
400                                                         }
401                                                         if (_direction == 1) // XZ
402                                                         {
403   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);
404   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); 
405 //  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);
406 //  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);
407   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);
408   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);
409                                                         }
410                                                         if (_direction == 2) // XY
411                                                         {
412 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);
413 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); 
414   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);
415   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);
416 //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);
417 //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);
418                                                         }
419                                                 } else { // 3D
420   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);
421   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); 
422   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);
423   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);
424   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);
425   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);
426                                                 } // 2D 3D
427                                         } // if gray level valid      auxGrayLevelValidationFill
428                                 } // if point not visited
429                         } // if distance of center point        
430                 } // if point inside image
431                 // Remove point from the list
432                 lstX.erase( lstX.begin() );
433                 lstY.erase( lstY.begin() );
434                 lstZ.erase( lstZ.begin() );
435                 lstivi.erase( lstivi.begin() );
436                 lstiviAux.erase( lstiviAux.begin() );
437         } // while _lstX.size
438
439         Copy_AuxImageFill_To_GeneralAuxFill( minXAux, minYAux, minZAux, auxImageFill );
440         
441         auxImageFill->Delete();
442 }
443
444 //---------------------------------------------------------------------------
445 void FillFilter::SetToleranceFill(double tolerancefill) 
446 {
447         _tolerancefill = tolerancefill;
448 }
449
450 //---------------------------------------------------------------------------
451 void FillFilter::SetDistanceFill(int distancefill) 
452 {
453         _distancefill = distancefill;
454 }
455
456 /*//EED 2020-04-28  BORRAME Change to local variables to use with openmp
457 //---------------------------------------------------------------------------
458 vtkImageData* FillFilter::GetAuxImageFill() 
459 {
460         return _auxImageFill;
461 }
462 */
463