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