]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp
*** empty log message ***
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualPaint / FillFilter.cpp
1
2 #include "FillFilter.h"
3
4
5 FillFilter::FillFilter()
6 {
7     _graylevel          =   0.0;
8     _2D3D               =   1;      // 0 2D             ,   1 true 3D
9     _direction          =   0;      // 1 XZ             ,   0 YZ            ,   2 XY
10     _tolerancefill      =   50;
11     _distancefill       =   500;
12     _limitRecursionFill =   100000;
13     _minX               =   0;
14     _minY               =   0;
15     _minZ               =   0;
16     _maxX               =   0;
17     _maxY               =   0;
18     _maxZ               =   0;
19     _auxImageFill       =   NULL;
20 }
21
22 //---------------------------------------------------------------------------
23 FillFilter::~FillFilter()
24 {
25     if (_auxImageFill!=NULL)
26     {
27         _auxImageFill->Delete();
28     }
29 }
30
31 //---------------------------------------------------------------------------
32 void FillFilter::SetImage(vtkImageData *image)
33 {
34     _image=image;
35
36     int ext[6];
37     _image->GetWholeExtent(ext);
38     _minX=0;
39     _minY=0;
40     _minZ=0;
41     _maxX=ext[1]-ext[0];
42     _maxY=ext[3]-ext[2];
43     _maxZ=ext[5]-ext[4];
44
45
46     if (_auxImageFill!=NULL)
47     {
48         _auxImageFill->Delete();
49     }
50         _auxImageFill = vtkImageData::New();
51         _auxImageFill->SetDimensions(_maxX+1,_maxY+1,_maxZ+1);
52         _auxImageFill->SetOrigin(0,0,0);
53         _auxImageFill->SetExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
54         _auxImageFill->SetWholeExtent( 0 , _maxX , 0 , _maxY , 0, _maxZ );
55         _auxImageFill->SetScalarTypeToUnsignedChar();
56         _auxImageFill->AllocateScalars();
57
58 }
59
60 //---------------------------------------------------------------------------
61 void FillFilter::FillTool(int px,int py, int pz)
62 {
63     if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
64     {
65         _graylevelbasefill          = _image->GetScalarComponentAsDouble(px,py,pz, 0);
66         _pxfill                     = px;
67         _pyfill                     = py;
68         _pzfill                     = pz;
69         _distbasefill               = _distancefill*_distancefill;
70         _countRecursiveFill         = 0;
71         _countRecursiveFillProblem  = 0;
72         _countProgressingFill       = 0;
73         unsigned char *pImage = (unsigned char *)_auxImageFill->GetScalarPointer();
74         _usingAuxImageFill=false;
75         memset ( pImage , 0 , _maxX*_maxY*_maxZ );
76
77         FillToolRecursive(px,py,pz);
78         printf("--\n");
79
80         int ii,jj,kk;
81         while (_countRecursiveFillProblem!=0)
82         {
83             _countRecursiveFillProblem  = 0;
84             _usingAuxImageFill=true;
85             for(ii=0;ii<=_maxX;ii++)
86             {
87                 for(jj=0;jj<=_maxY;jj++)
88                 {
89                     for(kk=0;kk<=_maxZ;kk++)
90                     {
91                         pImage=(unsigned char *)_auxImageFill->GetScalarPointer(ii,jj,kk);
92                         if ( (*pImage)==1 )
93                         {
94                             FillToolRecursive(ii,jj,kk);
95                         }
96                     } // for kk
97                 } // for jj
98             } //for ii
99             printf("-\n");
100         } // while
101
102     } //if _minX _maxX _minY _maxY _minZ _maxZ
103 }
104
105
106 //---------------------------------------------------------------------------
107 void FillFilter::FillToolRecursive(int px,int py, int pz)
108 {
109     _countRecursiveFill++;
110
111     _countProgressingFill++;
112     if (_countProgressingFill>200000)
113     {
114         printf("R %ld \n", _countRecursiveFill );
115         _countProgressingFill=0;
116     }
117
118     if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
119     {
120         if (_usingAuxImageFill==true)
121         {
122             _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
123         }
124         _tmpDistfill=(px-_pxfill)*(px-_pxfill)  + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
125         _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
126
127         _auxGrayLevelValidationFill =   (_tmpiglfill!=_graylevel) &&
128                                         (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
129                                         (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
130                                         (_tmpDistfill<=_distbasefill);
131
132         if (  _auxGrayLevelValidationFill==true )
133         {
134             _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
135
136             if (_countRecursiveFill< _limitRecursionFill)
137             {
138
139                 if (_2D3D==0) //2D
140                 {
141                     if (_direction==0)  // YZ
142                     {
143                         //FillToolRecursive(px+1,py,pz);
144                         //FillToolRecursive(px-1,py,pz);
145                         FillToolRecursive(px,py+1,pz);
146                         FillToolRecursive(px,py-1,pz);
147                         FillToolRecursive(px,py,pz-1);
148                         FillToolRecursive(px,py,pz+1);
149                     }
150                     if (_direction==1) // XZ
151                     {
152                         FillToolRecursive(px+1,py,pz);
153                         FillToolRecursive(px-1,py,pz);
154                         //FillToolRecursive(px,py+1,pz);
155                         //FillToolRecursive(px,py-1,pz);
156                         FillToolRecursive(px,py,pz-1);
157                         FillToolRecursive(px,py,pz+1);
158                     }
159                     if (_direction==2) // XY
160                     {
161                         FillToolRecursive(px+1,py,pz);
162                         FillToolRecursive(px,py+1,pz);
163                         FillToolRecursive(px-1,py,pz);
164                         FillToolRecursive(px,py-1,pz);
165                         //FillToolRecursive(px,py,pz-1);
166                         //FillToolRecursive(px,py,pz+1);
167                     }
168                 } else  {   // 3D
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                 } // 2D 3D
177
178             } //_countRecursiveFill
179         } // _graylevel
180
181
182         if (  (_auxGrayLevelValidationFill==true ) &&
183               (_countRecursiveFill>= _limitRecursionFill)
184             )
185         {
186             _countRecursiveFillProblem++;
187
188                 if (_2D3D==0) //2D
189                 {
190                     if (_direction==0)  // YZ
191                     {
192                         //SetAuxImageFill(px+1,py,pz);
193                         //SetAuxImageFill(px-1,py,pz);
194                         SetAuxImageFill(px,py+1,pz);
195                         SetAuxImageFill(px,py-1,pz);
196                         SetAuxImageFill(px,py,pz-1);
197                         SetAuxImageFill(px,py,pz+1);
198                     }
199                     if (_direction==1) // XZ
200                     {
201                         SetAuxImageFill(px+1,py,pz);
202                         SetAuxImageFill(px-1,py,pz);
203                         //SetAuxImageFill(px,py+1,pz);
204                         //SetAuxImageFill(px,py-1,pz);
205                         SetAuxImageFill(px,py,pz-1);
206                         SetAuxImageFill(px,py,pz+1);
207                     }
208                     if (_direction==2) // XY
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                 } else  {   // 3D
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                 } // 2D 3D
226
227         } // _graylevel   //_limitRecursionFill
228
229
230     } //if _minX _maxX _minY _maxY _minZ _maxZ
231
232
233     _countRecursiveFill--;
234
235 }
236
237 //---------------------------------------------------------------------------
238 void FillFilter::SetAuxImageFill(int px,int py, int pz)
239 {
240     if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
241     {
242         _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
243     }
244 }
245
246 //---------------------------------------------------------------------------
247 void FillFilter::BrushTool(int px,int py, int pz)
248 {
249     if (_image!=NULL)
250     {
251         float value=(float)_graylevel;
252         int i,j,k;
253         int size = _brushsize-1;
254
255         int minX = px-size;
256         int maxX = px+size;
257         int minY = py-size;
258         int maxY = py+size;
259         int minZ = pz-size;
260         int maxZ = pz+size;
261
262         if (_2D3D==0) //2D
263         {
264             if (_direction==0)  // YZ
265             {
266                 minX=px;
267                 maxX=px;
268             }
269             if (_direction==1) // XZ
270             {
271                 minY=py;
272                 maxY=py;
273             }
274             if (_direction==2) // XY
275             {
276                 minZ=pz;
277                 maxZ=pz;
278             }
279         }
280
281         if (_2D3D==1) // 3D
282         {
283         }
284
285
286         double xx,yy,zz,rr=size*size;
287
288         for (i=minX; i<=maxX; i++)
289         {
290             xx=px-i;
291             xx=xx*xx;
292             for (j=minY; j<=maxY; j++)
293             {
294                 yy=py-j;
295                 yy=yy*yy;
296                 for (k=minZ; k<=maxZ; k++)
297                 {
298                     if ((i>=_minX) && (i<=_maxX) && (j>=_minY) && (j<=_maxY) && (k>=_minZ) && (k<=_maxZ))
299                     {
300                         zz=pz-k;
301                         zz=zz*zz;
302                         if (_brushform==0)
303                         {
304                             _image->SetScalarComponentFromFloat (i,j,k, 0, value );
305                         } else if (_brushform==1)
306                         {
307                             if ((xx+yy+zz)<=rr)
308                             {
309                                 _image->SetScalarComponentFromFloat (i,j,k, 0, value );
310                             }
311                         } // _brushform
312
313                     } //if _minX _maxX _minY _maxY _minZ _maxZ
314
315                 }//k
316             }//j
317         }//i
318         _image->Modified();
319     } else  {
320         printf("ERROR : bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage :  Image not set. \n");
321     } // _image
322 }
323
324
325
326 //---------------------------------------------------------------------------
327 void FillFilter::SetGrayLevel( double graylevel )
328 {
329     _graylevel = graylevel;
330 }
331
332
333
334 //---------------------------------------------------------------------------
335 void FillFilter::Set2D3D( int dim2D3D )
336 {
337     _2D3D = dim2D3D;
338 }
339
340 //---------------------------------------------------------------------------
341 void FillFilter::SetToleranceFill(double tolerancefill)
342 {
343     _tolerancefill = tolerancefill;
344 }
345
346 //---------------------------------------------------------------------------
347 void FillFilter::SetDistanceFill(int distancefill)
348 {
349     _distancefill = distancefill;
350 }
351
352 //---------------------------------------------------------------------------
353 void FillFilter::SetDirection(int direction)
354 {
355     _direction = direction;
356 }
357