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