X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FmaracasVisuLib%2Fsrc%2Finterface%2FwxWindows%2Fwidgets%2FWidgetShowNPoints.cxx;fp=lib%2FmaracasVisuLib%2Fsrc%2Finterface%2FwxWindows%2Fwidgets%2FWidgetShowNPoints.cxx;h=0190f82d55f4a296eb120b235b3478f0af7e95d7;hb=b6280d5b96447f5e4db026549d346e0d099a86f6;hp=0000000000000000000000000000000000000000;hpb=307866a8f06b14018ea832926bdf3d887bfffea8;p=creaMaracasVisu.git diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/WidgetShowNPoints.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/WidgetShowNPoints.cxx new file mode 100644 index 0000000..0190f82 --- /dev/null +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/WidgetShowNPoints.cxx @@ -0,0 +1,575 @@ + + +#include "vtkActor.h" +#include "vtkSphereSource.h" +#include "vtkRenderer.h" +#include "vtkTextActor3D.h" + + +#include "vtkProperty.h" +#include "vtkPolyDataMapper.h" +#include "vtkRenderWindow.h" +#include + +#include +#include +#include +#include + +#include "WidgetShowNPoints.h" + + +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- +//---------------------------------------------------------------------- + WidgetShowNPoints::WidgetShowNPoints(wxWindow *parent, int type) + : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL) + { + mmodelShowNPoints = new ModelShowNPoints(); + mtype = type; + SetType(mtype); + this->renderer = NULL; + wxPanel *panel = this; + wxSizer *sizer = NULL; + + if (mtype==0) + { + // Widget interface + askPointLabel = new wxStaticText(panel, -1, _T("Point label :")); // JPR + textCtrl = new wxTextCtrl(panel, -1); + wxButton *btnAddPoint = new wxButton( panel, -1, _T("Add Point")); + wxButton *btnInsertPoint = new wxButton( panel, -1, _T("Insert Point"));//CFT + wxButton *btnSetPositionPoint = new wxButton( panel, -1, _T("Set nearest point")); + wxButton *btnRenamePoint = new wxButton( panel, -1, _T("Rename point")); + wxButton *btnEraseLastPoint = new wxButton( panel, -1, _T("Erase Last point")); + wxButton *btnErasePoint = new wxButton( panel, -1, _T("Erase point")); + wxButton *btnDeleteAllPoints = new wxButton( panel, -1, _T("Delete all points")); + wxButton *btnSavePoints = new wxButton( panel, -1, _T("Save points")); + wxButton *btnLoadPoints = new wxButton( panel, -1, _T("Load points")); + txtNrPoints = new wxStaticText(panel,-1, _T(" ")); + + //NTU: Sliders for opacity and radio change + wxStaticText* txOpacity = new wxStaticText(this, -1, wxString(_T(" Points Opacity "))); + sdrOpacity = new wxSlider(this, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_LABELS); + wxStaticText* txRadio = new wxStaticText(this, -1, wxString(_T(" Points Radio "))); + sdrRadio = new wxSlider(this, -1, 0, 1, 50, wxDefaultPosition, wxDefaultSize, wxSL_LABELS); + + wxFlexGridSizer *sizer1 = new wxFlexGridSizer(1); + // sizer1->Add(new wxStaticText(panel,-1,_T(" "))); + + Connect(btnAddPoint->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WidgetShowNPoints::OnAddPoint); + Connect(btnInsertPoint->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WidgetShowNPoints::OnInsertPoint);//CFT + Connect(btnSetPositionPoint->GetId(), wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WidgetShowNPoints::OnSetPoint); + Connect(btnRenamePoint->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WidgetShowNPoints::OnRenamePoint); + Connect(btnEraseLastPoint->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WidgetShowNPoints::OnEraseLastPoint); + Connect(btnErasePoint->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WidgetShowNPoints::OnErasePoint); + Connect(btnDeleteAllPoints->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WidgetShowNPoints::OnDeleteAllPoints); + Connect(btnSavePoints->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WidgetShowNPoints::OnSavePoints); + Connect(btnLoadPoints->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WidgetShowNPoints::OnLoadPoints); + + //NTU: Slider events + Connect(sdrOpacity->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WidgetShowNPoints::UpdatePoints); + Connect(sdrRadio->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WidgetShowNPoints::UpdatePoints); + + sizer1->Add(askPointLabel); // JPR + sizer1->Add(textCtrl); + sizer1->Add(btnAddPoint); + sizer1->Add(btnInsertPoint);//CFT + sizer1->Add(btnSetPositionPoint); + sizer1->Add(btnRenamePoint); + sizer1->Add(btnErasePoint); + sizer1->Add(btnEraseLastPoint); + sizer1->Add(btnDeleteAllPoints); + sizer1->Add(txtNrPoints); + sizer1->Add(txOpacity); + sizer1->Add(sdrOpacity,1,wxGROW ); + sizer1->Add(txRadio); + sizer1->Add(sdrRadio,1,wxGROW ); + sizer1->Add(btnSavePoints); + sizer1->Add(btnLoadPoints); + sizer = sizer1; + } + + if (mtype==1) + { + // Widget interface + wxButton *btnSetPositionPoint = new wxButton( panel, -1, _T("Set nearest point")); + txtNrPoints = new wxStaticText(panel,-1, _T(" ")); + + //NTU: Sliders for opacity and radio change + wxStaticText* txOpacity = new wxStaticText(this, -1, wxString(_T(" Points Opacity "))); + sdrOpacity = new wxSlider(this, -1, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_LABELS); + wxStaticText* txRadio = new wxStaticText(this, -1, wxString(_T(" Points Radio "))); + sdrRadio = new wxSlider(this, -1, 0, 1, 50, wxDefaultPosition, wxDefaultSize, wxSL_LABELS); + wxFlexGridSizer *sizer1 = new wxFlexGridSizer(1); + Connect(btnSetPositionPoint->GetId() , wxEVT_COMMAND_BUTTON_CLICKED , (wxObjectEventFunction) &WidgetShowNPoints::OnSetPoint); + Connect(sdrOpacity->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WidgetShowNPoints::UpdatePoints); + Connect(sdrRadio->GetId() , wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WidgetShowNPoints::UpdatePoints); + + sizer1->Add(btnSetPositionPoint); + sizer1->Add(txtNrPoints); + sizer1->Add(txOpacity); + sizer1->Add(sdrOpacity,1,wxGROW ); + sizer1->Add(txRadio); + sizer1->Add(sdrRadio,1,wxGROW ); + sizer = sizer1; + } + + if (mtype == 2) + { + askPointLabel = new wxStaticText(panel, -1, _T("\nPOINT CONTROLS:")); // JPR + wxButton *btnAddPoint = new wxButton(panel, -1, _T(" Add Point ")); + wxButton *btnDeleteAllPoints = new wxButton(panel, -1, _T(" Delete All ")); + wxStaticText *spacer = new wxStaticText(panel, -1, _T("\n")); // JPR + textCtrl = new wxTextCtrl(panel, -1); + wxFlexGridSizer *sizer1 = new wxFlexGridSizer(1); + Connect(btnAddPoint->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) & WidgetShowNPoints::OnAddPoint); + Connect(btnDeleteAllPoints->GetId(), wxEVT_COMMAND_BUTTON_CLICKED, (wxObjectEventFunction) & WidgetShowNPoints::OnDeleteAllPoints); + sizer1->Add(askPointLabel); + sizer1->Add(btnAddPoint); + sizer1->Add(btnDeleteAllPoints); + sizer1->Add(spacer); + sizer1->Add(textCtrl); + sdrOpacity = new wxSlider(); + sdrRadio = new wxSlider(); + txtNrPoints = new wxStaticText(panel, -1, _T("\n\n\n")); + sizer = sizer1; + } // bbGetInputType 2 + + if (sizer!=NULL) + { + panel->SetSizer(sizer); + panel->SetAutoLayout(true); + panel->Layout(); + } // if sizer +} + +//------------------------------------------------------------------------ +WidgetShowNPoints::~WidgetShowNPoints() +{ +} + +//------------------------------------------------------------------------ +ModelShowNPoints* WidgetShowNPoints::GetModelShowNPoints() +{ + return mmodelShowNPoints; +} + + +//------------------------------------------------------------------------ +void WidgetShowNPoints::SetRadio(double radio) +{ + GetModelShowNPoints()->SetRadio(radio); + //NTU: For Slider + sdrRadio->SetValue(radio); +} + +//------------------------------------------------------------------------ +void WidgetShowNPoints::SetColour(std::vector colour) +{ + this->mcolour = colour; +} + +//------------------------------------------------------------------------ +void WidgetShowNPoints::SetImage(vtkImageData* image) +{ + GetModelShowNPoints()->SetImage(image); +} + +//------------------------------------------------------------------------ +void WidgetShowNPoints::SetOpacity(double opacity) +{ + this->mopacity=opacity; + //NTU: For Slider + sdrOpacity->SetValue(this->mopacity*100.0); +} + + +//------------------------------------------------------------------------ +void WidgetShowNPoints::SetRenderer(vtkRenderer *renderer) +{ + this->renderer = renderer; +} + +//------------------------------------------------------------------------ + +void WidgetShowNPoints::RefreshPoint(int id) +{ + double spc[3]; + +//EED 2016/06/17 +// mimage->GetSpacing(spc); +// int x = lstPointsX[id]; +// int y = lstPointsY[id]; +// int z = lstPointsZ[id]; + int x,y,z; + GetModelShowNPoints()->GetIdPoint(id,&x,&y,&z); + GetModelShowNPoints()->GetImage()->GetSpacing(spc); + std::string label = GetModelShowNPoints()->GetIdLabel(id); + double radio = GetModelShowNPoints()->GetRadio(); + + lstActorsSphere[id]->SetPosition( spc[0]*x , spc[1]*y , spc[2]*z ); + lstActorsSphere[id]->GetProperty()->SetColor( mcolour[0] , mcolour[1] , mcolour[2] ); + lstActorsSphere[id]->GetProperty()->SetOpacity( mopacity ); + lstSourceSphere[id]->SetRadius( radio ); + + lstActorsText[id]->SetInput( label.c_str() ); + lstActorsText[id]->SetPosition( radio+spc[0]*x , spc[1]*y , spc[2]*z ); +} + +//------------------------------------------------------------------------ +void WidgetShowNPoints::RefreshPoints() +{ + int id,size=lstActorsSphere.size(); + for (id=0;idGetRenderWindow()->Render(); +} + +//------------------------------------------------------------------------ +void WidgetShowNPoints::AddVtkPoint() +{ + // Sphere + vtkSphereSource *vtksphere = vtkSphereSource::New(); + vtksphere->SetThetaResolution (20); + vtksphere->SetPhiResolution (20); + vtksphere->SetRadius( 1 ); + //NTU: For updating points + lstSourceSphere.push_back(vtksphere); + vtkPolyDataMapper *sphereMapper = vtkPolyDataMapper::New(); + sphereMapper->SetInput( vtksphere->GetOutput() ); + vtkActor *sphereActor = vtkActor::New(); + sphereActor->SetMapper(sphereMapper); + sphereActor->SetOrigin(0, 0, 0); + + lstActorsSphere.push_back(sphereActor); + if(renderer==NULL){ + wxMessageDialog dialog(this, _T("Renderer Not Set"),_T("Renderer Not Set"),wxICON_ERROR); + dialog.ShowModal(); + return; + } + renderer->AddActor( sphereActor ); + // Actor + vtkTextActor3D *textActor = vtkTextActor3D::New(); +// textActor->SetInput( strLabel.c_str() ); + renderer->AddActor( textActor ); + lstActorsText.push_back(textActor); +} + + +//------------------------------------------------------------------------ +void WidgetShowNPoints::AddPoint(int x, int y, int z, std::string label) +{ + GetModelShowNPoints()->AddPoint(x,y,z, label ); + AddVtkPoint(); + RefreshPoint(lstActorsSphere.size()-1); +} + + + +//------------------------------------------------------------------------ +void WidgetShowNPoints::InsertPoint(int x, int y, int z, std::string label)//CFT +{ + +//-- + if ( GetModelShowNPoints()->InsertPoint(x,y,z,label) != -1 ) + { + AddVtkPoint(); + } else { + AddPoint(x,y,z,label); + } + RefreshPoints(); + //end if +} + + +//------------------------------------------------------------------------ +void WidgetShowNPoints::OnAddPoint (wxCommandEvent& event) +{ + if (this->renderer==NULL) + { + return; + } + + std::vector point = GetModelShowNPoints()->GetReferencePoint(); + if (point.size()==3) + { + AddPoint(point[0],point[1],point[2], (const char*) ( textCtrl->GetValue().mb_str() ) ); + SetOutputBox(); + renderer->GetRenderWindow()->Render(); + } else {//mpoint.size + printf("creaMaracasVisu::ShowNPoints (not match point) \n"); + } +} + +//------------------------------------------------------------------------ +void WidgetShowNPoints::OnInsertPoint (wxCommandEvent& event)//CFT +{ + if (this->renderer==NULL) + { + return; + } + + std::vector point = GetModelShowNPoints()->GetReferencePoint(); + if (point.size()==3) + { + InsertPoint(point[0],point[1],point[2], (const char*) ( textCtrl->GetValue().mb_str() ) ); + SetOutputBox(); + } else {//mpoint.size + printf("creaMaracasVisu::ShowNPoints (not match point) \n"); + } +} + + +//------------------------------------------------------------------------ + void WidgetShowNPoints::SetOutputBox() + { +//EED renderer->GetRenderWindow()->Render(); + wxString strTmp; + strTmp.Printf(_T("Nbr of points: %d"), GetModelShowNPoints()->GetLstPointsSize() ); + txtNrPoints->SetLabel( strTmp ); + //--BBTK + +//EED 2017-06-03 +// mbbShowNPoints->bbSetOutputlstPointsX( GetModelShowNPoints()->GetLstPointsX() ); +// mbbShowNPoints->bbSetOutputlstPointsY( GetModelShowNPoints()->GetLstPointsY() ); +// mbbShowNPoints->bbSetOutputlstPointsZ( GetModelShowNPoints()->GetLstPointsZ() ); +// mbbShowNPoints->bbSetOutputlstLabels( GetModelShowNPoints()->GetLstLabels() ); +// mbbShowNPoints->bbSignalOutputModification(); + } + + +//------------------------------------------------------------------------ + void WidgetShowNPoints::OnSavePoints(wxCommandEvent& event) + { + wxFileDialog* FD = new wxFileDialog( 0, + _T("Save points .."), + _T(""), + _T(""), + _T("(*.xls)|*.xls"), + wxSAVE | wxOVERWRITE_PROMPT, + wxDefaultPosition); + //EED + + int result_FD = FD->ShowModal(); + + // This line is need it by windows //EED + FD->SetReturnCode( result_FD ); + + if (FD->GetReturnCode()==wxID_OK) + { + std::string filename= (const char*) ( FD->GetPath().mb_str() ); + GetModelShowNPoints()->SavePoints( filename ); + } // dialog box + } + + +//------------------------------------------------------------------------ + void WidgetShowNPoints::OnLoadPoints(wxCommandEvent& event) + { + wxFileDialog* FD = new wxFileDialog( 0, + _T("Load points .."), + _T(""), + _T(""), + _T("(*.xls)|*.xls"), + wxOPEN | wxFILE_MUST_EXIST, + wxDefaultPosition); + int i; + //EED + int result_FD = FD->ShowModal(); + // This line is need it by windows //EED + FD->SetReturnCode( result_FD ); + if (FD->GetReturnCode()==wxID_OK) + { + + std::string filename= (const char*) ( FD->GetPath().mb_str() ); + int numberPointsRead = GetModelShowNPoints()->ReadPoints( filename ); + for (i=0;iGetNearestPoint(); + if((id==-1) && (mtype==1)) + { + id=0; + AddPoint(0,0,0,""); + SetOutputBox(); + } + + if (id>=0) + { + GetModelShowNPoints()->SetPointId_mReferencePoint(id); + RefreshPoint(id); + renderer->GetRenderWindow()->Render(); + } // if id + SetOutputBox(); + } + +//------------------------------------------------------------------------ + void WidgetShowNPoints::OnRenamePoint(wxCommandEvent& event) + { + int id = GetModelShowNPoints()->RenamePoint( (const char*) ( textCtrl->GetValue().mb_str() ) ); + if (id>=0) + { + lstActorsText[id]->SetInput( (const char*) ( textCtrl->GetValue().mb_str() ) ); + SetOutputBox(); + renderer->GetRenderWindow()->Render(); + } + } + +//------------------------------------------------------------------------ + void WidgetShowNPoints::ErasePoint(int id) + { + if (this->renderer!=NULL) + { + if (id>=0) + { + renderer->RemoveActor( lstActorsSphere[id] ); + renderer->RemoveActor( lstActorsText[id] ); + lstActorsSphere[id]->Delete(); + lstActorsText[id]->Delete(); + lstSourceSphere[id]->Delete(); + lstActorsSphere.erase( lstActorsSphere.begin()+id ); + lstActorsText.erase( lstActorsText.begin()+id ); + lstSourceSphere.erase( lstSourceSphere.begin()+id ); + GetModelShowNPoints()->ErasePoint(id); + } // if id + } // if renderer + } + +//------------------------------------------------------------------------ + void WidgetShowNPoints::OnErasePoint(wxCommandEvent& event) + { + ErasePoint( GetModelShowNPoints()->IdInsidePoint() ); + SetOutputBox(); + renderer->GetRenderWindow()->Render(); + } + +//------------------------------------------------------------------------ + void WidgetShowNPoints::OnEraseLastPoint(wxCommandEvent& event) + { + ErasePoint(lstActorsSphere.size()-1); + SetOutputBox(); + renderer->GetRenderWindow()->Render(); + } + +//------------------------------------------------------------------------ +void WidgetShowNPoints::DeleteAllPoints() +{ + int id,size=lstActorsSphere.size(); + for (id=size-1;id>=0;id--) + { + ErasePoint(id); + } + SetOutputBox(); + renderer->GetRenderWindow()->Render(); +} + +//------------------------------------------------------------------------ +void WidgetShowNPoints::OnDeleteAllPoints(wxCommandEvent& event) +{ + DeleteAllPoints(); +} + +//NTU: Method for updating points opacity and Radio + +//------------------------------------------------------------------------ +void WidgetShowNPoints::UpdatePoints(wxCommandEvent &event) +{ + //Difference in Radio for text placement +// double radio=GetModelShowNPoints()->GetRadio(); + this->mopacity = sdrOpacity->GetValue()/100.0; + GetModelShowNPoints()->SetRadio( sdrRadio->GetValue() ) ; +// radio = sdrRadio->GetValue(); + //NTU refresh the inputs + +//EED 2017-06-03 +// mbbShowNPoints->bbSetInputOpacity(this->mopacity); +// mbbShowNPoints->bbSetInputRadio( radio ); + // EED + RefreshPoints(); +} + +//------------------------------------------------------------------------ +void WidgetShowNPoints::SetReferencePoint(std::vector point) +{ + GetModelShowNPoints()->SetReferencePoint(point); +} + +//------------------------------------------------------------------------ +void WidgetShowNPoints::SetInitLstPoints( std::vector initLstPointsX, std::vector initLstPointsY, std::vector initLstPointsZ, std::vector initLstLabels ) +{ + if (this->renderer==NULL) + { + return; + } + + int i,sizeX,sizeY,sizeZ,sizeLabels; + sizeX=(int)initLstPointsX.size(); + sizeY=(int)initLstPointsY.size(); + sizeZ=(int)initLstPointsZ.size(); + sizeLabels=(int)initLstLabels.size(); + + int x,y,z; + std::string label; + + if ( (sizeX==sizeY) && (sizeX==sizeZ) ) + { + + for (i=0;iGetRenderWindow()->Render(); + + } // if size +} +//------------------------------------------------------------------------ +void WidgetShowNPoints::WidgetShowNPoints::SetType(int type) +{ + mtype=type; +} + +//------------------------------------------------------------------------ +int WidgetShowNPoints::WidgetShowNPoints::GetType() +{ + return mtype; +} + + +//------------------------------------------------------------------------ +double WidgetShowNPoints::GetRadio() +{ + return sdrRadio->GetValue(); +} + +//------------------------------------------------------------------------ +double WidgetShowNPoints::GetOpacity() +{ + return mopacity; +} + +