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