X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FmaracasVisuLib%2Fsrc%2Finterface%2FwxWindows%2Fwidgets%2FpPlotter%2FHistogramDialog.cxx;h=1a2c14093f0a03835514879350d6e7ee66f5a2af;hb=65c158dc171f8d3114ee3544b2a94a1f41880df0;hp=681263e93b8fb3b60537cc0df47260909ea558c2;hpb=885faee171b5cdcbcbbcb6cc83e6d196544e005c;p=creaMaracasVisu.git diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.cxx index 681263e..1a2c140 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.cxx +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/pPlotter/HistogramDialog.cxx @@ -1,6 +1,16 @@ #include "HistogramDialog.h" #include +#include "OpenImage.xpm" +#include "Save.xpm" +#include "Ok.xpm" +#include "Cancel.xpm" +#include "Delete.xpm" + +#include "creaSystem.h" + + + // IMPLEMENT_CLASS(HistogramDialog, wxDialog) @@ -14,41 +24,60 @@ enum { //------------------------- //Constructor //------------------------- -HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,vtkImageData* imageData,int type) +HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,vtkImageData* imageData,bool extracontrols) :wxDialog(parent,-1,title,wxDefaultPosition,wxDefaultSize,wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE ,_T("dialogBox")) { - _ctfun=NULL; + initializeHistogramDialog(extracontrols); + initializeHistogram(imageData); + +} + +HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,bool extracontrols) +:wxDialog(parent,-1,title,wxDefaultPosition,wxDefaultSize,wxRESIZE_BORDER|wxDEFAULT_DIALOG_STYLE ,_T("dialogBox")){ + + initializeHistogramDialog(extracontrols); +} +HistogramDialog::~HistogramDialog(){ + +} + +void HistogramDialog::initializeHistogramDialog(bool extracontrols){ + _currentcolorselectedbitmap = -1; + _ctfun=NULL; _tfun=NULL; + _panextracontrols=NULL; + _maxgreyvalue = 1; SetBackgroundColour(wxColour(255,255,255)); /* Pointers */ - wxvtkmpr3Dview=NULL; - wxvtkclipping3Dview=NULL; + //wxvtkmpr3Dview=NULL; + //wxvtkclipping3Dview=NULL; /* Histogram */ - histogramW=new HistogramWidget(this, -1, wxPoint(0,0), wxSize(400,400),wxNO_BORDER ,imageData,type); + histogramW=new HistogramWidget(this, -1); - refreshed=false; - /* Buttons */ - okBtn = new wxButton(this,wxID_OK ,_T("OK")); - cancelBtn = new wxButton(this,wxID_CANCEL,_T("Cancel")); + wxBitmap bitmap0(Ok_xpm); + okBtn = new wxBitmapButton(this, wxID_OK, bitmap0,wxDefaultPosition,wxDefaultSize); + + wxBitmap bitmap1(Cancel_xpm); + cancelBtn = new wxBitmapButton(this, wxID_CANCEL, bitmap1,wxDefaultPosition,wxDefaultSize); - saveDataBtn = new wxButton(this,ID_SAVE,_T("Save")); - loadDataBtn = new wxButton(this,ID_LOAD,_T("Load")); - refreshBtn = new wxButton(this,ID_REFRESH,_T("Refresh")); + //saveDataBtn = new wxButton(this,ID_SAVE,_T("Save")); + //loadDataBtn = new wxButton(this,ID_LOAD,_T("Load")); + //refreshBtn = new wxButton(this,ID_REFRESH,_T("Refresh")); - Connect(saveDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnSaveData ); - Connect(loadDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnLoadData ); - Connect(refreshBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnRefreshBtn ); + //Connect(saveDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnSaveData ); + //Connect(loadDataBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnLoadData ); + //Connect(refreshBtn->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &HistogramDialog::OnRefreshBtn ); //------------------- //GUI @@ -57,20 +86,22 @@ HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,vtkImageData* i //Upper Box wxBoxSizer * upper_box = new wxBoxSizer( wxHORIZONTAL ); //Including components for plotter control - upper_box->Add( histogramW, 4, wxGROW); + upper_box->Add( histogramW, 4, wxGROW); + upper_box->Add( getControls(extracontrols),wxSizerFlags().Center() ); //bottom Sizer wxBoxSizer *bottomBox = new wxBoxSizer( wxHORIZONTAL ); bottomBox->Add( okBtn, wxSizerFlags().Center()); bottomBox->AddSpacer(40); - bottomBox->Add( saveDataBtn,wxSizerFlags().Center() ); - bottomBox->AddSpacer(40); - bottomBox->Add( loadDataBtn,wxSizerFlags().Center() ); - bottomBox->AddSpacer(40); - bottomBox->Add( refreshBtn,wxSizerFlags().Center() ); - bottomBox->AddSpacer(40); + //bottomBox->Add( saveDataBtn,wxSizerFlags().Center() ); + //bottomBox->AddSpacer(40); + //bottomBox->Add( loadDataBtn,wxSizerFlags().Center() ); + //bottomBox->AddSpacer(40); + //bottomBox->Add( refreshBtn,wxSizerFlags().Center() ); + //bottomBox->AddSpacer(40); bottomBox->Add( cancelBtn,wxSizerFlags().Center() ); + //Sizer wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); sizer->Add(upper_box,1,wxEXPAND); @@ -79,6 +110,223 @@ HistogramDialog::HistogramDialog(wxWindow *parent,wxString title,vtkImageData* i SetSizer( sizer ); SetBestSize(wxSize(600,600)); } +wxPanel* HistogramDialog::getPanExtraControls(){ + wxBoxSizer* sizer0 = new wxBoxSizer(wxVERTICAL); + _panextracontrols = new wxPanel(this); + + _panextracontrols->SetSizer(sizer0); + _panextracontrols->SetAutoLayout(true); + + return _panextracontrols; +} +/** +** Set to true in the constructor +**/ +void HistogramDialog::setInfoPanExtraControls(std::vector comboitems){ + _comboitems = comboitems; + if(_panextracontrols!=NULL){ + _panextracontrols->Show(false); + for(int i=0; i < comboitems.size();i++){ + + wxBitmap bitmap = comboitems[i]->GetBitmap(); + + + _panextracontrols->GetSizer()->Add(getBitmapButtonDelete(bitmap),wxSizerFlags().Center()); + _panextracontrols->GetSizer()->AddSpacer(5); + + } + + wxButton* button = new wxButton(_panextracontrols,wxID_ANY); + button->SetToolTip(wxString("Add the current color to the list of predefined",wxConvUTF8)); + button->SetLabel(wxString(_T("Add"))); + Connect(button->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialog::OnEditColorsCombo); + _panextracontrols->GetSizer()->Add(button); + _panextracontrols->Layout(); + _panextracontrols->Refresh(); + _panextracontrols->Show(true); + this->Layout(); + this->Refresh(); + + } +} +wxSizer* HistogramDialog::getBitmapButtonDelete(wxBitmap bitmap){ + //wxCheckBox* checkbox = new wxCheckBox(_panextracontrols,wxID_ANY,_T("")); + wxBitmap bitmap0(Delete_xpm); + wxBitmapButton* deletebutton = new wxBitmapButton(_panextracontrols,wxID_ANY,bitmap0,wxDefaultPosition,wxSize(20,20)); + deletebutton->SetToolTip(wxString("Delete the color from the list",wxConvUTF8)); + Connect(deletebutton->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialog::OnDeleteColor); + _deletebuttonsvector.push_back(deletebutton); + + //wxBitmap bitmap0(OpenImage_xpm); + wxBitmapButton* button = new wxBitmapButton(_panextracontrols,wxID_ANY,bitmap,wxDefaultPosition,wxSize(30,30)); + button->SetToolTip(wxString("Load the current color configuration.",wxConvUTF8)); + bitmapbuttonsvect.push_back(button); + Connect(button->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialog::OnEditColorsCombo); + /*char c[10]; + wxString s; + s.Printf(_T("%d"),i);*/ + + //button->SetBitmapLabel(comboitems[i]->GetBitmap()); + // wxStaticBitmap* button = new wxStaticBitmap(_panextracontrols,i,comboitems[i]->GetBitmap(),wxDefaultPosition,wxSize(30,30)); + wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(button,wxSizerFlags().Center()); + sizer->AddSpacer(5); + sizer->Add(deletebutton,wxSizerFlags().Center()); + return sizer; +} +void HistogramDialog::OnDeleteColor(wxCommandEvent& event){ + for(int i = 0; i < _deletebuttonsvector.size();i++){ + if(event.GetId()==_deletebuttonsvector[i]->GetId()){ + _currentcolorselectedbitmap = -1; + //this->eraseColorPoints(); + //this->erasePointsTransferenceFunction(); + HistogramDialogComboBoxItem* temp; + temp = _comboitems[i]; + _deletebuttonsvector[i]->Hide(); + bitmapbuttonsvect[i]->Hide(); + delete temp; + //Remove buttons + _panextracontrols->GetSizer()->Remove(i*2); + //Remove Space + _panextracontrols->GetSizer()->Remove(i*2); + for(int k = i; k < _comboitems.size()-1;k++){ + _comboitems[k] = _comboitems[k+1]; + _deletebuttonsvector[k] = _deletebuttonsvector[k+1]; + bitmapbuttonsvect[k] = bitmapbuttonsvect[k+1]; + } + _comboitems.pop_back(); + _deletebuttonsvector.pop_back(); + bitmapbuttonsvect.pop_back(); + } + } + _panextracontrols->Layout(); +} +void HistogramDialog::OnEditColorsCombo(wxCommandEvent& event){ + bool loadconfig = false; + UpdateCurrentComboElement(); + for(int i = 0; i < bitmapbuttonsvect.size();i++){ + if(event.GetId()==bitmapbuttonsvect[i]->GetId()){ + if(i<_comboitems.size()){ + _currentcolorselectedbitmap = i; + loadconfig = true; + HistogramDialogComboBoxItem* currentconfig = _comboitems[i]; + std::vector greyvect = currentconfig->getGreyVector(); + std::vector _redvect = currentconfig->getRedVector(); + std::vector _greenvect = currentconfig->getGreenVector(); + std::vector _bluevect= currentconfig->getBlueVector(); + this->eraseColorPoints(); + this->erasePointsTransferenceFunction(); + for(int i = 0; i < currentconfig->getGreyVector().size();i++){ + double greyv = currentconfig->getGreyVector()[i]; + double red = currentconfig->getRedVector()[i]; + double green = currentconfig->getGreenVector()[i]; + double blue = currentconfig->getBlueVector()[i]; + + this->addColorPoint(greyv*_maxgreyvalue, red*255.0, green*255.0, blue*255.0); + } + for(int i = 0; i < currentconfig->getGreyVectorTransfer().size();i++){ + double greyv = currentconfig->getGreyVectorTransfer()[i]; + double value = currentconfig->getValueVector()[i]; + std::cout<<"void HistogramDialog::OnEditColorsCombo(wxCommandEvent& event){"<addPointToTransferenceFunction(greyv*_maxgreyvalue, value*100); + } + } + } + } + if(!loadconfig){ + AddNewBitmapButton(); + } + + _panextracontrols->Layout(); + this->Layout(); + this->Refresh(); +} +void HistogramDialog::UpdateCurrentComboElement(){ + if(_currentcolorselectedbitmap >= 0 && _currentcolorselectedbitmap < _comboitems.size()){ + setCurrentColorConfigurationIntoButton(); + } +} +void HistogramDialog::AddNewBitmapButton(){ + this->eraseColorPoints(); + this->erasePointsTransferenceFunction(); + HistogramDialogComboBoxItem* boxitem = new HistogramDialogComboBoxItem(); + wxBitmap bitmap = boxitem->GetBitmap(); + wxSizer* sizer = getBitmapButtonDelete(bitmap); + _panextracontrols->GetSizer()->Insert(_comboitems.size()*2,sizer,wxSizerFlags().Center()); + _panextracontrols->GetSizer()->InsertSpacer(_comboitems.size()*2+1,5); + _comboitems.push_back(boxitem); + _currentcolorselectedbitmap = _comboitems.size()-1; +} +void HistogramDialog::setCurrentColorConfigurationIntoButton(){ + + std::vector greylevel; + std::vector red; + std::vector green; + std::vector blue; + std::vector red0; + std::vector green0; + std::vector blue0; + GetValuesColorPointsFunction(greylevel,red,green,blue); + + for(int i = 0;i< greylevel.size();i++){ + greylevel[i] = greylevel[i]/_maxgreyvalue; + /*std::cout<<"HistogramDialog::setCurrentColorConfigurationIntoButton(){red"< greylevel1; + std::vector value; + this->GetValuesPointsFunction(greylevel1,value); + + for(int i = 0;i< greylevel1.size();i++){ + greylevel1[i] = greylevel1[i]/_maxgreyvalue; + value[i] = value[i]; + std::cout<<"void HistogramDialog::setCurrentColorConfigurationIntoButton(){"<= 0 && _currentcolorselectedbitmap < _comboitems.size()){ + _comboitems[_currentcolorselectedbitmap]->SetColors(greylevel,red0,green0,blue0); + _comboitems[_currentcolorselectedbitmap]->SetTransferFunction(greylevel1,value); + bitmapbuttonsvect[_currentcolorselectedbitmap]->SetBitmapLabel(_comboitems[_currentcolorselectedbitmap]->GetBitmap()); + } +} + +wxSizer* HistogramDialog::getControls(bool extracontrols){ + + wxSizer* sizer = new wxBoxSizer(wxVERTICAL); + + wxBitmap bitmap0(OpenImage_xpm); + wxBitmapButton* opendata = new wxBitmapButton(this, -1, bitmap0,wxDefaultPosition,wxSize(30,30)); + Connect(opendata->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialog::OnLoadData); + sizer->Add(opendata,wxSizerFlags().Center()); + sizer->AddSpacer(5); + + + + wxBitmap bitmap1(Save_xpm); + wxBitmapButton* savedata = new wxBitmapButton(this, -1, bitmap1,wxDefaultPosition,wxSize(30,30)); + Connect(savedata->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction)&HistogramDialog::OnSaveData); + sizer->Add(savedata,wxSizerFlags().Center()); + sizer->AddSpacer(5); + + if(extracontrols){ + sizer->Add(getPanExtraControls(),wxSizerFlags().Center()); + } + //sizer->Add(getBitmapCombo(),wxSizerFlags().Center()); + + + + return sizer; + + +} //----------------------- //Handling events @@ -328,16 +576,16 @@ void HistogramDialog::OnRefreshBtn(wxCommandEvent &event) NOTE I NEED THE UPDATE */ //if it was call from the clipping ctnrl panel - if(wxvtkclipping3Dview!=NULL) - { - wxvtkclipping3Dview->Refresh(); + //if(wxvtkclipping3Dview!=NULL) + //{ + // wxvtkclipping3Dview->Refresh(); - } - else if(wxvtkmpr3Dview!=NULL) - { - wxvtkmpr3Dview->Refresh(); + //} + //else if(wxvtkmpr3Dview!=NULL) + //{ + // wxvtkmpr3Dview->Refresh(); - } + //} } @@ -460,14 +708,14 @@ void HistogramDialog::OnRefreshBtn(wxCommandEvent &event) { newvol=vol; } - void HistogramDialog::setMPR3Dview(wxVtkMPR3DView *wxvtkmpr3Dview1) - { - wxvtkmpr3Dview=wxvtkmpr3Dview1; - } - void HistogramDialog::setClipping3DView(wxVtkClipping3DView *wxvtkclipping3Dview1) - { - wxvtkclipping3Dview=wxvtkclipping3Dview1; - } + //void HistogramDialog::setMPR3Dview(wxVtkMPR3DView *wxvtkmpr3Dview1) + //{ + // wxvtkmpr3Dview=wxvtkmpr3Dview1; + //} + //void HistogramDialog::setClipping3DView(wxVtkClipping3DView *wxvtkclipping3Dview1) + //{ + // wxvtkclipping3Dview=wxvtkclipping3Dview1; + //} void HistogramDialog::setTransferenceFunctionHasPoints(bool hasPoints) @@ -488,3 +736,34 @@ void HistogramDialog::OnRefreshBtn(wxCommandEvent &event) } +/** +** Initialize the histogram +*/ + void HistogramDialog::initializeHistogram(vtkImageData* img){ + _maxgreyvalue = img->GetScalarRange()[1]; + histogramW->initializeHistogram(img); + } +/** +** Returns two vectors, the grey level of the point and its value, the value is between [0,1] +**/ + void HistogramDialog::GetValuesPointsFunction(std::vector& greylevel,std::vector& value){ + + histogramW->GetValuesPointsFunction(greylevel, value); + } + +/** +** Returns two vectors, the grey level of the point and its value, the red, green +** and blue value is between [0,1] +**/ +void HistogramDialog::GetValuesColorPointsFunction(std::vector& greylevel, + std::vector& red, + std::vector& green, + std::vector& blue) +{ + histogramW->GetValuesColorPointsFunction(greylevel, red, green, blue); +} + +void HistogramDialog::SetFunctions(vtkPiecewiseFunction* _opac, vtkColorTransferFunction* _color){ + _tfun = _opac; + _ctfun = _color; +}