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 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
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
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
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
00185 void CutModelMainPanel::onExecuteCutPolygon()
00186 {
00187
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 cutmanager->Undo();
00260
00261 }catch(CutModelException e){
00262 showErrorDialog(e.getCause());
00263 }
00264 }
00265
00266 void CutModelMainPanel::onRedo(){
00267 try{
00268 checkInvariant();
00269 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()