00001 #include "HistogramDialogComboBox.h"
00002 #include <vector>
00003
00004 #include "Edit.xpm"
00005
00006 #include "creaSystem.h"
00007 #include "HistogramDialog.h"
00008
00009
00010
00011 HistogramDialogComboBox::HistogramDialogComboBox(wxWindow* parent)
00012 : wxPanel(parent)
00013 {
00014 _img = NULL;
00015 _bitmapcombo = NULL;
00016 _slidercolor = NULL;
00017 _sliderwindowlevel = NULL;
00018 colorBar_Bitmap = NULL;
00019 _bitmapsizer = NULL;
00020
00021 this->SetSizer(getBitmapCombo());
00022 _img = NULL;
00023 _currentitem = -1;
00024 _maxgreyvalue = 0;
00025 printf("EED HistogramDialogComboBox\n");
00026 }
00027
00028 HistogramDialogComboBox::~HistogramDialogComboBox()
00029 {
00030 }
00031
00032 void HistogramDialogComboBox::SetColors(std::vector<double> greyvect, std::vector<double> redvect, std::vector<double> greenvect, std::vector<double> bluevect)
00033 {
00034 _greyvect = greyvect;
00035 _redvect = redvect;
00036 _greenvect = greenvect;
00037 _bluevect = bluevect;
00038 }
00039
00040 wxSizer* HistogramDialogComboBox::getBitmapCombo()
00041 {
00042
00043 _bitmapsizer = new wxBoxSizer(wxVERTICAL);
00044
00045 wxBoxSizer* comboeditsizer = new wxBoxSizer(wxHORIZONTAL);
00046 _bitmapcombo = getBitmapComboElements();
00047
00048 wxBitmap bitmap1(Edit_xpm);
00049 wxBitmapButton* edit = new wxBitmapButton(this, -1, bitmap1,wxDefaultPosition,wxSize(30,30));
00050 Connect(edit->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialogComboBox::OnEditBitmapCombo);
00051
00052 comboeditsizer->Add(_bitmapcombo,wxSizerFlags().Center().FixedMinSize());
00053 comboeditsizer->Add(edit,wxSizerFlags().Center());
00054
00055
00056 _bitmapsizer->Add(comboeditsizer,wxSizerFlags().FixedMinSize().Center());
00057 _bitmapsizer->AddSpacer(5);
00058 _bitmapsizer->Add(getSlidersWlCo(),wxSizerFlags().Expand().Center());
00059
00060 return _bitmapsizer;
00061 }
00062
00063 wxSizer* HistogramDialogComboBox::getSlidersWlCo(){
00064 wxBoxSizer* sizersliders = new wxBoxSizer(wxVERTICAL);
00065
00066 _slidercolor = new wxSlider(this, -1,1,0,1,wxDefaultPosition,wxDefaultSize,wxSL_LABELS);
00067 _sliderwindowlevel = new wxSlider(this, -1,1,0,1,wxDefaultPosition,wxDefaultSize,wxSL_LABELS);
00068
00069 sizersliders->Add(_slidercolor,wxSizerFlags().Expand().Center());
00070 sizersliders->Add(_sliderwindowlevel,wxSizerFlags().Expand().Center());
00071
00072 Connect(_slidercolor->GetId(), wxEVT_SCROLL_THUMBTRACK, (wxObjectEventFunction)&HistogramDialogComboBox::OnColorLevelChanged);
00073 Connect(_sliderwindowlevel->GetId(), wxEVT_SCROLL_THUMBTRACK, (wxObjectEventFunction)&HistogramDialogComboBox::OnWindowLevelChanged);
00074
00075 return sizersliders;
00076 }
00077
00078 double HistogramDialogComboBox::GetWindowLevel()
00079 {
00080 if(_sliderwindowlevel != NULL)
00081 {
00082 return _sliderwindowlevel->GetValue();
00083 }
00084 }
00085
00086 double HistogramDialogComboBox::GetColorLevel()
00087 {
00088 if(_slidercolor != NULL)
00089 {
00090 return _slidercolor->GetValue();
00091 }
00092 }
00093
00094 void HistogramDialogComboBox::OnColorLevelChanged(wxCommandEvent& event)
00095 {
00096 _slidercolor->GetValue();
00097 wxCommandEvent newevent(wxEVT_SCROLL_THUMBTRACK,this->GetId());
00098 ProcessEvent(newevent);
00099 }
00100
00101 void HistogramDialogComboBox::OnWindowLevelChanged(wxCommandEvent& event)
00102 {
00103 _sliderwindowlevel->GetValue();
00104 wxCommandEvent newevent(wxEVT_SCROLL_THUMBTRACK,this->GetId());
00105 ProcessEvent(newevent);
00106 }
00107
00108 void HistogramDialogComboBox::setImageData(vtkImageData* img)
00109 {
00110 _maxgreyvalue = img->GetScalarRange()[1];
00111 _img = img;
00112 setSlidersValue();
00113 }
00114
00115 void HistogramDialogComboBox::setSlidersValue()
00116 {
00117 if(_img!=NULL){
00118 if(_slidercolor!=NULL){
00119 _slidercolor->SetRange(_img->GetScalarRange()[0],_img->GetScalarRange()[1]);
00120 _slidercolor->SetValue((_img->GetScalarRange()[0]+_img->GetScalarRange()[1])/2);
00121 }
00122 if(_sliderwindowlevel!=NULL){
00123 _sliderwindowlevel->SetRange(_img->GetScalarRange()[0],_img->GetScalarRange()[1]);
00124 _sliderwindowlevel->SetValue((_img->GetScalarRange()[0]+_img->GetScalarRange()[1])/2);
00125 }
00126 }
00127 }
00128
00129 void HistogramDialogComboBox::OnEditBitmapCombo(wxCommandEvent& event)
00130 {
00131 if(_img!=NULL)
00132 {
00133 bool createaddandremovecontrols = true;
00134 HistogramDialog* dialog = new HistogramDialog(this,_T("Color Configuration"),createaddandremovecontrols);
00135 dialog->initializeHistogram(_img);
00136 dialog->setInfoPanExtraControls(_bitmapsitems);
00137
00138 if(dialog->ShowModal()==wxID_OK)
00139 {
00140
00141 dialog->UpdateCurrentComboElement();
00142 _bitmapsitems = dialog->getComboBoxItems();
00143
00144
00145 std::string currentpath = crea::System::GetDllAppPath("bbcreaMaracasVisu");
00146 currentpath.append(FILENAME);
00147
00148 std::vector<double> redvect,greenvect,bluevect;
00149 std::vector<double> greyvect;
00150
00151 saveCurrentConfiguration(_bitmapsitems, currentpath);
00152 wxBitmapComboBox* tempbitmapcombo = _bitmapcombo;
00153 for(int i = 0; i < _bitmapsitems.size();i++){
00154 delete _bitmapsitems[i];
00155 }
00156 _bitmapsitems.clear();
00157 _bitmapcombo = getBitmapComboElements();
00158 if(_bitmapsizer->Replace(tempbitmapcombo,_bitmapcombo)){
00159
00160 tempbitmapcombo->Destroy();
00161 }
00162 this->Layout();
00163 }
00164 dialog->Destroy();
00165 }
00166 }
00167
00168 void HistogramDialogComboBox::saveCurrentConfiguration(std::vector<HistogramDialogComboBoxItem*>& itembitmaps,std::string filename)
00169 {
00170 std::ofstream file;
00171 file.open( (const char*) (filename.c_str()) );
00172 double gv=-1,red=-1,gr=-1,bl=-1;
00173 int in=-1;
00174
00175 if(file.is_open())
00176 {
00177 file << "<ComboBoxData>" << std::endl;
00178 for(int i = 0; i < itembitmaps.size();i++)
00179 {
00180 HistogramDialogComboBoxItem* item = itembitmaps[i];
00181 std::vector<double> vecttransfer = item->getGreyVectorTransfer();
00182 std::vector<double> value = item->getValueVector();
00183
00184 file << " <ComboBoxItem>"<< std::endl;
00185 for(int j = 0; j < vecttransfer.size();j++)
00186 {
00187 if(j==0){
00188 file << " <TransferenceFunction>"<< std::endl;
00189 }
00190 file << " <Transferencepoint>" << std::endl;
00191 file << " <greyValue>" << vecttransfer[j] << "</greyValue>" <<std::endl;
00192 file << " <intensity>" << value[j] << "</intensity> "<<std::endl;
00193 file << " </Transferencepoint>" << std::endl;
00194 if(j==vecttransfer.size()-1){
00195 file << " </TransferenceFunction>"<< std::endl;
00196 }
00197 }
00198 std::vector<double> greyv = item->getGreyVector();
00199 std::vector<double> red = item->getRedVector();
00200 std::vector<double> green = item->getGreenVector();
00201 std::vector<double> blue = item->getBlueVector();
00202 for(int j = 0; j < greyv.size();j++)
00203 {
00204 if(j==0){
00205 file << " <Colors>" << std::endl;
00206 }
00207 file << " <greyValueRGBpoint>" << std::endl;
00208 file << " <RGBgreyValue>" << greyv[j] << "</RGBgreyValue>" <<std::endl;
00209 file << " <red>" << red[j] << "</red>" <<std::endl;
00210 file << " <green>" << green[j] << "</green>" <<std::endl;
00211 file << " <blue>" << blue[j] << "</blue>" <<std::endl;
00212 file << " </greyValueRGBpoint>" << std::endl;
00213 if(j==greyv.size()-1){
00214 file << " </Colors>" << std::endl;
00215 }
00216 }
00217 file << " </ComboBoxItem>"<< std::endl;
00218 }
00219 file << "</ComboBoxData>" << std::endl;
00220 }
00221 file.close();
00222 }
00223
00224 wxBitmapComboBox* HistogramDialogComboBox::getBitmapComboElements()
00225 {
00226 std::string currentpath = crea::System::GetDllAppPath("bbcreaMaracasVisu");
00227 currentpath.append(FILENAME);
00228
00229 std::vector<HistogramDialogComboBoxItem*> bitmapsitems;
00230 OnLoadComboBoxData(bitmapsitems, currentpath);
00231 _bitmapsitems = bitmapsitems;
00232 wxString* choices;
00233 choices = new wxString[bitmapsitems.size()];
00234 for(int i = 0; i < bitmapsitems.size();i++)
00235 {
00236 choices[i] = _T("");
00237 }
00238 wxBitmapComboBox* bitmapcombo = new wxBitmapComboBox(this, -1, _T(""), wxDefaultPosition, wxDefaultSize, bitmapsitems.size(),choices);
00239 bitmapcombo->SetSize(65,30);
00240
00241 Connect(bitmapcombo->GetId(), wxEVT_COMMAND_COMBOBOX_SELECTED, (wxObjectEventFunction)&HistogramDialogComboBox::OnBitmapComboItemSelected);
00242
00243 for(int i = 0; i < bitmapsitems.size(); i++)
00244 {
00245 bitmapcombo->SetItemBitmap(i, bitmapsitems[i]->GetBitmap());
00246 }
00247 return bitmapcombo;
00248 }
00249
00250 void HistogramDialogComboBox::OnBitmapComboItemSelected(wxCommandEvent& event)
00251 {
00252 if(_bitmapcombo!=NULL)
00253 {
00254 _currentitem = event.GetInt();
00255 if(_bitmapsitems.size()>_currentitem)
00256 {
00257 HistogramDialogComboBoxItem* currentconfig = _bitmapsitems[_currentitem];
00258 _greyvect = currentconfig->getGreyVector();
00259 _redvect = currentconfig->getRedVector();
00260 _greenvect = currentconfig->getGreenVector();
00261 _bluevect= currentconfig->getBlueVector();
00262 _greyvecttransfer = currentconfig->getGreyVectorTransfer();
00263 _value = currentconfig->getValueVector();
00264 wxCommandEvent newevent(wxEVT_COMMAND_COMBOBOX_SELECTED,this->GetId());
00265 ProcessEvent(newevent);
00266 }
00267 }
00268 }
00269
00270 void HistogramDialogComboBox::OnLoadComboBoxData(std::vector<HistogramDialogComboBoxItem*>& itembitmaps, std::string filename)
00271 {
00272 std::vector<double> redvect, greenvect, bluevect;
00273 std::vector<double> greyvect, greyvecttransfunct, value;
00274
00275 redvect.clear();
00276 greenvect.clear();
00277 bluevect.clear();
00278 greyvect.clear();
00279 greyvecttransfunct.clear();
00280 value.clear();
00281
00282 std::ifstream file;
00283 file.open( (const char*) (filename.c_str()) );
00284 double gv=-1,gvtransfer=-1,intensity=-1,red=-1,gr=-1,bl=-1;
00285 int in=-1;
00286
00287
00288 itembitmaps.clear();
00289 if(file.is_open())
00290 {
00291 bool add = false;
00292 HistogramDialogComboBoxItem* item=NULL;
00293 while(!file.eof())
00294 {
00295 std::string line;
00296 std::getline(file,line);
00297
00298 if( (int)(line.find("<ComboBoxItem>")!=-1))
00299 {
00300 item = new HistogramDialogComboBoxItem();
00301 }else if((int)(line.find("<greyValue>"))!=-1){
00302 int pos1=line.find(">");
00303 int pos2=line.find("<",pos1+1);
00304 std::string x=line.substr(pos1+1,pos2-pos1-1);
00305 gvtransfer=atof(x.c_str());
00306 greyvecttransfunct.push_back(gvtransfer);
00307 }else if((int)(line.find("<intensity>"))!=-1){
00308 int pos1=line.find(">");
00309 int pos2=line.find("<",pos1+1);
00310 std::string x=line.substr(pos1+1,pos2-pos1-1);
00311 intensity=atof(x.c_str());
00312 value.push_back(intensity);
00313 }
00314 else if( (int)(line.find("<RGBgreyValue>"))!=-1)
00315 {
00316 int pos1=line.find(">");
00317 int pos2=line.find("<",pos1+1);
00318 std::string x=line.substr(pos1+1,pos2-pos1-1);
00319 gv=atof(x.c_str());
00320 greyvect.push_back(gv);
00321 }
00322 else if( (int)(line.find("<red>"))!=-1)
00323 {
00324 int pos1=line.find(">");
00325 int pos2=line.find("<",pos1+1);
00326 std::string x=line.substr(pos1+1,pos2-pos1-1);
00327 red=atof(x.c_str());
00328 redvect.push_back(red);
00329 }
00330 else if( (int)(line.find("<green>"))!=-1)
00331 {
00332 int pos1=line.find(">");
00333 int pos2=line.find("<",pos1+1);
00334 std::string x=line.substr(pos1+1,pos2-pos1-1);
00335 gr=atof(x.c_str());
00336 greenvect.push_back(gr);
00337 }
00338 else if( (int)(line.find("<blue>"))!=-1 )
00339 {
00340 int pos1=line.find(">");
00341 int pos2=line.find("<",pos1+1);
00342 std::string x=line.substr(pos1+1,pos2-pos1-1);
00343 bl=atof(x.c_str());
00344 bluevect.push_back(bl);
00345
00346 }else if( (int)(line.find("</ComboBoxItem>"))!=-1 ){
00347
00348 item->SetColors(greyvect,redvect,greenvect,bluevect);
00349 item->SetTransferFunction(greyvecttransfunct,value);
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361 itembitmaps.push_back(item);
00362
00363 greyvecttransfunct.clear();
00364 value.clear();
00365 greyvect.clear();
00366 redvect.clear();
00367 greenvect.clear();
00368 bluevect.clear();
00369 }
00370 line.clear();
00371 }
00372 file.close();
00373
00374 }
00375 }
00376
00380 void HistogramDialogComboBox::GetValuesPointsFunction(std::vector<double>& greylevel,std::vector<double>& value)
00381 {
00382 for(int i = 0; i < _greyvecttransfer.size();i++){
00383 greylevel.push_back(_greyvecttransfer[i]*_maxgreyvalue);
00384 value.push_back(_value[i]);
00385 }
00386 }
00387
00392 void HistogramDialogComboBox::GetValuesColorPointsFunction(std::vector<double>& greylevel,
00393 std::vector<double>& red,
00394 std::vector<double>& green,
00395 std::vector<double>& blue)
00396 {
00397 for(int i = 0; i < _greyvect.size();i++){
00398 greylevel.push_back(_greyvect[i]*_maxgreyvalue);
00399 red.push_back(_redvect[i]);
00400 green.push_back(_greenvect[i]);
00401 blue.push_back(_bluevect[i]);
00402 }
00403 }