]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/manualPaint/FillFilter.cpp
0bf97b99bc0540d496687ac483454882364674d5
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / manualPaint / FillFilter.cpp
1 /*# ---------------------------------------------------------------------
2 #
3 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
4 #                        pour la Sant�)
5 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
6 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
7 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
8 #
9 #  This software is governed by the CeCILL-B license under French law and
10 #  abiding by the rules of distribution of free software. You can  use,
11 #  modify and/ or redistribute the software under the terms of the CeCILL-B
12 #  license as circulated by CEA, CNRS and INRIA at the following URL
13 #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
14 #  or in the file LICENSE.txt.
15 #
16 #  As a counterpart to the access to the source code and  rights to copy,
17 #  modify and redistribute granted by the license, users are provided only
18 #  with a limited warranty  and the software's author,  the holder of the
19 #  economic rights,  and the successive licensors  have only  limited
20 #  liability.
21 #
22 #  The fact that you are presently reading this means that you have had
23 #  knowledge of the CeCILL-B license and that you accept its terms.
24 # ------------------------------------------------------------------------ */
25
26 #include "FillFilter.h"
27 #include "creaVtk_MACROS.h"
28
29 #include <vector>
30
31
32
33 FillFilter::FillFilter() 
34 {
35         _tolerancefill          = 125;
36         _distancefill           = 5;
37         _auxImageFill           = NULL;
38         _maxXback                       = 0;
39         _maxYback                       = 0;
40         _maxZback                       = 0;
41 }
42
43 //---------------------------------------------------------------------------
44 FillFilter::~FillFilter() 
45 {
46         if (_auxImageFill != NULL)
47         {
48                 _auxImageFill->Delete();
49         }//_auxImageFill
50 }
51
52 //---------------------------------------------------------------------------
53 void FillFilter::SetImages(vtkImageData *image,vtkImageData *image2) // virtual
54 {       
55         baseFilterManualPaint::SetImages(image,image2); 
56         if ((_maxX!=_maxXback) || (_maxY!=_maxYback) || (_maxZ!=_maxZback)) 
57         {
58                 if (_auxImageFill != NULL)
59                 {
60                         _auxImageFill->Delete();
61                 }
62                 _auxImageFill = vtkImageData::New();
63                 _auxImageFill->SetDimensions(_maxX + 1, _maxY + 1, _maxZ + 1);
64                 _auxImageFill->SetOrigin(0, 0, 0);
65                 _auxImageFill->SetExtent(0, _maxX, 0, _maxY, 0, _maxZ);
66 //EED 2017-01-01 Migration VTK7
67 #if VTK_MAJOR_VERSION <= 5
68                 _auxImageFill->SetWholeExtent(0, _maxX, 0, _maxY, 0, _maxZ);
69                 _auxImageFill->SetScalarTypeToUnsignedChar();
70                 _auxImageFill->AllocateScalars();
71 #else
72                 _auxImageFill->AllocateScalars(VTK_UNSIGNED_CHAR,1);
73 #endif
74         }
75         unsigned char   * ptrAuxImageFill = (unsigned char      *)_auxImageFill->GetScalarPointer();
76         memset(ptrAuxImageFill, 0, (_maxX+1) * (_maxY+1) * (_maxZ+1) );
77         _maxXback=_maxX;
78         _maxYback=_maxY;
79         _maxZback=_maxZ;        
80 }
81
82
83
84
85 //---------------------------------------------------------------------------
86 void FillFilter::Run() // virtual
87 {
88         long int ivi;
89         if ((_px >= _minX) && (_px <= _maxX) && (_py >= _minY) && (_py <= _maxY)
90                         && (_pz >= _minZ) && (_pz <= _maxZ)) 
91         {
92                 this->_IMManager->BaseInitialPoint(_px, _py ,_pz);
93                 _graylevelbasefill                      = _image->GetScalarComponentAsDouble(_px, _py, _pz,0);
94                 _distbasefill                           = _distancefill * _distancefill;
95                 ivi                                             = _px + _py*(_maxX+1) + _pz*(_maxX+1)*(_maxY+1);  // index vector image
96                 FillToolLoop(_px, _py, _pz, ivi);
97         } //if _minX _maxX _minY _maxY _minZ _maxZ
98 }
99
100 //---------------------------------------------------------------------------
101 void FillFilter::FillToolLoop(int px, int py, int pz,long int iviA) 
102 {
103         double difX,difY,difZ,_tmpDistfill;
104         std::vector<int> lstX;
105         std::vector<int> lstY;
106         std::vector<int> lstZ;
107         std::vector<long long int> lstivi;
108         lstX.push_back(px);
109         lstY.push_back(py);
110         lstZ.push_back(pz);
111         lstivi.push_back( iviA );
112
113         DEF_POINTER_IMAGE_VTK_CREA_set(v_image,ss_image,p_image,st_image,_image)                
114         if (_image2!=NULL)
115         {
116                 DEF_POINTER_IMAGE_VTK_CREA_set(v_image2,ss_image2,p_image2,st_image2,_image2)           
117         } // if _image2
118
119         DEF_POINTER_IMAGE_VTK_CREA(v_auxImageFill,ss_auxImageFill,p_auxImageFill,st_auxImageFill,_auxImageFill)         
120         while ( lstX.size()!=0 )
121         {
122                 // if point inside image
123                 if ((lstX[0] >= _minX) && (lstX[0] <= _maxX) && (lstY[0] >= _minY) && (lstY[0] <= _maxY) && (lstZ[0] >= _minZ) && (lstZ[0] <= _maxZ)) 
124                 {   
125                         difX = px-lstX[0];
126                         difY = py-lstY[0];
127                         difZ = pz-lstZ[0];
128                         _tmpDistfill = difX*difX + difY*difY + difZ*difZ;
129                         // if distance of center point
130                         if (_tmpDistfill<=_distbasefill)
131                         {
132                                 // if point not visited
133                                 GETVALUE2_VTK_CREA(v_auxImageFill,p_auxImageFill,st_auxImageFill,lstivi[0] );   
134                                 if (v_auxImageFill==0)
135                                 { 
136                                         // If Gray Level valid
137
138                                         //EED01 
139                                         //              _tmpiglfill     = _image->GetScalarComponentAsDouble(px, py, pz, 0);
140                                         GETVALUE2_VTK_CREA(_tmpiglfill,p_image,st_image,lstivi[0])      
141
142                                         if (_image2!=NULL)
143                                         {
144                                                 //EED01
145                                                 //                      _tmpiglfill2    =       _image2->GetScalarComponentAsDouble(px, py, pz, 0);
146                                                 GETVALUE2_VTK_CREA(_tmpiglfill2,p_image2,st_image2,lstivi[0])   
147                                         } else {
148                                                 _tmpiglfill2    =       _tmpiglfill;
149                                         }
150
151                                         float grayLBFMTOL       = _graylevelbasefill - _tolerancefill;
152                                         float grayLBFPTOL       = _graylevelbasefill + _tolerancefill;
153                                         bool isInRange          = false;
154                                         //DFCH
155                                         if (_RangeMin <= grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
156                                                 isInRange               = true;
157                                         } //fi esle
158                                         else if (_RangeMin > grayLBFMTOL && _RangeMax >= grayLBFPTOL) {
159                                                 grayLBFMTOL     = _RangeMin;
160                                                 isInRange               = true;
161                                         } //fi esle
162                                         else if (_RangeMin <= grayLBFMTOL && _RangeMax < grayLBFPTOL) {
163                                                 grayLBFPTOL     = _RangeMax;
164                                                 isInRange               = true;
165                                         } //fi esle
166                                         else if ((_RangeMin <= _graylevelbasefill) && (_graylevelbasefill <= _RangeMax)) {
167                                                 grayLBFMTOL     = _RangeMin;
168                                                 grayLBFPTOL     = _RangeMax;
169                                                 isInRange               = true;
170                                         } //fi Range
171
172                                         if (isInRange) 
173                                         {
174                                                 _auxGrayLevelValidationFill = (_tmpiglfill != _graylevel)
175                                                                 && (_tmpiglfill2 != _graylevel)
176                                                                 && (_tmpiglfill  >= grayLBFMTOL)
177                                                                 && (_tmpiglfill  <= grayLBFPTOL)
178                                                                 && (_tmpDistfill <= _distbasefill); //DFCH
179                                         } else {
180                                                 _auxGrayLevelValidationFill = false;
181                                         } // if isInRange
182
183                                         if (_auxGrayLevelValidationFill)  
184                                         {
185
186                                                 this->_IMManager->AddModifiedPixel(lstX[0], lstY[0], lstZ[0]); //DFCH
187
188                                                 // Modifie image
189                                                 if (_image2!=NULL)
190                                                 {
191                                                         //                              _image2->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
192                                                         SETVALUE2_VTK_CREA(_graylevel,p_image2,st_image2,lstivi[0])
193                                                 } else {
194                                                         //                              _image->SetScalarComponentFromFloat(px, py, pz, 0,(float) _graylevel);
195                                                         SETVALUE2_VTK_CREA(_graylevel,p_image,st_image,lstivi[0])
196                                                 } // if _image2
197
198                                                 // Add neighborhood points in the list 
199                                                 if (_2D3D == 0) //2D
200                                                 {
201                                                         if (_direction == 0) // YZ
202                                                         {
203                                                                 //lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
204                                                                 //lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
205                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
206                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
207                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
208                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
209                                                         }
210                                                         if (_direction == 1) // XZ
211                                                         {
212                                                                 lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
213                                                                 lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
214                                                                 // lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
215                                                                 // lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
216                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
217                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
218                                                         }
219                                                         if (_direction == 2) // XY
220                                                         {
221                                                                 lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
222                                                                 lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
223                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
224                                                                 lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
225                                                                 //lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
226                                                                 //lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
227                                                         }
228                                                 } else { // 3D
229                                                         lstX.push_back(lstX[0]+1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneColumn);
230                                                         lstX.push_back(lstX[0]-1); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneColumn);
231                                                         lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]+1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]+_OneLine);
232                                                         lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]-1); lstZ.push_back(lstZ[0]  ); lstivi.push_back( lstivi[0]-_OneLine);
233                                                         lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]+1); lstivi.push_back( lstivi[0]+_OnePlane);
234                                                         lstX.push_back(lstX[0]  ); lstY.push_back(lstY[0]  ); lstZ.push_back(lstZ[0]-1); lstivi.push_back( lstivi[0]-_OnePlane);
235                                                 } // 2D 3D
236                                         } // if gray level valid      _auxGrayLevelValidationFill
237                                 } // if point not visited
238                                 // Add point to already visited
239                                 SETVALUE2_VTK_CREA(1,p_auxImageFill,st_auxImageFill,lstivi[0]);
240                         } // if distance of center point
241                 } // if point inside image
242                 // Remove point from the list
243                 lstX.erase( lstX.begin() );
244                 lstY.erase( lstY.begin() );
245                 lstZ.erase( lstZ.begin() );
246                 lstivi.erase( lstivi.begin() );
247         } // while _lstX.size
248 }
249
250 //---------------------------------------------------------------------------
251 void FillFilter::SetToleranceFill(double tolerancefill) 
252 {
253         _tolerancefill = tolerancefill;
254 }
255
256 //---------------------------------------------------------------------------
257 void FillFilter::SetDistanceFill(int distancefill) 
258 {
259         _distancefill = distancefill;
260 }
261
262 //---------------------------------------------------------------------------
263 vtkImageData* FillFilter::GetAuxImageFill() 
264 {
265         return _auxImageFill;
266 }
267
268
269