00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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
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
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
00082
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 for(int i = 0; i < viewpanels.size()-1;i++){
00130 CutModelView* view = viewpanels[i];
00131 if(view->getId()==id){
00132 for(int j = i; j < viewpanels.size()-1;j++){
00133 viewpanels[j]=viewpanels[j+1];
00134 }
00135 i = viewpanels.size();
00136 }
00137 }
00138 viewpanels.pop_back();
00139 cutmanager->RemoveActor(id);
00140 }
00141
00142 }catch(CutModelException e){
00143 showErrorDialog(e.getCause());
00144 }
00145 }
00146
00147
00148 void CutModelMainPanel::onCheckChanged(){
00149
00150 if(_isFirstTime==true){
00151 _isFirstTime=false;
00152 cutmanager->InitializePolygonInteractorStyle();
00153 }
00154
00155 if(_isCheck==false)
00156 {
00157 _isCheck=true;
00158
00159
00160 cutmanager->ParallelProjectionOn();
00161 btnExecutePolygonCut->Enable(false);
00162 _notebook->GetPage(0)->Enable(false);
00163 _radioinsideout->Enable(false);
00164 lblMessagePolygon->SetLabel(_T("Drawing polygon..."));
00165 }
00166 else
00167 {
00168 _isCheck=false;
00169
00170 cout<<"Finish Drawing"<<endl;
00171 cutmanager->ParallelProjectionOff();
00172 btnExecutePolygonCut->Enable(true);
00173 _notebook->GetPage(0)->Enable(true);
00174 _radioinsideout->Enable(true);
00175 lblMessagePolygon->SetLabel(_T("Contour saved! Click on Execute Cut"));
00176 }
00177
00178 cutmanager->UpdatePolygon(_isCheck);
00179
00180 }
00181
00182
00183
00184 void CutModelMainPanel::onExecuteCutPolygon()
00185 {
00186
00187 cutmanager->ExecuteCutPolygon(_radioinsideout->GetSelection());
00188 lblMessagePolygon->SetLabel(_T("No contour drawed"));
00189 }
00190
00191
00192 void CutModelMainPanel::onAddCutModel(){
00193 try{
00194 checkInvariant();
00195
00196 int id = addNewViewPanel();
00197 cutmanager->onAddCutModel(id, getModelView(id));
00198
00199 _panelid++;
00200
00201 ShowCurrentPanel(id);
00202
00203 }catch(CutModelException e){
00204 showErrorDialog(e.getCause());
00205 }
00206 }
00207
00208 void CutModelMainPanel::ShowCurrentPanel(int id)
00209 {
00210 int i;
00211 for(i = 0; i < (int) viewpanels.size();i++){
00212 if(viewpanels[i]->getId()==id){
00213 _wxauimanager->GetPane(viewpanels[i]).Show(true);
00214 cutmanager->RefreshActor(id);
00215 }else{
00216 _wxauimanager->GetPane(viewpanels[i]).Show(false);
00217 }
00218 }
00219 _wxauimanager->Update();
00220 }
00221 int CutModelMainPanel::addNewViewPanel()throw( CutModelException){
00222
00223 CutModelView* viewpanel = new CutModelView(this,cutmanager->getImageRange());
00224
00225 wxAuiPaneInfo paneinfo0;
00226 _wxauimanager->AddPane(viewpanel, paneinfo0.DefaultPane().DestroyOnClose().Centre());
00227
00228 viewpanel->setId(_panelid);
00229 viewpanels.push_back(viewpanel);
00230
00231 return viewpanel->getId();
00232
00233
00234 }
00235 CutModelView* CutModelMainPanel::getModelView(int id)throw( CutModelException)
00236 {
00237 CutModelView* current = NULL;
00238 int i;
00239 for(i = 0; i < (int)viewpanels.size();i++)
00240 {
00241 if(viewpanels[i]->getId()==id)
00242 {
00243 current = viewpanels[i];
00244 }
00245 }
00246 if(current == NULL)
00247 {
00248 std::string s = "Id not found";
00249 throw CutModelException(s);
00250 }
00251 return current;
00252 }
00253
00254 void CutModelMainPanel::onUndo()
00255 {
00256 try{
00257 checkInvariant();
00258 int result = cutmanager->Undo();
00259
00260 }catch(CutModelException e){
00261 showErrorDialog(e.getCause());
00262 }
00263
00264 }
00265
00266 void CutModelMainPanel::onRedo(){
00267
00268 try{
00269 checkInvariant();
00270 int result = cutmanager->Redo();
00271
00272 }catch(CutModelException e){
00273 showErrorDialog(e.getCause());
00274 }
00275
00276 }
00277
00278 void CutModelMainPanel::changeOpacity(int id,int opacity){
00279 try{
00280 checkInvariant();
00281 cutmanager->changeOpacity(id, opacity);
00282
00283 }catch(CutModelException e){
00284 showErrorDialog(e.getCause());
00285 }
00286 }
00287
00288 void CutModelMainPanel::ShowViewBox(int id,bool check){
00289 try{
00290 checkInvariant();
00291 cutmanager->ShowViewBox(id, check);
00292
00293 }catch(CutModelException e){
00294 showErrorDialog(e.getCause());
00295 }
00296 }
00297 void CutModelMainPanel::ShowPopUpMenu(int id){
00298 showErrorDialog("test");
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
00413 _notebook->AddPage(panel, _T("Polygon Cutter"), false);
00414
00415 }
00416
00417
00418 void PolygonCutterEventHandlerCutModel::onCheckChanged(wxCommandEvent& event){
00419 CutModelMainPanel::getInstance()->onCheckChanged();
00420 }
00421
00422 void PolygonCutterEventHandlerCutModel::onExecuteCutPolygon(wxCommandEvent& event){
00423 CutModelMainPanel::getInstance()->onExecuteCutPolygon();
00424 }
00425
00426
00427
00431 ToolBarCutModel::ToolBarCutModel(wxWindow * parent)
00432 : wxToolBar(parent, -1, wxDefaultPosition, wxDefaultSize)
00433 {
00434 wxBitmap bitmap10(Add_xpm);
00435 this->AddTool(10, wxString(_T("Add")),bitmap10);
00436
00437 this->AddSeparator();
00438
00439 wxBitmap bitmap20(Undo_xpm);
00440 this->AddTool(20, wxString(_T("Undo")),bitmap20);
00441
00442 wxBitmap bitmap30(Redo_xpm);
00443 this->AddTool(30, wxString(_T("Redo")),bitmap30);
00444
00445 this->AddSeparator();
00446
00447 wxBitmap bitmap40(OkAll_xpm);
00448 this->AddTool(40, wxString(_T("Ok All")),bitmap40);
00449
00450 this->Realize();
00451
00452 _evthand = new ToolBarEventHandlerCutModel();
00453 this->SetEventHandler(_evthand);
00454
00455 }
00456
00457 ToolBarCutModel::~ToolBarCutModel(void){
00458 }
00459
00460 ToolBarEventHandlerCutModel::ToolBarEventHandlerCutModel()
00461 : wxEvtHandler(){
00462 }
00463 ToolBarEventHandlerCutModel::~ToolBarEventHandlerCutModel(){
00464 }
00465
00466 void ToolBarEventHandlerCutModel::onAdd(wxCommandEvent& event){
00467 CutModelMainPanel::getInstance()->onAddCutModel();
00468 }
00469
00470 void ToolBarEventHandlerCutModel::onUndo(wxCommandEvent& event){
00471 CutModelMainPanel::getInstance()->onUndo();
00472 }
00473
00474 void ToolBarEventHandlerCutModel::onRedo(wxCommandEvent& event){
00475 CutModelMainPanel::getInstance()->onRedo();
00476 }
00477
00478 void ToolBarEventHandlerCutModel::onExecuteAll(wxCommandEvent& event){
00479 CutModelMainPanel::getInstance()->ExecuteAll();
00480 }
00481
00482
00483 BEGIN_EVENT_TABLE(ToolBarEventHandlerCutModel, wxEvtHandler)
00484 EVT_MENU(10, ToolBarEventHandlerCutModel::onAdd)
00485 EVT_MENU(20, ToolBarEventHandlerCutModel::onUndo)
00486 EVT_MENU(30, ToolBarEventHandlerCutModel::onRedo)
00487 EVT_MENU(40, ToolBarEventHandlerCutModel::onExecuteAll)
00488 END_EVENT_TABLE()
00489