]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialogComboBox.cxx
2809b4e7c5c17c6bd1a99a7fdb8bf7bf3fb0bb98
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / pPlotter / HistogramDialogComboBox.cxx
1 #include "HistogramDialogComboBox.h"
2 #include <vector>
3
4 #include "Edit.xpm"
5
6 #include "creaSystem.h"
7 #include "HistogramDialog.h"
8 //-------------------------
9 //Constructor
10 //-------------------------
11 HistogramDialogComboBox::HistogramDialogComboBox(wxWindow* parent)
12 : wxPanel(parent)
13 {
14         _img = NULL;    
15         _bitmapcombo=NULL;
16         _slidercolor=NULL;
17         _sliderwindowlevel=NULL;        
18         colorBar_Bitmap=NULL;
19         _bitmapsizer=NULL;
20
21         this->SetSizer(getBitmapCombo());
22         _img = NULL;
23         _currentitem = -1;
24         _maxgreyvalue=0;
25 }
26
27 HistogramDialogComboBox::~HistogramDialogComboBox(){    
28 }
29
30 void HistogramDialogComboBox::SetColors(std::vector<double> greyvect, std::vector<double> redvect, std::vector<double> greenvect, std::vector<double> bluevect){
31
32         _greyvect=greyvect;
33         _redvect=redvect;
34         _greenvect=greenvect;
35         _bluevect=bluevect;
36         
37 }
38
39 wxSizer* HistogramDialogComboBox::getBitmapCombo(){
40         //_bitmapsizer = new wxBoxSizer(wxVERTICAL);
41         _bitmapsizer = new wxBoxSizer(wxVERTICAL);
42
43         
44
45         wxBoxSizer* comboeditsizer = new wxBoxSizer(wxHORIZONTAL);
46
47         _bitmapcombo = getBitmapComboElements();
48
49         wxBitmap bitmap1(Edit_xpm);
50         wxBitmapButton* edit = new wxBitmapButton(this, -1, bitmap1,wxDefaultPosition,wxSize(30,30));   
51         Connect(edit->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialogComboBox::OnEditBitmapCombo);                       
52         
53         comboeditsizer->Add(_bitmapcombo,wxSizerFlags().Center().FixedMinSize());
54         comboeditsizer->Add(edit,wxSizerFlags().Center());
55
56
57         _bitmapsizer->Add(comboeditsizer,wxSizerFlags().FixedMinSize().Center());
58         _bitmapsizer->AddSpacer(5);
59         _bitmapsizer->Add(getSlidersWlCo(),wxSizerFlags().Expand().Center());
60
61         return _bitmapsizer;
62         
63 }
64 wxSizer* HistogramDialogComboBox::getSlidersWlCo(){
65         wxBoxSizer* sizersliders = new wxBoxSizer(wxVERTICAL);
66
67         _slidercolor = new wxSlider(this, -1,1,0,1,wxDefaultPosition,wxDefaultSize,wxSL_LABELS);
68         _sliderwindowlevel = new wxSlider(this, -1,1,0,1,wxDefaultPosition,wxDefaultSize,wxSL_LABELS);
69
70         sizersliders->Add(_slidercolor,wxSizerFlags().Expand().Center());
71         sizersliders->Add(_sliderwindowlevel,wxSizerFlags().Expand().Center());
72
73     Connect(_slidercolor->GetId(), wxEVT_SCROLL_THUMBTRACK, (wxObjectEventFunction)&HistogramDialogComboBox::OnColorLevelChanged);
74         Connect(_sliderwindowlevel->GetId(), wxEVT_SCROLL_THUMBTRACK, (wxObjectEventFunction)&HistogramDialogComboBox::OnWindowLevelChanged);
75
76         return sizersliders;
77 }
78
79 double HistogramDialogComboBox::GetWindowLevel(){
80         if(_sliderwindowlevel != NULL){
81                 return _sliderwindowlevel->GetValue();
82         }
83 }
84
85 double HistogramDialogComboBox::GetColorLevel(){
86     if(_slidercolor != NULL){
87                 return _slidercolor->GetValue();
88         }    
89 }
90
91 void HistogramDialogComboBox::OnColorLevelChanged(wxCommandEvent& event){
92         _slidercolor->GetValue();
93
94         wxCommandEvent newevent(wxEVT_SCROLL_THUMBTRACK,this->GetId());
95         ProcessEvent(newevent);
96
97 }
98 void HistogramDialogComboBox::OnWindowLevelChanged(wxCommandEvent& event){
99         _sliderwindowlevel->GetValue();
100
101         wxCommandEvent newevent(wxEVT_SCROLL_THUMBTRACK,this->GetId());
102     ProcessEvent(newevent);
103
104 }
105
106 void HistogramDialogComboBox::setImageData(vtkImageData* img){
107         _maxgreyvalue = img->GetScalarRange()[1];
108         _img = img;
109
110         setSlidersValue();
111
112 }
113
114 void HistogramDialogComboBox::setSlidersValue(){
115         if(_img!=NULL){
116                 if(_slidercolor!=NULL){
117                         _slidercolor->SetRange(_img->GetScalarRange()[0],_img->GetScalarRange()[1]);
118                         _slidercolor->SetValue((_img->GetScalarRange()[0]+_img->GetScalarRange()[1])/2);
119                 }
120                 if(_sliderwindowlevel!=NULL){
121                         _sliderwindowlevel->SetRange(_img->GetScalarRange()[0],_img->GetScalarRange()[1]);
122                         _sliderwindowlevel->SetValue((_img->GetScalarRange()[0]+_img->GetScalarRange()[1])/2);
123                 }
124         }
125 }
126
127 void HistogramDialogComboBox::OnEditBitmapCombo(wxCommandEvent& event){
128         
129         if(_img!=NULL){
130
131                 bool createaddandremovecontrols = true;
132                 HistogramDialog* dialog = new HistogramDialog(this,_T("Color Configuration"),createaddandremovecontrols);
133                 dialog->initializeHistogram(_img);              
134                 dialog->setInfoPanExtraControls(_bitmapsitems);
135
136                 if(dialog->ShowModal()==wxID_OK){
137                         
138                         dialog->UpdateCurrentComboElement();
139                         _bitmapsitems = dialog->getComboBoxItems();
140                         
141
142                         std::string currentpath = crea::System::GetDllAppPath("bbcreaMaracasVisu");     
143                         currentpath.append(FILENAME);
144
145                         std::vector<double> redvect,greenvect,bluevect;
146                         std::vector<double> greyvect;
147
148                         saveCurrentConfiguration(_bitmapsitems, currentpath);
149                         wxBitmapComboBox* tempbitmapcombo = _bitmapcombo;
150                         for(int i = 0; i < _bitmapsitems.size();i++){
151                                 delete _bitmapsitems[i];
152                         }
153                         _bitmapsitems.clear();
154                         _bitmapcombo = getBitmapComboElements();
155                         if(_bitmapsizer->Replace(tempbitmapcombo,_bitmapcombo)){                
156                                 
157                                 tempbitmapcombo->Destroy();
158                         }
159                         this->Layout();
160                 }       
161                 dialog->Destroy();
162         }
163 }
164
165 void HistogramDialogComboBox::saveCurrentConfiguration(std::vector<HistogramDialogComboBoxItem*>& itembitmaps,std::string filename){
166
167         std::ofstream file;     
168         file.open(  (const char*) (filename.c_str()) ); 
169         double gv=-1,red=-1,gr=-1,bl=-1;
170         int in=-1;
171
172         if(file.is_open())
173         {
174                 file << "<ComboBoxData>" << std::endl;
175                 for(int i = 0; i < itembitmaps.size();i++){
176                         HistogramDialogComboBoxItem* item = itembitmaps[i];
177                         std::vector<double> vecttransfer = item->getGreyVectorTransfer();
178                         std::vector<double> value = item->getValueVector();
179
180                         file << " <ComboBoxItem>"<< std::endl;
181                         for(int j = 0; j < vecttransfer.size();j++){
182                                 if(j==0){
183                                         file << " <TransferenceFunction>"<< std::endl;
184                                 }
185                                 file << "               <Transferencepoint>" << std::endl;                              
186                                 file << "                       <greyValue>" << vecttransfer[j] << "</greyValue>" <<std::endl;                          
187                                 file << "                       <intensity>" << value[j] << "</intensity> "<<std::endl;
188                                 file << "               </Transferencepoint>" << std::endl;
189                                 if(j==vecttransfer.size()-1){
190                     file << " </TransferenceFunction>"<< std::endl;
191                                 }
192                         }
193                         std::vector<double> greyv = item->getGreyVector();
194                         std::vector<double> red = item->getRedVector();
195                         std::vector<double> green = item->getGreenVector();
196                         std::vector<double> blue = item->getBlueVector();
197                         for(int j = 0; j < greyv.size();j++)
198                         {                                                       
199                                 if(j==0){
200                                         file << "       <Colors>" << std::endl;
201                                 }
202                                 file << "               <greyValueRGBpoint>" << std::endl;
203                                 file << "                       <RGBgreyValue>" << greyv[j] << "</RGBgreyValue>" <<std::endl;
204                                 file << "                       <red>" << red[j] << "</red>" <<std::endl;
205                                 file << "                       <green>" << green[j] << "</green>" <<std::endl;
206                                 file << "                       <blue>" << blue[j] << "</blue>" <<std::endl;
207                                 file << "               </greyValueRGBpoint>" << std::endl;     
208                                 if(j==greyv.size()-1){
209                                         file << "       </Colors>" << std::endl;
210                                 }
211                         }
212                         file << "       </ComboBoxItem>"<< std::endl;           
213                 }
214                 file << "</ComboBoxData>" << std::endl; 
215         }
216         file.close();
217
218 }
219
220 wxBitmapComboBox* HistogramDialogComboBox::getBitmapComboElements(){
221         std::string currentpath = crea::System::GetDllAppPath("bbcreaMaracasVisu");     
222         currentpath.append(FILENAME);
223
224         std::vector<HistogramDialogComboBoxItem*> bitmapsitems;
225         OnLoadComboBoxData(bitmapsitems, currentpath);  
226         _bitmapsitems = bitmapsitems;
227         wxString* choices;
228         choices = new wxString[bitmapsitems.size()];
229         for(int i = 0; i < bitmapsitems.size();i++){
230                 choices[i] = _T("");
231         }
232         wxBitmapComboBox* bitmapcombo = new wxBitmapComboBox(this, -1, _T(""), wxDefaultPosition, wxDefaultSize, bitmapsitems.size(),choices);
233         bitmapcombo->SetSize(65,30);
234
235         Connect(bitmapcombo->GetId(), wxEVT_COMMAND_COMBOBOX_SELECTED, (wxObjectEventFunction)&HistogramDialogComboBox::OnBitmapComboItemSelected);                     
236
237         for(int i = 0; i < bitmapsitems.size(); i++){
238         bitmapcombo->SetItemBitmap(i, bitmapsitems[i]->GetBitmap());
239         }
240         return  bitmapcombo;
241 }
242 void HistogramDialogComboBox::OnBitmapComboItemSelected(wxCommandEvent& event){
243                 
244         if(_bitmapcombo!=NULL){
245                 _currentitem = event.GetInt();
246                 if(_bitmapsitems.size()>_currentitem){
247                         HistogramDialogComboBoxItem* currentconfig = _bitmapsitems[_currentitem];
248                         _greyvect = currentconfig->getGreyVector();
249                         _redvect = currentconfig->getRedVector();
250                         _greenvect = currentconfig->getGreenVector();
251                         _bluevect= currentconfig->getBlueVector();
252                         
253                         _greyvecttransfer = currentconfig->getGreyVectorTransfer();
254                         _value  = currentconfig->getValueVector();
255                         wxCommandEvent newevent(wxEVT_COMMAND_COMBOBOX_SELECTED,this->GetId());
256             ProcessEvent(newevent);
257                 }       
258         }
259 }
260
261 void HistogramDialogComboBox::OnLoadComboBoxData(std::vector<HistogramDialogComboBoxItem*>& itembitmaps, std::string filename)
262 {       
263         std::vector<double> redvect, greenvect, bluevect;
264         std::vector<double> greyvect, greyvecttransfunct, value;
265
266         redvect.clear(); 
267         greenvect.clear(); 
268         bluevect.clear();
269         greyvect.clear(); 
270         greyvecttransfunct.clear(); 
271         value.clear();
272
273         std::ifstream file;     
274         file.open(  (const char*) (filename.c_str()) ); 
275         double gv=-1,gvtransfer=-1,intensity=-1,red=-1,gr=-1,bl=-1;
276         int in=-1;
277
278         //std::cout<<filename<<std::endl;
279         itembitmaps.clear();
280         if(file.is_open())
281         {       
282                 bool add = false;
283                 HistogramDialogComboBoxItem* item=NULL;
284                 while(!file.eof())
285                 {
286                         std::string line;
287                         std::getline(file,line);
288                         //std::cout<<line<<std::endl;
289             if( (int)(line.find("<ComboBoxItem>")!=-1))
290                         {
291                                 item = new HistogramDialogComboBoxItem();
292                         }else if((int)(line.find("<greyValue>"))!=-1){
293                 int pos1=line.find(">");
294                                 int pos2=line.find("<",pos1+1);
295                                 std::string x=line.substr(pos1+1,pos2-pos1-1);
296                                 gvtransfer=atof(x.c_str());                             
297                                 greyvecttransfunct.push_back(gvtransfer);
298                         }else if((int)(line.find("<intensity>"))!=-1){
299                 int pos1=line.find(">");
300                                 int pos2=line.find("<",pos1+1);
301                                 std::string x=line.substr(pos1+1,pos2-pos1-1);
302                                 intensity=atof(x.c_str());                                      
303                                 value.push_back(intensity);
304                         }
305                         else if( (int)(line.find("<RGBgreyValue>"))!=-1)
306                         {
307                                 int pos1=line.find(">");
308                                 int pos2=line.find("<",pos1+1);
309                                 std::string x=line.substr(pos1+1,pos2-pos1-1);
310                                 gv=atof(x.c_str());                             
311                                 greyvect.push_back(gv);                         
312                         }
313                         else if( (int)(line.find("<red>"))!=-1)
314                         {
315                                 int pos1=line.find(">");
316                                 int pos2=line.find("<",pos1+1);
317                                 std::string x=line.substr(pos1+1,pos2-pos1-1);
318                                 red=atof(x.c_str());
319                                 redvect.push_back(red);                         
320                         }
321                         else if( (int)(line.find("<green>"))!=-1)
322                         {
323                                 int pos1=line.find(">");
324                                 int pos2=line.find("<",pos1+1);
325                                 std::string x=line.substr(pos1+1,pos2-pos1-1);
326                                 gr=atof(x.c_str());
327                                 greenvect.push_back(gr);
328                         }
329                         else if( (int)(line.find("<blue>"))!=-1 )
330                         {
331                                 int pos1=line.find(">");
332                                 int pos2=line.find("<",pos1+1);
333                                 std::string x=line.substr(pos1+1,pos2-pos1-1);
334                                 bl=atof(x.c_str());     
335                                 bluevect.push_back(bl);
336                                 
337                         }else if( (int)(line.find("</ComboBoxItem>"))!=-1 ){
338
339                                 item->SetColors(greyvect,redvect,greenvect,bluevect);
340                                 item->SetTransferFunction(greyvecttransfunct,value);
341                                 /*for(int i = 0; i < greyvecttransfunct.size();i++){
342                                         std::cout<<"HistogramDialogComboBox::OnLoadComboBoxData("<<greyvecttransfunct[i]<<std::endl;
343                                         std::cout<<value[i]<<std::endl;
344                                 }
345                                 for(int i = 0; i < greyvect.size();i++){
346                                         std::cout<<"HistogramDialogComboBox::OnLoadComboBoxData("<<greyvect[i]<<std::endl;
347                                         std::cout<<redvect[i]<<std::endl;
348                                         std::cout<<greenvect[i]<<std::endl;
349                                         std::cout<<bluevect[i]<<std::endl;
350                                 }*/
351                                 
352                                 itembitmaps.push_back(item);
353
354                                 greyvecttransfunct.clear();
355                                 value.clear();
356                                 greyvect.clear();
357                                 redvect.clear();
358                                 greenvect.clear();
359                                 bluevect.clear();
360                         }
361                         line.clear();
362                 }
363                 file.close();                   
364                 //std::cout<<itembitmaps.size()<<std::endl;
365      }          
366 }
367
368 /**
369 **      Returns two vectors, the grey level of the point and its value, the value is between [0,1]
370 **/
371 void HistogramDialogComboBox::GetValuesPointsFunction(std::vector<double>& greylevel,std::vector<double>& value)
372 {       
373         for(int i = 0; i < _greyvecttransfer.size();i++){               
374                 greylevel.push_back(_greyvecttransfer[i]*_maxgreyvalue);
375                 value.push_back(_value[i]);     
376         }
377 }
378
379 /**
380 **      Returns two vectors, the grey level of the point and its value, the red, green
381 **      and blue value is between [0,1]
382 **/
383 void HistogramDialogComboBox::GetValuesColorPointsFunction(std::vector<double>& greylevel,
384                                                                 std::vector<double>& red,
385                                                                 std::vector<double>& green,
386                                                                 std::vector<double>& blue)
387 {       
388         for(int i = 0; i < _greyvect.size();i++){               
389                 greylevel.push_back(_greyvect[i]*_maxgreyvalue);
390                 red.push_back(_redvect[i]);
391                 green.push_back(_greenvect[i]);
392                 blue.push_back(_bluevect[i]);           
393         }
394 }