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