2 #include "ManualPaintModel.h"
5 ManualPaintModel::ManualPaintModel()
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
15 _limitRecursionFill = 100000;
25 //---------------------------------------------------------------------------
26 ManualPaintModel::~ManualPaintModel()
28 if (_auxImageFill!=NULL)
30 _auxImageFill->Delete();
34 //---------------------------------------------------------------------------
35 void ManualPaintModel::SetImage(vtkImageData *image)
40 _image->GetWholeExtent(ext);
49 if (_auxImageFill!=NULL)
51 _auxImageFill->Delete();
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();
63 //---------------------------------------------------------------------------
64 void ManualPaintModel::PaintImage(int px,int py, int pz)
77 //---------------------------------------------------------------------------
78 void ManualPaintModel::FillTool(int px,int py, int pz)
80 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
82 _graylevelbasefill = _image->GetScalarComponentAsDouble(px,py,pz, 0);
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 );
94 FillToolRecursive(px,py,pz);
98 while (_countRecursiveFillProblem!=0)
100 _countRecursiveFillProblem = 0;
101 _usingAuxImageFill=true;
102 for(ii=0;ii<=_maxX;ii++)
104 for(jj=0;jj<=_maxY;jj++)
106 for(kk=0;kk<=_maxZ;kk++)
108 pImage=(unsigned char *)_auxImageFill->GetScalarPointer(ii,jj,kk);
111 FillToolRecursive(ii,jj,kk);
119 } //if _minX _maxX _minY _maxY _minZ _maxZ
123 //---------------------------------------------------------------------------
124 void ManualPaintModel::FillToolRecursive(int px,int py, int pz)
126 _countRecursiveFill++;
128 _countProgressingFill++;
129 if (_countProgressingFill>200000)
131 printf("R %ld \n", _countRecursiveFill );
132 _countProgressingFill=0;
135 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
137 if (_usingAuxImageFill==true)
139 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 0);
141 _tmpDistfill=(px-_pxfill)*(px-_pxfill) + (py-_pyfill)*(py-_pyfill) + (pz-_pzfill)*(pz-_pzfill);
142 _tmpiglfill=_image->GetScalarComponentAsDouble(px,py,pz, 0);
144 _auxGrayLevelValidationFill = (_tmpiglfill!=_graylevel) &&
145 (_tmpiglfill>=_graylevelbasefill-_tolerancefill) &&
146 (_tmpiglfill<=_graylevelbasefill+_tolerancefill) &&
147 (_tmpDistfill<=_distbasefill);
149 if ( _auxGrayLevelValidationFill==true )
151 _image->SetScalarComponentFromFloat (px,py,pz, 0, (float)_graylevel );
153 if (_countRecursiveFill< _limitRecursionFill)
158 if (_direction==0) // YZ
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);
167 if (_direction==1) // XZ
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);
176 if (_direction==2) // XY
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);
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);
195 } //_countRecursiveFill
199 if ( (_auxGrayLevelValidationFill==true ) &&
200 (_countRecursiveFill>= _limitRecursionFill)
203 _countRecursiveFillProblem++;
207 if (_direction==0) // YZ
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);
216 if (_direction==1) // XZ
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);
225 if (_direction==2) // XY
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);
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);
244 } // _graylevel //_limitRecursionFill
247 } //if _minX _maxX _minY _maxY _minZ _maxZ
250 _countRecursiveFill--;
254 //---------------------------------------------------------------------------
255 void ManualPaintModel::SetAuxImageFill(int px,int py, int pz)
257 if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
259 _auxImageFill->SetScalarComponentFromFloat (px, py, pz,0, 1);
263 //---------------------------------------------------------------------------
264 void ManualPaintModel::BrushTool(int px,int py, int pz)
268 float value=(float)_graylevel;
270 int size = _brushsize-1;
281 if (_direction==0) // YZ
286 if (_direction==1) // XZ
291 if (_direction==2) // XY
303 double xx,yy,zz,rr=size*size;
305 for (i=minX; i<=maxX; i++)
309 for (j=minY; j<=maxY; j++)
313 for (k=minZ; k<=maxZ; k++)
315 if ((i>=_minX) && (i<=_maxX) && (j>=_minY) && (j<=_maxY) && (k>=_minZ) && (k<=_maxZ))
321 _image->SetScalarComponentFromFloat (i,j,k, 0, value );
322 } else if (_brushform==1)
326 _image->SetScalarComponentFromFloat (i,j,k, 0, value );
330 } //if _minX _maxX _minY _maxY _minZ _maxZ
337 printf("ERROR : bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage : Image not set. \n");
342 //---------------------------------------------------------------------------
343 void ManualPaintModel::SetBrushSize( int brushsize )
345 _brushsize = brushsize;
348 //---------------------------------------------------------------------------
349 void ManualPaintModel::SetGrayLevel( double graylevel )
351 _graylevel = graylevel;
354 //---------------------------------------------------------------------------
355 void ManualPaintModel::SetBrushForm( int brushform )
357 _brushform = brushform;
360 //---------------------------------------------------------------------------
361 void ManualPaintModel::SetBrushTool( int brushtool )
363 _brushtool = brushtool;
366 //---------------------------------------------------------------------------
367 void ManualPaintModel::Set2D3D( int dim2D3D )
372 //---------------------------------------------------------------------------
373 void ManualPaintModel::SetToleranceFill(double tolerancefill)
375 _tolerancefill = tolerancefill;
378 //---------------------------------------------------------------------------
379 void ManualPaintModel::SetDistanceFill(int distancefill)
381 _distancefill = distancefill;
384 //---------------------------------------------------------------------------
385 void ManualPaintModel::SetDirection(int direction)
387 _direction = direction;