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