]> 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       =   0;      // 0 2D             ,   1 true 3D
11     _brushtool  =   0;      // 0 pencil         ,   1 fill
12
13     _minX=0;
14     _minY=0;
15     _minZ=0;
16     _maxX=0;
17     _maxY=0;
18     _maxZ=0;
19 }
20
21 //---------------------------------------------------------------------------
22 ManualPaintModel::~ManualPaintModel()
23 {
24 }
25
26 void ManualPaintModel::SetImage(vtkImageData *image)
27 {
28     _image=image;
29
30     int ext[6];
31     _image->GetWholeExtent(ext);
32     _minX=0;
33     _minY=0;
34     _minZ=0;
35     _maxX=ext[1]-ext[0];
36     _maxY=ext[3]-ext[2];
37     _maxZ=ext[5]-ext[4];
38 }
39
40 void ManualPaintModel::PaintImage(int px,int py, int pz)
41 {
42     if (_brushtool==0)
43     {
44         BrushTool(px,py,pz);
45     }
46     if (_brushtool==1)
47     {
48         FillTool(px,py,pz);
49     }
50 }
51
52
53 void ManualPaintModel::FillTool(int px,int py, int pz)
54 {
55     if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
56     {
57         _graylevelbasefill  = _image->GetScalarComponentAsDouble(px,py,pz, 0);
58         _pxfill             = px;
59         _pyfill             = py;
60         _pzfill             = pz;
61         _distbasefill       = _distancefill*_distancefill;
62         FillToolRecursive(px,py,pz);
63     } //if _minX _maxX _minY _maxY _minZ _maxZ
64 }
65
66
67 void ManualPaintModel::FillToolRecursive(int px,int py, int pz)
68 {
69
70     double dist=(px-_pxfill) * (px-_pxfill)  + (py-_pyfill) * (py-_pyfill)   + (pz-_pzfill) * (pz-_pzfill);
71
72     if ((px>=_minX) && (px<=_maxX) && (py>=_minY) && (py<=_maxY) && (pz>=_minZ) && (pz<=_maxZ))
73     {
74         float value=(float)_graylevel;
75         double igl=_image->GetScalarComponentAsDouble(px,py,pz, 0);
76         if (  (igl!=_graylevel) &&
77               (igl>=_graylevelbasefill-_tolerancefill) &&
78               (igl<=_graylevelbasefill+_tolerancefill) &&
79               (dist<=_distbasefill)
80             )
81         {
82 //            _image->SetScalarComponentFromFloat (px,py,pz, 0, dist+500 );
83             _image->SetScalarComponentFromFloat (px,py,pz, 0, value );
84             FillToolRecursive(px+1,py,pz);
85             FillToolRecursive(px,py+1,pz);
86             FillToolRecursive(px-1,py,pz);
87             FillToolRecursive(px,py-1,pz);
88 //        FillToolRecursive(px,py,pz-1);
89 //        FillToolRecursive(px,py,pz+1);
90         }
91     } //if _minX _maxX _minY _maxY _minZ _maxZ
92 }
93
94 void ManualPaintModel::BrushTool(int px,int py, int pz)
95 {
96
97     printf("EED ManualPaintModel::PaintImage %d %d %d\n", px,py,pz);
98     if (_image!=NULL)
99     {
100         float value=(float)_graylevel;
101         int i,j,k;
102         int size = _brushsize-1;
103         int minX=px-size;
104         int maxX=px+size;
105         int minY=py-size;
106         int maxY=py+size;
107         int minZ=pz-size;
108         int maxZ=pz+size;
109
110         double xx,yy,zz,rr=size*size;
111
112         printf("EED bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage brushForm=%d\n",_brushform);
113         for (i=minX; i<=maxX; i++)
114         {
115             xx=px-i;
116             xx=xx*xx;
117             for (j=minY; j<=maxY; j++)
118             {
119                 yy=py-j;
120                 yy=yy*yy;
121                 for (k=minZ; k<=maxZ; k++)
122                 {
123                     if ((i>=_minX) && (i<=_maxX) && (j>=_minY) && (j<=_maxY) && (k>=_minZ) && (k<=_maxZ))
124                     {
125                         zz=pz-k;
126                         zz=zz*zz;
127                         if (_brushform==0)
128                         {
129                             _image->SetScalarComponentFromFloat (i,j,k, 0, value );
130                         } else if (_brushform==1)
131                         {
132                             if ((xx+yy+zz)<=rr)
133                             {
134                                 _image->SetScalarComponentFromFloat (i,j,k, 0, value );
135                             }
136                         } // _brushform
137
138                     } //if _minX _maxX _minY _maxY _minZ _maxZ
139
140                 }//k
141             }//j
142         }//i
143         _image->Modified();
144     } else  {
145         printf("ERROR : bbcreaMaracasvisu::vtkInteractorManualPaint::PaintImage :  Image not set. \n");
146     } // _image
147 }
148
149
150 //---------------------------------------------------------------------------
151 void ManualPaintModel::SetBrushSize( int brushsize )
152 {
153     _brushsize = brushsize;
154 }
155
156 //---------------------------------------------------------------------------
157 void ManualPaintModel::SetGrayLevel( double graylevel )
158 {
159     _graylevel = graylevel;
160 }
161
162 //---------------------------------------------------------------------------
163 void ManualPaintModel::SetBrushForm( int brushform )
164 {
165     _brushform = brushform;
166 }
167
168 //---------------------------------------------------------------------------
169 void ManualPaintModel::SetBrushTool( int brushtool )
170 {
171     _brushtool = brushtool;
172 }
173
174 //---------------------------------------------------------------------------
175 void ManualPaintModel::Set2D3D( int dim2D3D )
176 {
177     _2D3D = dim2D3D;
178 }
179
180 //---------------------------------------------------------------------------
181 void ManualPaintModel::SetToleranceFill(double tolerancefill)
182 {
183     _tolerancefill = tolerancefill;
184 }
185
186 //---------------------------------------------------------------------------
187 void ManualPaintModel::SetDistanceFill(int distancefill)
188 {
189     _distancefill = distancefill;
190 }
191