1 #include "FillFilter.h"
3 FillFilter::FillFilter() {
6 _limitRecursionFill = 50000;
10 //---------------------------------------------------------------------------
11 FillFilter::~FillFilter() {
12 if (_auxImageFill != NULL)
14 _auxImageFill->Delete();
18 //---------------------------------------------------------------------------
19 void FillFilter::SetImage(vtkImageData *image) // virtual
21 baseFilterManualPaint::SetImage(image);
22 if (_auxImageFill != NULL)
24 _auxImageFill->Delete();
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();
35 //---------------------------------------------------------------------------
36 void FillFilter::Run() // virtual
38 if ((_px >= _minX) && (_px <= _maxX) && (_py >= _minY) && (_py <= _maxY)
39 && (_pz >= _minZ) && (_pz <= _maxZ)) {
40 _graylevelbasefill = _image->GetScalarComponentAsDouble(_px, _py, _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);
54 FillToolRecursive(_px, _py, _pz);
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++) {
65 (unsigned char *) _auxImageFill->GetScalarPointer(
68 FillToolRecursive(ii, jj, kk);
76 } //if _minX _maxX _minY _maxY _minZ _maxZ
79 //---------------------------------------------------------------------------
80 void FillFilter::FillToolRecursive(int px, int py, int pz) {
81 _countRecursiveFill++;
83 _countProgressingFill++;
84 if (_countProgressingFill > 200000) {
85 printf("R %ld \n", _countRecursiveFill);
86 _countProgressingFill = 0;
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);
95 _tmpDistfill = (px - _pxfill) * (px - _pxfill)
96 + (py - _pyfill) * (py - _pyfill)
97 + (pz - _pzfill) * (pz - _pzfill);
98 _tmpiglfill = _image->GetScalarComponentAsDouble(px, py, pz, 0);
100 float grayLBFMTOL = _graylevelbasefill - _tolerancefill;
101 float grayLBFPTOL = _graylevelbasefill + _tolerancefill;
102 bool isInRange = false;
104 if (_RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
107 else if (_RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
108 grayLBFMTOL = _RangeMin;
111 else if (_RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL) {
112 grayLBFPTOL = _RangeMax;
115 else if ((_RangeMin <= _graylevelbasefill)
116 && (_graylevelbasefill <= _RangeMax)) {
117 grayLBFMTOL = _RangeMin;
118 grayLBFPTOL = _RangeMax;
123 _auxGrayLevelValidationFill = (_tmpiglfill != _graylevel)
124 && (_tmpiglfill >= grayLBFMTOL)
125 && (_tmpiglfill <= grayLBFPTOL)
126 && (_tmpDistfill <= _distbasefill); //DFCH
129 _auxGrayLevelValidationFill = false;
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,
141 if (_countRecursiveFill < _limitRecursionFill) {
145 if (_direction == 0) // YZ
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);
154 if (_direction == 1) // XZ
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);
163 if (_direction == 2) // XY
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);
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);
182 } //_countRecursiveFill
185 if ((_auxGrayLevelValidationFill == true)
186 && (_countRecursiveFill >= _limitRecursionFill)) {
187 _countRecursiveFillProblem++;
191 if (_direction == 0) // YZ
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);
200 if (_direction == 1) // XZ
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);
209 if (_direction == 2) // XY
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);
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);
228 } // _graylevel //_limitRecursionFill
230 } //if _minX _maxX _minY _maxY _minZ _maxZ
232 _countRecursiveFill--;
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);
245 //---------------------------------------------------------------------------
246 void FillFilter::SetToleranceFill(double tolerancefill) {
247 _tolerancefill = tolerancefill;
250 //---------------------------------------------------------------------------
251 void FillFilter::SetDistanceFill(int distancefill) {
252 _distancefill = distancefill;
255 //---------------------------------------------------------------------------
256 void FillFilter::SetRangeMin(int min) {
260 //---------------------------------------------------------------------------
261 void FillFilter::SetRangeMax(int max) {
265 //---------------------------------------------------------------------------
266 int FillFilter::GetRangeMin() {
270 //---------------------------------------------------------------------------
271 int FillFilter::GetRangeMax() {