]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/CutModule/interface/CutModelMainPanel.cxx
*** empty log message ***
[creaMaracasVisu.git] / lib / maracasVisuLib / src / CutModule / interface / CutModelMainPanel.cxx
1 /*=========================================================================
2
3 Program:   wxMaracas
4 Module:    $RCSfile: CutModelMainPanel.cxx,v $
5 Language:  C++
6 Date:      $Date: 2010/11/13 10:11:34 $
7 Version:   $Revision: 1.12 $
8
9 Copyright: (c) 2002, 2003
10 License:
11
12 This software is distributed WITHOUT ANY WARRANTY; without even
13 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
14 PURPOSE.  See the above copyright notice for more information.
15
16 =========================================================================*/
17
18
19
20 // EOF - wxMaracasMPR.cxx
21
22 #include "CutModelMainPanel.h"
23 #include "HistogramDialog.h"
24 #include "creaSystem.h"
25
26 #include <wx/colordlg.h>
27 #include <wx/bmpbuttn.h>
28
29 #include "Add.xpm"
30 #include "Undo.xpm"
31 #include "Redo.xpm"
32 #include "OkAll.xpm"
33
34
35
36 CutModelMainPanel* CutModelMainPanel::instance=NULL;
37
38 CutModelMainPanel::CutModelMainPanel( wxWindow* parent, std::string path)
39 : wxPanel(parent, -1, wxDefaultPosition, wxDefaultSize){
40
41         cutmanager=NULL;
42         _isCheck=false;
43         _isFirstTime=true;
44         initialize(path);
45
46 }
47 CutModelMainPanel::~CutModelMainPanel( ){
48         viewpanels.clear();
49         delete cutmanager;
50 }
51
52 void CutModelMainPanel::initialize(std::string path){
53         cutmanager = new CutModelManager(path);
54         _panelid = 0;
55         _wxauimanager = new wxAuiManager(this);
56
57         wxAuiPaneInfo paneinfo;
58
59         //RaC 5-02-2010 Add tabs
60         _notebook = new wxAuiNotebook(this,wxID_ANY,wxDefaultPosition,wxDefaultSize,wxAUI_NB_TOP |wxAUI_NB_TAB_MOVE | wxAUI_NB_SCROLL_BUTTONS);
61
62         _notebook->AddPage(new ToolBarCutModel(_notebook),_T("Cutter"),true);
63         //_wxauimanager->AddPane(new ToolBarCutModel(this),paneinfo.ToolbarPane().Top());
64         _wxauimanager->AddPane(_notebook,paneinfo.Center());
65         addPolygonCutterTab();
66         _notebook->Update();
67
68         _wxauimanager->Update();
69 }
70
71 CutModelMainPanel* CutModelMainPanel::getInstance(wxWindow* parent, std::string path){
72         if(instance==NULL){
73                 if(parent == NULL){
74                         parent = new wxFrame();
75                 }
76                 instance = new CutModelMainPanel(parent, path);
77         }
78         return instance;
79 }
80
81 /*CutModelMainPanel* CutModelMainPanel::getInstance(){
82 return instance;
83 }*/
84
85
86 void CutModelMainPanel::setImageData(vtkImageData* img){
87         try{
88                 checkInvariant();
89                 cutmanager->setImageData(img);
90         }catch(CutModelException e){
91                 showErrorDialog(e.getCause());
92         }
93 }
94
95 void CutModelMainPanel::setInteractor(vtkRenderWindowInteractor* interactor){
96         try{
97                 checkInvariant();
98                 cutmanager->setInteractor(interactor);
99         }catch(CutModelException e){
100                 showErrorDialog(e.getCause());
101         }
102 }
103
104 void CutModelMainPanel::setRenderer(vtkRenderer* renderer){
105         try{
106                 checkInvariant();
107                 cutmanager->setRenderer(renderer);
108         }catch(CutModelException e){
109                 showErrorDialog(e.getCause());
110         }
111 }
112
113 void CutModelMainPanel::checkInvariant()throw (CutModelException){
114         if(cutmanager==NULL){
115                 throw CutModelException("The manager is not initialize");
116         }
117 }
118
119 void CutModelMainPanel::showErrorDialog(std::string str){
120         wxMessageDialog* diag = new wxMessageDialog(this, wxString(str.c_str(),wxConvUTF8 ), wxString(str.c_str(),wxConvUTF8 ), wxICON_ERROR);
121         diag->ShowModal();
122 }
123
124 void CutModelMainPanel::RemoveActor(int id){
125         try{
126                 checkInvariant();
127
128                 if(!this->IsBeingDeleted()){
129                         int i,j;
130                         for(i = 0; i < (int)viewpanels.size()-1;i++){
131                                 CutModelView* view = viewpanels[i];
132                                 if(view->getId()==id){
133                                         for(j = i; j < (int)viewpanels.size()-1;j++){
134                                                 viewpanels[j]=viewpanels[j+1];
135                                         }
136                                         i = viewpanels.size();
137                                 }
138                         }
139                         viewpanels.pop_back();
140                         cutmanager->RemoveActor(id);
141                 }
142
143         }catch(CutModelException e){
144                 showErrorDialog(e.getCause());
145         }
146 }
147
148 //RaC
149 void CutModelMainPanel::onCheckChanged(){
150
151         if(_isFirstTime==true){
152                 _isFirstTime=false;
153                 cutmanager->InitializePolygonInteractorStyle();
154         }
155
156         if(_isCheck==false)
157         {
158                 _isCheck=true;
159                 //Draw Polygon
160
161                 cutmanager->ParallelProjectionOn();
162                 btnExecutePolygonCut->Enable(false);
163                 _notebook->GetPage(0)->Enable(false);
164                 _radioinsideout->Enable(false);
165                 lblMessagePolygon->SetLabel(_T("Drawing polygon..."));
166         }
167         else
168         {
169                 _isCheck=false;
170                 //Finish Drawing
171                 cout<<"Finish Drawing"<<endl;
172                 cutmanager->ParallelProjectionOff();
173                 btnExecutePolygonCut->Enable(true);
174                 _notebook->GetPage(0)->Enable(true);
175                 _radioinsideout->Enable(true);
176                 lblMessagePolygon->SetLabel(_T("Contour saved! Click on Execute Cut"));
177         }
178
179         cutmanager->UpdatePolygon(_isCheck);
180
181 }
182
183
184 //RaC
185 void CutModelMainPanel::onExecuteCutPolygon()
186 {
187         //Cuts Polygon
188         cutmanager->ExecuteCutPolygon(_radioinsideout->GetSelection());
189         lblMessagePolygon->SetLabel(_T("No contour drawed"));
190 }
191
192
193 void CutModelMainPanel::onAddCutModel(){
194         try{
195                 checkInvariant();
196
197                 int id = addNewViewPanel();
198                 cutmanager->onAddCutModel(id, getModelView(id));
199
200                 _panelid++;
201
202                 ShowCurrentPanel(id);
203
204         }catch(CutModelException e){
205                 showErrorDialog(e.getCause());
206         }
207 }
208
209 void CutModelMainPanel::ShowCurrentPanel(int id)
210 {
211         int i;
212         for(i = 0; i < (int) viewpanels.size();i++){
213                 if(viewpanels[i]->getId()==id){
214                         _wxauimanager->GetPane(viewpanels[i]).Show(true);
215                         cutmanager->RefreshActor(id);
216                 }else{
217                         _wxauimanager->GetPane(viewpanels[i]).Show(false);
218                 }
219         }
220         _wxauimanager->Update();
221 }
222 int CutModelMainPanel::addNewViewPanel()throw( CutModelException){
223
224         CutModelView* viewpanel = new CutModelView(this,cutmanager->getImageRange());
225
226         wxAuiPaneInfo paneinfo0;
227         _wxauimanager->AddPane(viewpanel, paneinfo0.DefaultPane().DestroyOnClose().Centre());
228
229         viewpanel->setId(_panelid);
230         viewpanels.push_back(viewpanel);
231
232         return viewpanel->getId();
233
234
235 }
236 CutModelView* CutModelMainPanel::getModelView(int id)throw( CutModelException)
237 {
238         CutModelView* current = NULL;
239         int i;
240         for(i = 0; i < (int)viewpanels.size();i++)
241         {
242                 if(viewpanels[i]->getId()==id)
243                 {
244                         current = viewpanels[i];
245                 }
246         }
247         if(current == NULL)
248         {
249                 std::string s = "Id not found";
250                 throw CutModelException(s);
251         }
252         return current;
253 }
254
255 void CutModelMainPanel::onUndo()
256         {
257         try{
258                 checkInvariant();
259                 /*int result = */ cutmanager->Undo(); // result unused// JPR
260
261         }catch(CutModelException e){
262                 showErrorDialog(e.getCause());
263         }
264 }
265
266 void CutModelMainPanel::onRedo(){
267         try{
268                 checkInvariant();
269                 /*int result = */ cutmanager->Redo();
270
271         }catch(CutModelException e){
272                 showErrorDialog(e.getCause());
273         }
274 }
275
276 void CutModelMainPanel::changeOpacity(int id,int opacity){
277         try{
278                 checkInvariant();
279                 cutmanager->changeOpacity(id, opacity);
280
281         }catch(CutModelException e){
282                 showErrorDialog(e.getCause());
283         }
284 }
285
286 void CutModelMainPanel::ShowViewBox(int id,bool check){
287         try{
288                 checkInvariant();
289                 cutmanager->ShowViewBox(id, check);
290
291         }catch(CutModelException e){
292                 showErrorDialog(e.getCause());
293         }
294 }
295
296 void CutModelMainPanel::ShowPopUpMenu(int id){
297         showErrorDialog("test");
298 }
299
300 void CutModelMainPanel::changeColor(int id,double r,double g,double b){
301
302         try{
303                 checkInvariant();
304                 cutmanager->changeColor(id, r, g, b);
305
306         }catch(CutModelException e){
307                 showErrorDialog(e.getCause());
308         }
309 }
310
311 void CutModelMainPanel::ChangeShape(int id,int selection){
312         try{
313                 checkInvariant();
314
315                 cutmanager->ChangeShape(id, selection);
316
317         }catch(CutModelException e){
318                 showErrorDialog(e.getCause());
319         }
320 }
321 void CutModelMainPanel::updateActorDirection(int id){
322         try{
323                 checkInvariant();
324
325                 cutmanager->updateActorDirection(id);
326
327         }catch(CutModelException e){
328                 showErrorDialog(e.getCause());
329         }
330 }
331
332 void CutModelMainPanel::ExecuteCut(int id, double* range, bool isinside){
333         try{
334                 checkInvariant();
335
336                 cutmanager->ExecuteCut(id, range, isinside);
337         }catch(CutModelException e){
338                 showErrorDialog(e.getCause());
339         }
340 }
341
342 void CutModelMainPanel::ExecuteAll(){
343         int i;
344         for(i = 0; i < (int)viewpanels.size(); i++){
345                 viewpanels[i]->ExecuteCut();
346         }
347 }
348
349 vtkImageData* CutModelMainPanel::GetResultImage(){
350         try{
351                 checkInvariant();
352                 return cutmanager->GetResultImage();
353         }catch(CutModelException e){
354                 showErrorDialog(e.getCause());
355         }
356         return NULL;
357 }
358
359 void CutModelMainPanel::ShowStatistics(int id){
360
361         checkInvariant();
362         HistogramDialog *histo = new HistogramDialog(this, _T("Statistics"));
363
364         histo->initializeHistogram(cutmanager->GetResultImage());
365
366         histo->ShowModal();
367
368         delete histo;
369 }
370
371 void CutModelMainPanel::SaveCutModelData(std::string filename){
372         cutmanager->SaveCutModelData(filename);
373 }
374
375 void CutModelMainPanel::LoadCutModelData(std::string filename){
376         cutmanager->LoadCutModelData(filename);
377 }
378
379 void CutModelMainPanel::SetType(int type){
380         _type = type;
381 }
382
383 int CutModelMainPanel::GetType(){
384         return _type;
385 }
386
387 void CutModelMainPanel::addPolygonCutterTab(){
388         wxPanel *panel = new wxPanel(_notebook);
389         panel->SetAutoLayout(true);
390         wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
391         panel->SetSizer(sizer);
392         sizer->AddSpacer(20);
393
394         wxCheckBox *item = new wxCheckBox(panel,10,_T("Draw Polygon"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,_T("") );
395         item->SetValue(false);
396         Connect(item->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)(&PolygonCutterEventHandlerCutModel::onCheckChanged));
397         sizer->Add(item, 0, wxALIGN_LEFT);
398
399         lblMessagePolygon = new wxStaticText(panel,30,_T("No contour drawed"),wxDefaultPosition,wxDefaultSize,0,_T("") );
400         sizer->Add(lblMessagePolygon, 0, wxALIGN_LEFT);
401
402         wxString choices0[2];
403         choices0[0] = _T("inside");
404         choices0[1] = _T("outside");
405         _radioinsideout = new  wxRadioBox(panel,-1,_T(""), wxDefaultPosition, wxDefaultSize,2,choices0);
406         sizer->Add(_radioinsideout, wxALIGN_LEFT);
407
408         btnExecutePolygonCut = new wxButton(panel,20,_T("Execute Cut"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,_T("") );
409         Connect(btnExecutePolygonCut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)(&PolygonCutterEventHandlerCutModel::onExecuteCutPolygon));
410         sizer->Add(btnExecutePolygonCut, 0, wxALIGN_LEFT);
411
412         _notebook->AddPage(panel, _T("Polygon Cutter"), false);
413 }
414
415 void PolygonCutterEventHandlerCutModel::onCheckChanged(wxCommandEvent& event){
416         CutModelMainPanel::getInstance()->onCheckChanged();
417 }
418
419 void PolygonCutterEventHandlerCutModel::onExecuteCutPolygon(wxCommandEvent& event){
420         CutModelMainPanel::getInstance()->onExecuteCutPolygon();
421 }
422
423 /**
424 **
425 **/
426 ToolBarCutModel::ToolBarCutModel(wxWindow * parent)
427 : wxToolBar(parent, -1, wxDefaultPosition, wxDefaultSize)
428 {
429         wxBitmap bitmap10(Add_xpm);
430         this->AddTool(10, wxString(_T("Add")),bitmap10);
431
432         this->AddSeparator();
433
434         wxBitmap bitmap20(Undo_xpm);
435         this->AddTool(20, wxString(_T("Undo")),bitmap20);
436
437         wxBitmap bitmap30(Redo_xpm);
438         this->AddTool(30, wxString(_T("Redo")),bitmap30);
439
440         this->AddSeparator();
441
442         wxBitmap bitmap40(OkAll_xpm);
443         this->AddTool(40, wxString(_T("Ok All")),bitmap40);
444
445         this->Realize();
446
447         _evthand = new ToolBarEventHandlerCutModel();
448         this->SetEventHandler(_evthand);
449 }
450
451 ToolBarCutModel::~ToolBarCutModel(void){
452 }
453
454 ToolBarEventHandlerCutModel::ToolBarEventHandlerCutModel()
455 : wxEvtHandler(){
456 }
457 ToolBarEventHandlerCutModel::~ToolBarEventHandlerCutModel(){
458 }
459
460 void ToolBarEventHandlerCutModel::onAdd(wxCommandEvent& event){
461         CutModelMainPanel::getInstance()->onAddCutModel();
462 }
463
464 void ToolBarEventHandlerCutModel::onUndo(wxCommandEvent& event){
465         CutModelMainPanel::getInstance()->onUndo();
466 }
467
468 void ToolBarEventHandlerCutModel::onRedo(wxCommandEvent& event){
469         CutModelMainPanel::getInstance()->onRedo();
470 }
471
472 void ToolBarEventHandlerCutModel::onExecuteAll(wxCommandEvent& event){
473         CutModelMainPanel::getInstance()->ExecuteAll();
474 }
475
476 BEGIN_EVENT_TABLE(ToolBarEventHandlerCutModel, wxEvtHandler)
477         EVT_MENU(10, ToolBarEventHandlerCutModel::onAdd)
478         EVT_MENU(20, ToolBarEventHandlerCutModel::onUndo)
479         EVT_MENU(30, ToolBarEventHandlerCutModel::onRedo)
480         EVT_MENU(40, ToolBarEventHandlerCutModel::onExecuteAll)
481 END_EVENT_TABLE()