]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp
FillFilter Range panel working!! :) :) :)
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualPaint / FillFilter.cpp
1
2 #include "FillFilter.h"
3
4
5 FillFilter::FillFilter()
6 {
7     _tolerancefill      =   50;
8     _distancefill       =   500;
9     _limitRecursionFill =   50000;
10     _auxImageFill       =   NULL;
11 }
12
13 //---------------------------------------------------------------------------
14 FillFilter::~FillFilter()
15 {
16     if (_auxImageFill!=NULL)
17     {
18         _auxImageFill->Delete();
19     }
20 }
21
22 //---------------------------------------------------------------------------
23 void FillFilter::SetImage(vtkImageData *image) // virtual
24 {
25     baseFilterManualPaint::SetImage(image);
26     if (_auxImageFill!=NULL)
27     {
28         _auxImageFill->Delete();
29     }
30         _auxImageFill = vtkImageData::New();
31         _auxImageFill->SetDimensions(_maxX+1,_maxY+1,_maxZ+1);
32         _auxImageFill->SetOrigin(0,0,0);
33         _auxImageFill->SetExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
34         _auxImageFill->SetWholeExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
35         _auxImageFill->SetScalarTypeToUnsignedChar();
36         _auxImageFill->AllocateScalars();
37 }
38
39
40 //---------------------------------------------------------------------------
41 void FillFilter::Run() // virtual
42 {
43     if ((_px>=_minX) && (_px<=_maxX) && (_py>=_minY) && (_py<=_maxY) && (_pz>=_minZ) && (_pz<=_maxZ))
44     {
45         _graylevelbasefill          = _image->GetScalarComponentAsDouble(_px,_py,_pz, 0);
46         _pxfill                     = _px;
47         _pyfill                     = _py;
48         _pzfill                     = _pz;
49         _distbasefill               = _distancefill*_distancefill;
50         _countRecursiveFill         = 0;
51         _countRecursiveFillProblem  = 0;
52         _countProgressingFill       = 0;
53         unsigned char *pImage = (unsigned char *)_auxImageFill->GetScalarPointer();
54         _usingAuxImageFill=false;
55         memset ( pImage , 0 , _maxX*_maxY*_maxZ );
56
57         FillToolRecursive(_px,_py,_pz);
58         printf("--\n");
59
60         int ii,jj,kk;
61         while (_countRecursiveFillProblem!=0)
62         {
63             _countRecursiveFillProblem  = 0;
64             _usingAuxImageFill=true;
65             for(ii=0;ii<=_maxX;ii++)
66             {
67                 for(jj=0;jj<=_maxY;jj++)
68                 {
69                     for(kk=0;kk<=_maxZ;kk++)
70                     {
71                         pImage=(unsigned char *)_auxImageFill->GetScalarPointer(ii,jj,kk);
72                         if ( (*pImage)==1 )
73                         {
74                             FillToolRecursive(ii,jj,kk);
75                         }
76                     } // for kk
77                 } // for jj
78             } //for ii
79             printf("-\n");
80         } // while
81
82     } //if _minX _maxX _minY _maxY _minZ _maxZ
83 }
84
85
86 //---------------------------------------------------------------------------
87 void FillFilter::FillToolRecursive(int px,int py, int pz)
88 {
89     _countRecursiveFill++;
90
91     _countProgressingFill++;
92     if (_countProgressingFill>200000)
93     {
94         printf("R %ld \n", _countRecursiveFill );
95         _countProgressingFill=0;
96     }
97
98     if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
99     {
100         if (_usingAuxImageFill==true)
101         {
102             _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
103         }
104         _tmpDistfill=(px-_pxfill)*(px-_pxfill)  + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
105         _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
106
107         float grayLBFMTOL = _graylevelbasefill-_tolerancefill;
108         float grayLBFPTOL = _graylevelbasefill+_tolerancefill;
109         bool isInRange = false;
110         //DFCH
111         if( _RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL )
112         {
113                 isInRange = true;
114         }//fi esle
115         else if( _RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL )
116         {
117                 grayLBFMTOL = _RangeMin;
118                 isInRange = true;
119         }//fi esle
120         else if( _RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL )
121         {
122                 grayLBFPTOL = _RangeMax;
123                 isInRange = true;
124         }//fi esle
125         else if(  ( _RangeMin <= _graylevelbasefill ) && ( _graylevelbasefill <= _RangeMax ) )
126         {
127                 grayLBFMTOL = _RangeMin;
128                 grayLBFPTOL = _RangeMax;
129                 isInRange = true;
130         }//fi esle
131
132         if( isInRange )
133         {
134                 _auxGrayLevelValidationFill =  (_tmpiglfill!=_graylevel) &&
135                                             (_tmpiglfill>=grayLBFMTOL) &&
136                                             (_tmpiglfill<=grayLBFPTOL) &&
137                                             (_tmpDistfill<=_distbasefill); //DFCH
138         }//fi
139         else
140         {
141                 _auxGrayLevelValidationFill = false;
142         }//esle
143         //DFCH
144         /*_auxGrayLevelValidationFill =   (_tmpiglfill!=_graylevel) &&
145                                         (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
146                                         (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
147                                         (_tmpDistfill<=_distbasefill);*/ //DFCH
148
149
150         if (  _auxGrayLevelValidationFill==true )
151         {
152             _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
153
154             if (_countRecursiveFill< _limitRecursionFill)
155             {
156
157                 if (_2D3D==0) //2D
158                 {
159                     if (_direction==0)  // YZ
160                     {
161                         //FillToolRecursive(px+1,py,pz);
162                         //FillToolRecursive(px-1,py,pz);
163                         FillToolRecursive(px,py+1,pz);
164                         FillToolRecursive(px,py-1,pz);
165                         FillToolRecursive(px,py,pz-1);
166                         FillToolRecursive(px,py,pz+1);
167                     }
168                     if (_direction==1) // XZ
169                     {
170                         FillToolRecursive(px+1,py,pz);
171                         FillToolRecursive(px-1,py,pz);
172                         //FillToolRecursive(px,py+1,pz);
173                         //FillToolRecursive(px,py-1,pz);
174                         FillToolRecursive(px,py,pz-1);
175                         FillToolRecursive(px,py,pz+1);
176                     }
177                     if (_direction==2) // XY
178                     {
179                         FillToolRecursive(px+1,py,pz);
180                         FillToolRecursive(px,py+1,pz);
181                         FillToolRecursive(px-1,py,pz);
182                         FillToolRecursive(px,py-1,pz);
183                         //FillToolRecursive(px,py,pz-1);
184                         //FillToolRecursive(px,py,pz+1);
185                     }
186                 } else  {   // 3D
187
188                     FillToolRecursive(px+1,py,pz);
189                     FillToolRecursive(px-1,py,pz);
190                     FillToolRecursive(px,py+1,pz);
191                     FillToolRecursive(px,py-1,pz);
192                     FillToolRecursive(px,py,pz-1);
193                     FillToolRecursive(px,py,pz+1);
194                 } // 2D 3D
195
196             } //_countRecursiveFill
197         } // _graylevel
198
199
200         if (  (_auxGrayLevelValidationFill==true ) &&
201               (_countRecursiveFill>= _limitRecursionFill)
202             )
203         {
204             _countRecursiveFillProblem++;
205
206                 if (_2D3D==0) //2D
207                 {
208                     if (_direction==0)  // YZ
209                     {
210                         //SetAuxImageFill(px+1,py,pz);
211                         //SetAuxImageFill(px-1,py,pz);
212                         SetAuxImageFill(px,py+1,pz);
213                         SetAuxImageFill(px,py-1,pz);
214                         SetAuxImageFill(px,py,pz-1);
215                         SetAuxImageFill(px,py,pz+1);
216                     }
217                     if (_direction==1) // XZ
218                     {
219                         SetAuxImageFill(px+1,py,pz);
220                         SetAuxImageFill(px-1,py,pz);
221                         //SetAuxImageFill(px,py+1,pz);
222                         //SetAuxImageFill(px,py-1,pz);
223                         SetAuxImageFill(px,py,pz-1);
224                         SetAuxImageFill(px,py,pz+1);
225                     }
226                     if (_direction==2) // XY
227                     {
228                         SetAuxImageFill(px+1,py,pz);
229                         SetAuxImageFill(px-1,py,pz);
230                         SetAuxImageFill(px,py+1,pz);
231                         SetAuxImageFill(px,py-1,pz);
232                         //SetAuxImageFill(px,py,pz-1);
233                         //SetAuxImageFill(px,py,pz+1);
234                     }
235                 } else  {   // 3D
236
237                     SetAuxImageFill(px+1,py,pz);
238                     SetAuxImageFill(px-1,py,pz);
239                     SetAuxImageFill(px,py+1,pz);
240                     SetAuxImageFill(px,py-1,pz);
241                     SetAuxImageFill(px,py,pz-1);
242                     SetAuxImageFill(px,py,pz+1);
243                 } // 2D 3D
244
245         } // _graylevel   //_limitRecursionFill
246
247
248     } //if _minX _maxX _minY _maxY _minZ _maxZ
249
250
251     _countRecursiveFill--;
252
253 }
254
255 //---------------------------------------------------------------------------
256 void FillFilter::SetAuxImageFill(int px,int py, int pz)
257 {
258     if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
259     {
260         _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
261     }
262 }
263
264
265 //---------------------------------------------------------------------------
266 void FillFilter::SetToleranceFill(double tolerancefill)
267 {
268     _tolerancefill = tolerancefill;
269 }
270
271 //---------------------------------------------------------------------------
272 void FillFilter::SetDistanceFill(int distancefill)
273 {
274     _distancefill = distancefill;
275 }
276
277 //---------------------------------------------------------------------------
278 void FillFilter::SetRangeMin(  int min )
279 {
280         _RangeMin  = min;
281 }
282
283 //---------------------------------------------------------------------------
284 void FillFilter::SetRangeMax(  int max )
285 {
286         _RangeMax  = max;
287 }
288
289 //---------------------------------------------------------------------------
290 int FillFilter::GetRangeMin( )
291 {
292         return( _RangeMin );
293 }
294
295 //---------------------------------------------------------------------------
296 int FillFilter::GetRangeMax(  )
297 {
298         return( _RangeMax );
299 }