CutModelMainPanel.cxx

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003 Program:   wxMaracas
00004 Module:    $RCSfile: CutModelMainPanel.cxx,v $
00005 Language:  C++
00006 Date:      $Date: 2010/09/29 21:21:03 $
00007 Version:   $Revision: 1.11 $
00008 
00009 Copyright: (c) 2002, 2003
00010 License:
00011 
00012 This software is distributed WITHOUT ANY WARRANTY; without even
00013 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00014 PURPOSE.  See the above copyright notice for more information.
00015 
00016 =========================================================================*/
00017 
00018 
00019 
00020 // EOF - wxMaracasMPR.cxx
00021 
00022 #include "CutModelMainPanel.h"
00023 #include "HistogramDialog.h"
00024 #include "creaSystem.h"
00025 
00026 #include <wx/colordlg.h>
00027 #include <wx/bmpbuttn.h>
00028 
00029 #include <Add.xpm>
00030 #include <Undo.xpm>
00031 #include <Redo.xpm>
00032 #include <OkAll.xpm>
00033 
00034 
00035 
00036 CutModelMainPanel* CutModelMainPanel::instance=NULL;
00037 
00038 CutModelMainPanel::CutModelMainPanel( wxWindow* parent, std::string path)
00039 : wxPanel(parent, -1, wxDefaultPosition, wxDefaultSize){
00040 
00041         cutmanager=NULL;
00042         _isCheck=false;
00043         _isFirstTime=true;
00044         initialize(path);
00045 
00046 }
00047 CutModelMainPanel::~CutModelMainPanel( ){       
00048         viewpanels.clear();
00049         delete cutmanager;
00050 }
00051 
00052 void CutModelMainPanel::initialize(std::string path){
00053         cutmanager = new CutModelManager(path);
00054         _panelid = 0;
00055         _wxauimanager = new wxAuiManager(this); 
00056 
00057         wxAuiPaneInfo paneinfo;
00058 
00059         //RaC 5-02-2010 Add tabs
00060         _notebook = new wxAuiNotebook(this,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxAUI_NB_TOP |wxAUI_NB_TAB_MOVE | wxAUI_NB_SCROLL_BUTTONS);
00061 
00062         _notebook->AddPage(new ToolBarCutModel(_notebook),_T("Cutter"),true);
00063         //_wxauimanager->AddPane(new ToolBarCutModel(this),paneinfo.ToolbarPane().Top());       
00064         _wxauimanager->AddPane(_notebook,paneinfo.Center());
00065         addPolygonCutterTab();
00066         _notebook->Update();
00067 
00068         _wxauimanager->Update();
00069 }
00070 
00071 CutModelMainPanel* CutModelMainPanel::getInstance(wxWindow* parent, std::string path){
00072         if(instance==NULL){
00073                 if(parent == NULL){
00074                         parent = new wxFrame();
00075                 }
00076                 instance = new CutModelMainPanel(parent, path);
00077         }
00078         return instance;
00079 }
00080 
00081 /*CutModelMainPanel* CutModelMainPanel::getInstance(){
00082 return instance;
00083 }*/
00084 
00085 
00086 void CutModelMainPanel::setImageData(vtkImageData* img){
00087         try{
00088                 checkInvariant();
00089                 cutmanager->setImageData(img);
00090         }catch(CutModelException e){
00091                 showErrorDialog(e.getCause());
00092         }
00093 }
00094 
00095 void CutModelMainPanel::setInteractor(vtkRenderWindowInteractor* interactor){
00096         try{
00097                 checkInvariant();
00098                 cutmanager->setInteractor(interactor);
00099         }catch(CutModelException e){
00100                 showErrorDialog(e.getCause());
00101         }
00102 }
00103 
00104 void CutModelMainPanel::setRenderer(vtkRenderer* renderer){
00105         try{
00106                 checkInvariant();
00107                 cutmanager->setRenderer(renderer);
00108         }catch(CutModelException e){
00109                 showErrorDialog(e.getCause());
00110         }
00111 }
00112 
00113 void CutModelMainPanel::checkInvariant()throw (CutModelException){
00114         if(cutmanager==NULL){
00115                 throw CutModelException("The manager is not initialize");
00116         }       
00117 }
00118 
00119 void CutModelMainPanel::showErrorDialog(std::string str){       
00120         wxMessageDialog* diag = new wxMessageDialog(this, wxString(str.c_str(),wxConvUTF8 ), wxString(str.c_str(),wxConvUTF8 ), wxICON_ERROR);
00121         diag->ShowModal();
00122 }
00123 
00124 void CutModelMainPanel::RemoveActor(int id){
00125         try{
00126                 checkInvariant();
00127 
00128                 if(!this->IsBeingDeleted()){
00129                         int i,j;
00130                         for(i = 0; i < (int)viewpanels.size()-1;i++){
00131                                 CutModelView* view = viewpanels[i];
00132                                 if(view->getId()==id){
00133                                         for(j = i; j < (int)viewpanels.size()-1;j++){
00134                                                 viewpanels[j]=viewpanels[j+1];
00135                                         }
00136                                         i = viewpanels.size();
00137                                 }
00138                         }
00139                         viewpanels.pop_back();
00140                         cutmanager->RemoveActor(id);
00141                 }       
00142 
00143         }catch(CutModelException e){
00144                 showErrorDialog(e.getCause());
00145         }
00146 }
00147 
00148 //RaC
00149 void CutModelMainPanel::onCheckChanged(){
00150 
00151         if(_isFirstTime==true){
00152                 _isFirstTime=false;
00153                 cutmanager->InitializePolygonInteractorStyle();
00154         }
00155 
00156         if(_isCheck==false)
00157         {       
00158                 _isCheck=true;
00159                 //Draw Polygon
00160 
00161                 cutmanager->ParallelProjectionOn();
00162                 btnExecutePolygonCut->Enable(false);
00163                 _notebook->GetPage(0)->Enable(false);
00164                 _radioinsideout->Enable(false);
00165                 lblMessagePolygon->SetLabel(_T("Drawing polygon..."));
00166         }
00167         else
00168         {       
00169                 _isCheck=false;
00170                 //Finish Drawing
00171                 cout<<"Finish Drawing"<<endl;
00172                 cutmanager->ParallelProjectionOff();
00173                 btnExecutePolygonCut->Enable(true);
00174                 _notebook->GetPage(0)->Enable(true);
00175                 _radioinsideout->Enable(true);
00176                 lblMessagePolygon->SetLabel(_T("Contour saved! Click on Execute Cut"));
00177         }
00178 
00179         cutmanager->UpdatePolygon(_isCheck);
00180 
00181 }
00182 
00183 
00184 //RaC
00185 void CutModelMainPanel::onExecuteCutPolygon()
00186 {
00187         //Cuts Polygon
00188         cutmanager->ExecuteCutPolygon(_radioinsideout->GetSelection());
00189         lblMessagePolygon->SetLabel(_T("No contour drawed"));
00190 }
00191 
00192 
00193 void CutModelMainPanel::onAddCutModel(){
00194         try{
00195                 checkInvariant();
00196 
00197                 int id = addNewViewPanel();             
00198                 cutmanager->onAddCutModel(id, getModelView(id));
00199 
00200                 _panelid++;
00201 
00202                 ShowCurrentPanel(id);
00203 
00204         }catch(CutModelException e){
00205                 showErrorDialog(e.getCause());
00206         }
00207 }
00208 
00209 void CutModelMainPanel::ShowCurrentPanel(int id)
00210 {
00211         int i;
00212         for(i = 0; i < (int) viewpanels.size();i++){            
00213                 if(viewpanels[i]->getId()==id){
00214                         _wxauimanager->GetPane(viewpanels[i]).Show(true);
00215                         cutmanager->RefreshActor(id);
00216                 }else{
00217                         _wxauimanager->GetPane(viewpanels[i]).Show(false);
00218                 }
00219         }
00220         _wxauimanager->Update();
00221 }
00222 int CutModelMainPanel::addNewViewPanel()throw( CutModelException){
00223 
00224         CutModelView* viewpanel = new CutModelView(this,cutmanager->getImageRange());
00225 
00226         wxAuiPaneInfo paneinfo0;
00227         _wxauimanager->AddPane(viewpanel, paneinfo0.DefaultPane().DestroyOnClose().Centre());   
00228 
00229         viewpanel->setId(_panelid);
00230         viewpanels.push_back(viewpanel);        
00231 
00232         return viewpanel->getId();
00233 
00234 
00235 }
00236 CutModelView* CutModelMainPanel::getModelView(int id)throw( CutModelException)
00237 {
00238         CutModelView* current = NULL;
00239         int i;
00240         for(i = 0; i < (int)viewpanels.size();i++)
00241         {
00242                 if(viewpanels[i]->getId()==id)
00243                 {
00244                         current = viewpanels[i];
00245                 }
00246         }
00247         if(current == NULL)
00248         {
00249                 std::string s = "Id not found";
00250                 throw CutModelException(s);
00251         }
00252         return current;
00253 }
00254 
00255 void CutModelMainPanel::onUndo()
00256         {
00257         try{
00258                 checkInvariant();               
00259                 /*int result = */ cutmanager->Undo(); // result unused// JPR
00260 
00261         }catch(CutModelException e){
00262                 showErrorDialog(e.getCause());
00263         }
00264 }
00265 
00266 void CutModelMainPanel::onRedo(){
00267         try{
00268                 checkInvariant();               
00269                 /*int result = */ cutmanager->Redo();
00270 
00271         }catch(CutModelException e){
00272                 showErrorDialog(e.getCause());
00273         }
00274 }
00275 
00276 void CutModelMainPanel::changeOpacity(int id,int opacity){
00277         try{
00278                 checkInvariant();               
00279                 cutmanager->changeOpacity(id, opacity);
00280 
00281         }catch(CutModelException e){
00282                 showErrorDialog(e.getCause());
00283         }
00284 }
00285 
00286 void CutModelMainPanel::ShowViewBox(int id,bool check){
00287         try{
00288                 checkInvariant();               
00289                 cutmanager->ShowViewBox(id, check);
00290 
00291         }catch(CutModelException e){
00292                 showErrorDialog(e.getCause());
00293         }
00294 }
00295 
00296 void CutModelMainPanel::ShowPopUpMenu(int id){
00297         showErrorDialog("test");
00298 }
00299 
00300 void CutModelMainPanel::changeColor(int id,double r,double g,double b){
00301 
00302         try{
00303                 checkInvariant();               
00304                 cutmanager->changeColor(id, r, g, b);
00305 
00306         }catch(CutModelException e){
00307                 showErrorDialog(e.getCause());
00308         }
00309 }
00310 
00311 void CutModelMainPanel::ChangeShape(int id,int selection){
00312         try{
00313                 checkInvariant();
00314 
00315                 cutmanager->ChangeShape(id, selection);
00316 
00317         }catch(CutModelException e){
00318                 showErrorDialog(e.getCause());
00319         }
00320 }
00321 void CutModelMainPanel::updateActorDirection(int id){
00322         try{
00323                 checkInvariant();
00324 
00325                 cutmanager->updateActorDirection(id);
00326 
00327         }catch(CutModelException e){
00328                 showErrorDialog(e.getCause());
00329         }
00330 }
00331 
00332 void CutModelMainPanel::ExecuteCut(int id, double* range, bool isinside){
00333         try{
00334                 checkInvariant();               
00335 
00336                 cutmanager->ExecuteCut(id, range, isinside);
00337         }catch(CutModelException e){
00338                 showErrorDialog(e.getCause());
00339         }
00340 }
00341 
00342 void CutModelMainPanel::ExecuteAll(){
00343         int i;
00344         for(i = 0; i < (int)viewpanels.size(); i++){
00345                 viewpanels[i]->ExecuteCut();
00346         }
00347 }
00348 
00349 vtkImageData* CutModelMainPanel::GetResultImage(){
00350         try{
00351                 checkInvariant();
00352                 return cutmanager->GetResultImage();
00353         }catch(CutModelException e){
00354                 showErrorDialog(e.getCause());
00355         }
00356         return NULL;
00357 }
00358 
00359 void CutModelMainPanel::ShowStatistics(int id){
00360 
00361         checkInvariant();
00362         HistogramDialog *histo = new HistogramDialog(this, _T("Statistics"));
00363 
00364         histo->initializeHistogram(cutmanager->GetResultImage());
00365 
00366         histo->ShowModal();
00367 
00368         delete histo;
00369 }
00370 
00371 void CutModelMainPanel::SaveCutModelData(std::string filename){
00372         cutmanager->SaveCutModelData(filename);
00373 }
00374 
00375 void CutModelMainPanel::LoadCutModelData(std::string filename){
00376         cutmanager->LoadCutModelData(filename);
00377 }
00378 
00379 void CutModelMainPanel::SetType(int type){
00380         _type = type;
00381 }
00382 
00383 int CutModelMainPanel::GetType(){
00384         return _type;
00385 }
00386 
00387 void CutModelMainPanel::addPolygonCutterTab(){
00388         wxPanel *panel = new wxPanel(_notebook);
00389         panel->SetAutoLayout(true);
00390         wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); 
00391         panel->SetSizer(sizer);
00392         sizer->AddSpacer(20);
00393 
00394         wxCheckBox *item = new wxCheckBox(panel,10,_T("Draw Polygon"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,_T("") );
00395         item->SetValue(false);
00396         Connect(item->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)(&PolygonCutterEventHandlerCutModel::onCheckChanged));
00397         sizer->Add(item, 0, wxALIGN_LEFT);
00398 
00399         lblMessagePolygon = new wxStaticText(panel,30,_T("No contour drawed"),wxDefaultPosition,wxDefaultSize,0,_T("") );
00400         sizer->Add(lblMessagePolygon, 0, wxALIGN_LEFT);
00401 
00402         wxString choices0[2];
00403         choices0[0] = _T("inside");
00404         choices0[1] = _T("outside");
00405         _radioinsideout = new  wxRadioBox(panel,-1,_T(""), wxDefaultPosition, wxDefaultSize,2,choices0);
00406         sizer->Add(_radioinsideout, wxALIGN_LEFT);
00407 
00408         btnExecutePolygonCut = new wxButton(panel,20,_T("Execute Cut"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,_T("") );
00409         Connect(btnExecutePolygonCut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)(&PolygonCutterEventHandlerCutModel::onExecuteCutPolygon));  
00410         sizer->Add(btnExecutePolygonCut, 0, wxALIGN_LEFT);
00411 
00412         _notebook->AddPage(panel, _T("Polygon Cutter"), false);
00413 }
00414 
00415 void PolygonCutterEventHandlerCutModel::onCheckChanged(wxCommandEvent& event){
00416         CutModelMainPanel::getInstance()->onCheckChanged();
00417 }
00418 
00419 void PolygonCutterEventHandlerCutModel::onExecuteCutPolygon(wxCommandEvent& event){
00420         CutModelMainPanel::getInstance()->onExecuteCutPolygon();
00421 }
00422 
00426 ToolBarCutModel::ToolBarCutModel(wxWindow * parent)
00427 : wxToolBar(parent, -1, wxDefaultPosition, wxDefaultSize)
00428 {
00429         wxBitmap bitmap10(Add_xpm);
00430         this->AddTool(10, wxString(_T("Add")),bitmap10);
00431 
00432         this->AddSeparator();
00433 
00434         wxBitmap bitmap20(Undo_xpm);
00435         this->AddTool(20, wxString(_T("Undo")),bitmap20);
00436 
00437         wxBitmap bitmap30(Redo_xpm);
00438         this->AddTool(30, wxString(_T("Redo")),bitmap30);       
00439 
00440         this->AddSeparator();
00441 
00442         wxBitmap bitmap40(OkAll_xpm);
00443         this->AddTool(40, wxString(_T("Ok All")),bitmap40);     
00444 
00445         this->Realize();
00446 
00447         _evthand = new ToolBarEventHandlerCutModel();
00448         this->SetEventHandler(_evthand);
00449 }
00450 
00451 ToolBarCutModel::~ToolBarCutModel(void){
00452 }
00453 
00454 ToolBarEventHandlerCutModel::ToolBarEventHandlerCutModel()
00455 : wxEvtHandler(){
00456 }
00457 ToolBarEventHandlerCutModel::~ToolBarEventHandlerCutModel(){
00458 }
00459 
00460 void ToolBarEventHandlerCutModel::onAdd(wxCommandEvent& event){
00461         CutModelMainPanel::getInstance()->onAddCutModel();
00462 }
00463 
00464 void ToolBarEventHandlerCutModel::onUndo(wxCommandEvent& event){
00465         CutModelMainPanel::getInstance()->onUndo();     
00466 }
00467 
00468 void ToolBarEventHandlerCutModel::onRedo(wxCommandEvent& event){
00469         CutModelMainPanel::getInstance()->onRedo();
00470 }
00471 
00472 void ToolBarEventHandlerCutModel::onExecuteAll(wxCommandEvent& event){
00473         CutModelMainPanel::getInstance()->ExecuteAll();
00474 }
00475 
00476 BEGIN_EVENT_TABLE(ToolBarEventHandlerCutModel, wxEvtHandler)
00477         EVT_MENU(10, ToolBarEventHandlerCutModel::onAdd)
00478         EVT_MENU(20, ToolBarEventHandlerCutModel::onUndo)
00479         EVT_MENU(30, ToolBarEventHandlerCutModel::onRedo)
00480         EVT_MENU(40, ToolBarEventHandlerCutModel::onExecuteAll)
00481 END_EVENT_TABLE()

Generated on 20 Oct 2010 for creaMaracasVisu_lib by  doxygen 1.6.1