]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramWidget.cxx
BUG histogram
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / pPlotter / HistogramWidget.cxx
1 /*
2  This class plots image's histograms in a plotter
3 */
4
5  //---------------------
6  // Includes
7  //----------------------
8  #include "HistogramWidget.h"
9  #include  "vtkImageCast.h"
10  #include  <math.h>
11 // ----------------------------------------------------------------------------
12 // WX headers inclusion.
13 // For compilers that support precompilation, includes <wx/wx.h>.
14 // ----------------------------------------------------------------------------
15
16         #ifndef WX_PRECOMP
17         #include <wx/wx.h>
18         #endif
19
20 //----------------------------------------------------------------------------
21 // Class implementation
22 //----------------------------------------------------------------------------
23
24 IMPLEMENT_CLASS(HistogramWidget, wxWindow)
25 //----------------------------------------------------------------------------
26 // Event Table
27 //----------------------------------------------------------------------------
28
29 BEGIN_EVENT_TABLE(HistogramWidget, wxWindow)
30         EVT_SIZE  (HistogramWidget::OnSize)
31 END_EVENT_TABLE()
32  //---------------------
33  // Constructor
34  //----------------------
35 //wxScrolledWindow(wxWindow* parent, wxWindowID id = -1, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxHSCROLL | wxVSCROLL, const wxString& name = "scrolledWindow")
36 //wxWindow(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0, const wxString& name = wxPanelNameStr)
37 //pPlotterWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag )
38 /*
39 HistogramWidget::HistogramWidget( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag):wxWindow(parent,id,pos,size,flag)
40         {
41         }
42  */
43         HistogramWidget::HistogramWidget( wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxSize &size, int flag,vtkImageData* imageData,int type):
44         wxPanel(parent,id,pos,size,flag)
45         {
46                  SetBackgroundColour(wxColour(255,255,255));
47                 //histogram
48                 histogram= new pHistogram(imageData);
49                 
50                 //plotter
51                 plotter=new pPlotter(this, 400,350);
52
53                 //is a plotter of histograms
54                 plotter->setType(2);
55                 //setting the popMenu
56                 plotter->setPopUpMenu(true,true,true,true,true,true,false,false,false,false,false,false,false);
57                 histogramSize=0;
58                 idTransferenceFunction=-1;
59                 idHistogram=-1;
60                 transferenceFunctionHasColor=true;
61                 transferenceFunctionHasPoints=true;
62                 this->type=type;;
63                 
64                 //drawing
65                 drawHistogram();
66                 drawTransferenceFunction();
67                 
68         }
69
70         HistogramWidget::~HistogramWidget()
71         {
72                 delete histogram;
73                 delete plotter;
74
75         }
76         /*
77         Draw the histogram in the plotter
78         */
79         void HistogramWidget::drawHistogram()
80         {
81                 //int xValues[MAX],yValues[MAX],extent[6];
82                 double* xValues;
83                 double* yValues;
84                 
85                 vtkImageData* histogramImageData=histogram->getHistogram();
86                 
87                 //size
88                 histogramSize=histogram->getSize();
89
90                 //plotting
91                 xValues=(double*)malloc(NUM_POINTS*sizeof(double));
92                 yValues=(double*)malloc(NUM_POINTS*sizeof(double));
93                 
94                 unsigned short* histogramPointer=(unsigned short*)histogramImageData->GetScalarPointer(0,0,0);
95                 
96                 for(int i=0; i< histogramSize; i++)
97                 {
98                         xValues[i]=i;
99                         yValues[i]=log( (double) histogramPointer[i]);
100                 }
101
102                 
103                 pGraphicalFunction* histogramFunction=plotter->getFunctionForVectors(xValues,histogramSize,yValues,histogramSize);
104                 
105                 if (histogramFunction)
106                 {
107                         histogramFunction->setEditable(false);
108                         //smooth function
109                         histogramFunction->setType(2);
110                         //it is an histogram
111                         histogramFunction->setmType(2);
112                         idHistogram=plotter->addFunction(histogramFunction);
113                         //for setting range the vision
114                         plotter->addFunctionToMove(histogramFunction);
115                         wxPen mypen1(*wxBLUE, 1, wxSOLID );
116                         mypen1.SetWidth(2);
117                         histogramFunction->SetPen( mypen1 );
118                 }
119                         
120                         free(xValues);
121                         free(yValues);
122                 
123         }
124         /*
125         Draw the transference function in the plotter
126         one  for default
127         */
128         void HistogramWidget::drawTransferenceFunction()
129         {
130         
131                         double xValues[5],yValues[5];
132                         //xValues
133                         int maxValueGrey=histogram->getMaximumLevelOfGrey();
134                         xValues[0]=0;
135                         xValues[1]=maxValueGrey/16;
136                         xValues[2]=maxValueGrey/8;
137                         xValues[3]=maxValueGrey/16+(maxValueGrey-maxValueGrey/2)/2;
138                         xValues[4]=maxValueGrey;
139                         
140                         //yValues
141                         yValues[0]=0;
142                         yValues[1]=25;
143                         yValues[2]=100;
144                         yValues[3]=25;
145                         yValues[4]=0;
146                         
147                         pGraphicalFunction * tf = plotter ->getFunctionForVectors( xValues, 5, yValues, 5 ); 
148                 printf("EED %p HistogramWidget::drawTransferenceFunction %p\n", this , tf);             
149                         // Including and drawing the created function in the plotter
150                         if (tf)
151                         {
152                                 tf->setType(1);
153                                 //is the actual Function
154                                 tf->setActual(true);
155                                 //show points
156                                 tf->SetShowPoints(true);
157                                 idTransferenceFunction=plotter->addFunction( tf );
158                                 if(type==1)
159                                         plotter->addFunctionToMove(tf);
160                                 wxPen mypen(*wxBLACK,0.5, wxSOLID  );
161                                 mypen.SetWidth(2);
162                                 tf->SetPen( mypen );
163                         }
164         }
165
166         /*
167                 if the user resize the window   
168         */
169         void HistogramWidget::OnSize(wxSizeEvent &WXUNUSED(event))
170         {
171                 int scrX,scrY;
172                 GetClientSize(&scrX,&scrY);
173                 plotter->SetSize(scrX,scrY);
174                 pGraphicalFunction* actual=plotter->getFunction(idTransferenceFunction);
175                 if(actual!=NULL){
176                         actual->setScreens(scrX,scrY);
177                         actual->setScales();
178                 }
179                 
180         }
181         /*
182                 get number of points of the transference function
183         */
184         int HistogramWidget::getSizeTransferenceFunction()
185         {
186                 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
187                 return tf->getSizePoints();
188
189         }
190         /*
191                 get a point of the transference function
192         */
193         void HistogramWidget::getTransferenceFunctionPoint(int index,int& x,int& y)
194         {
195                 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
196                 if(tf)
197                 {
198                         wxNode* pnode=tf->GetPointAt(index);
199                         pFunctionPoint* point=(pFunctionPoint*)pnode->GetData();
200                         x=point->getRealX();
201                         y=point->getRealY();
202                 }
203         }
204         /*
205                 get a point of the Histogram
206                 given the grey value
207         */
208         int HistogramWidget::getHistogramPoint(int gValue)
209         {
210                 return histogram->getHistogramPoint(gValue);
211         }
212         /*
213                 get number of points of the barColor
214         */
215         int HistogramWidget::getSizeBarColor()
216         {
217                 return  plotter->getColorPointsSize();
218         }
219         /*
220                 get a  color int the bqr color
221         */
222         void HistogramWidget:: getDataBarColorPoint(int index,int&x, int& red,int& green,int& blue)
223         {
224                 double tmp=x;
225                 plotter->getBarColorDataAt(index,tmp,red,green,blue);
226                 x=(int)tmp;
227         }
228         /*
229          Returns the  maximum value ot the histogram that is show to the user 
230         */
231         float HistogramWidget::getMaxShowedPorcentage()
232         {
233                 float  porcentageMaxX=plotter->getMaxShowedPorcentage();
234                 pGraphicalFunction* histogramFunction=plotter->getFunction(idHistogram);
235                 int min=histogramFunction->getMinX();
236                 float x=porcentageMaxX*(histogramFunction->getMaxX()-min);
237                 return min+ x;
238         }
239         /*
240          Returns the  minimum value ot the histogram that is show to the user 
241         */
242         float HistogramWidget::getMinShowedPorcentage()
243         {
244                 float  porcentageMinX=plotter->getMinShowedPorcentage();
245                 pGraphicalFunction* histogramFunction=plotter->getFunction(idHistogram);
246                 int min=histogramFunction->getMinX();
247                 float x=porcentageMinX*(histogramFunction->getMaxX()-min);
248                 return min+ x;
249         }
250         /*
251          Returns the  minimum value ot the histogram that is show to the user 
252         */
253         float HistogramWidget::getActualShowedPorcentage()
254         {
255                 float  porcentageActualX=plotter->getMinShowedPorcentage();
256                 pGraphicalFunction* histogramFunction=plotter->getFunction(idHistogram);
257                 int min=histogramFunction->getMinX();
258                 float x=porcentageActualX*(histogramFunction->getMaxX()-min);
259                 return min+ x;
260         }
261         //---------------------------------------
262         // setting data in transferences function
263         // and in bar color
264         //----------------------------------------
265         /*
266           Adds a point to the transference function
267         */
268         bool  HistogramWidget::addPointToTransferenceFunction(double x, double y)
269         {
270                 bool result=false;
271                 pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
272 printf("EED %p HistogramWidget::addPointToTransferenceFunction tp%p x%f y%f %d\n",this, tf, x ,y, idTransferenceFunction);
273                 if (tf!=NULL) { result=tf->AddPoint(x,y); }
274                 
275                 return result;
276         }
277         /*
278                 add a color point to the histogram
279                 @param x the level of grey to which the color is assigned
280                 @param red the level of red for the color
281                 @param green the level of red for the color
282                 @param blue the level of red for the color
283         */
284         bool  HistogramWidget::addColorPoint(double x,int red,int green, int blue)
285         {
286                 return plotter->addColorPoint(x,red,green,blue);
287         }
288          
289         //------------------------
290         //Erase data
291         //------------------------
292         /*
293          Erase all the points that are in the transference function
294         */
295
296         void HistogramWidget::erasePointsTransferenceFunction(/*bool allPoints*/)
297         {
298                 if(transferenceFunctionHasPoints)
299                 {
300                         // we have to erase the points
301                         pGraphicalFunction* tf=plotter->getFunction(idTransferenceFunction);
302                         if (tf!=NULL){
303                                 int numOfPoints=tf->getSizePoints();
304                                 int i=numOfPoints-1;//-2;
305                                 while(i>=0)
306                                 {
307                                         tf->deletePointAt(i);
308                                         i--;
309                                 } // while
310                         } // if tf
311                 } // if transferenceFunctionHasPoints
312                 
313         //we set for actual the histogram
314                 //plotter->setActual()
315         }
316         /*
317         Erase the  color points in the plotter
318         */
319         void HistogramWidget::eraseColorPoints()
320         {
321                 plotter->eraseColorPoints();
322         }
323         //------------------
324         //Updating plotter
325         //------------------
326         void HistogramWidget::updatePlotter()
327         {
328                 plotter->update();
329         }
330
331         //-------------------
332         // Getter and setters
333         //-------------------
334
335         void HistogramWidget::setTransferenceFunctionHasPoints(bool hasPoints)
336         {
337                 transferenceFunctionHasPoints=hasPoints;
338         }
339
340         void HistogramWidget::setTransferenceFunctionHasColor(bool hasColorPoints)
341         {
342                 transferenceFunctionHasPoints=hasColorPoints;
343         }
344         int HistogramWidget::getHistogramSize()
345         {
346                 return histogramSize;
347         }
348         void HistogramWidget::setType(int type)
349         {
350                 this->type=type;
351         }
352
353