]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/CutModule/interface/CutModelMainPanel.cxx
68dbb67e5bf38a8da8e84f39a5c42c19e363ec11
[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/04/29 15:39:43 $
7 Version:   $Revision: 1.9 $
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                         for(int i = 0; i < viewpanels.size()-1;i++){
130                                 CutModelView* view = viewpanels[i];
131                                 if(view->getId()==id){
132                                         for(int j = i; j < viewpanels.size()-1;j++){
133                                                 viewpanels[j]=viewpanels[j+1];
134                                         }
135                                         i = viewpanels.size();
136                                 }
137                         }
138                         viewpanels.pop_back();
139                         cutmanager->RemoveActor(id);
140                 }       
141
142         }catch(CutModelException e){
143                 showErrorDialog(e.getCause());
144         }
145 }
146
147 //RaC
148 void CutModelMainPanel::onCheckChanged(){
149
150         if(_isFirstTime==true){
151                 _isFirstTime=false;
152                 cutmanager->InitializePolygonInteractorStyle();
153         }
154
155         if(_isCheck==false)
156         {       
157                 _isCheck=true;
158                 //Draw Polygon
159
160                 cutmanager->ParallelProjectionOn();
161                 btnExecutePolygonCut->Enable(false);
162                 _notebook->GetPage(0)->Enable(false);
163                 _radioinsideout->Enable(false);
164                 lblMessagePolygon->SetLabel(_T("Drawing polygon..."));
165         }
166         else
167         {       
168                 _isCheck=false;
169                 //Finish Drawing
170                 cout<<"Finish Drawing"<<endl;
171                 cutmanager->ParallelProjectionOff();
172                 btnExecutePolygonCut->Enable(true);
173                 _notebook->GetPage(0)->Enable(true);
174                 _radioinsideout->Enable(true);
175                 lblMessagePolygon->SetLabel(_T("Contour saved! Click on Execute Cut"));
176         }
177
178         cutmanager->UpdatePolygon(_isCheck);
179
180 }
181
182
183 //RaC
184 void CutModelMainPanel::onExecuteCutPolygon()
185 {
186         //Cuts Polygon
187         cutmanager->ExecuteCutPolygon(_radioinsideout->GetSelection());
188         lblMessagePolygon->SetLabel(_T("No contour drawed"));
189 }
190
191
192 void CutModelMainPanel::onAddCutModel(){
193         try{
194                 checkInvariant();
195
196                 int id = addNewViewPanel();             
197                 cutmanager->onAddCutModel(id, getModelView(id));
198
199                 _panelid++;
200
201                 ShowCurrentPanel(id);
202
203         }catch(CutModelException e){
204                 showErrorDialog(e.getCause());
205         }
206 }
207
208 void CutModelMainPanel::ShowCurrentPanel(int id)
209 {
210         int i;
211         for(i = 0; i < (int) viewpanels.size();i++){            
212                 if(viewpanels[i]->getId()==id){
213                         _wxauimanager->GetPane(viewpanels[i]).Show(true);
214                         cutmanager->RefreshActor(id);
215                 }else{
216                         _wxauimanager->GetPane(viewpanels[i]).Show(false);
217                 }
218         }
219         _wxauimanager->Update();
220 }
221 int CutModelMainPanel::addNewViewPanel()throw( CutModelException){
222
223         CutModelView* viewpanel = new CutModelView(this,cutmanager->getImageRange());
224
225         wxAuiPaneInfo paneinfo0;
226         _wxauimanager->AddPane(viewpanel, paneinfo0.DefaultPane().DestroyOnClose().Centre());   
227
228         viewpanel->setId(_panelid);
229         viewpanels.push_back(viewpanel);        
230
231         return viewpanel->getId();
232
233
234 }
235 CutModelView* CutModelMainPanel::getModelView(int id)throw( CutModelException)
236 {
237         CutModelView* current = NULL;
238         int i;
239         for(i = 0; i < (int)viewpanels.size();i++)
240         {
241                 if(viewpanels[i]->getId()==id)
242                 {
243                         current = viewpanels[i];
244                 }
245         }
246         if(current == NULL)
247         {
248                 std::string s = "Id not found";
249                 throw CutModelException(s);
250         }
251         return current;
252 }
253
254 void CutModelMainPanel::onUndo()
255         {
256         try{
257                 checkInvariant();               
258                 /*int result = */ cutmanager->Undo(); // result unused// JPR
259
260         }catch(CutModelException e){
261                 showErrorDialog(e.getCause());
262         }
263 }
264
265 void CutModelMainPanel::onRedo(){
266         try{
267                 checkInvariant();               
268                 int result = cutmanager->Redo();
269
270         }catch(CutModelException e){
271                 showErrorDialog(e.getCause());
272         }
273 }
274
275 void CutModelMainPanel::changeOpacity(int id,int opacity){
276         try{
277                 checkInvariant();               
278                 cutmanager->changeOpacity(id, opacity);
279
280         }catch(CutModelException e){
281                 showErrorDialog(e.getCause());
282         }
283 }
284
285 void CutModelMainPanel::ShowViewBox(int id,bool check){
286         try{
287                 checkInvariant();               
288                 cutmanager->ShowViewBox(id, check);
289
290         }catch(CutModelException e){
291                 showErrorDialog(e.getCause());
292         }
293 }
294
295 void CutModelMainPanel::ShowPopUpMenu(int id){
296         showErrorDialog("test");
297 }
298
299 void CutModelMainPanel::changeColor(int id,double r,double g,double b){
300
301         try{
302                 checkInvariant();               
303                 cutmanager->changeColor(id, r, g, b);
304
305         }catch(CutModelException e){
306                 showErrorDialog(e.getCause());
307         }
308 }
309
310 void CutModelMainPanel::ChangeShape(int id,int selection){
311         try{
312                 checkInvariant();
313
314                 cutmanager->ChangeShape(id, selection);
315
316         }catch(CutModelException e){
317                 showErrorDialog(e.getCause());
318         }
319 }
320 void CutModelMainPanel::updateActorDirection(int id){
321         try{
322                 checkInvariant();
323
324                 cutmanager->updateActorDirection(id);
325
326         }catch(CutModelException e){
327                 showErrorDialog(e.getCause());
328         }
329 }
330
331 void CutModelMainPanel::ExecuteCut(int id, double* range, bool isinside){
332         try{
333                 checkInvariant();               
334
335                 cutmanager->ExecuteCut(id, range, isinside);
336         }catch(CutModelException e){
337                 showErrorDialog(e.getCause());
338         }
339 }
340
341 void CutModelMainPanel::ExecuteAll(){
342         int i;
343         for(i = 0; i < (int)viewpanels.size(); i++){
344                 viewpanels[i]->ExecuteCut();
345         }
346 }
347
348 vtkImageData* CutModelMainPanel::GetResultImage(){
349         try{
350                 checkInvariant();
351                 return cutmanager->GetResultImage();
352         }catch(CutModelException e){
353                 showErrorDialog(e.getCause());
354         }
355         return NULL;
356 }
357
358 void CutModelMainPanel::ShowStatistics(int id){
359
360         checkInvariant();
361         HistogramDialog *histo = new HistogramDialog(this, _T("Statistics"));
362
363         histo->initializeHistogram(cutmanager->GetResultImage());
364
365         histo->ShowModal();
366
367         delete histo;
368 }
369
370 void CutModelMainPanel::SaveCutModelData(std::string filename){
371         cutmanager->SaveCutModelData(filename);
372 }
373
374 void CutModelMainPanel::LoadCutModelData(std::string filename){
375         cutmanager->LoadCutModelData(filename);
376 }
377
378 void CutModelMainPanel::SetType(int type){
379         _type = type;
380 }
381
382 int CutModelMainPanel::GetType(){
383         return _type;
384 }
385
386 void CutModelMainPanel::addPolygonCutterTab(){
387         wxPanel *panel = new wxPanel(_notebook);
388         panel->SetAutoLayout(true);
389         wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); 
390         panel->SetSizer(sizer);
391         sizer->AddSpacer(20);
392
393         wxCheckBox *item = new wxCheckBox(panel,10,_T("Draw Polygon"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,_T("") );
394         item->SetValue(false);
395         Connect(item->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED,(wxObjectEventFunction)(&PolygonCutterEventHandlerCutModel::onCheckChanged));
396         sizer->Add(item, 0, wxALIGN_LEFT);
397
398         lblMessagePolygon = new wxStaticText(panel,30,_T("No contour drawed"),wxDefaultPosition,wxDefaultSize,0,_T("") );
399         sizer->Add(lblMessagePolygon, 0, wxALIGN_LEFT);
400
401         wxString choices0[2];
402         choices0[0] = _T("inside");
403         choices0[1] = _T("outside");
404         _radioinsideout = new  wxRadioBox(panel,-1,_T(""), wxDefaultPosition, wxDefaultSize,2,choices0);
405         sizer->Add(_radioinsideout, wxALIGN_LEFT);
406
407         btnExecutePolygonCut = new wxButton(panel,20,_T("Execute Cut"),wxDefaultPosition,wxDefaultSize,0,wxDefaultValidator,_T("") );
408         Connect(btnExecutePolygonCut->GetId(), wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)(&PolygonCutterEventHandlerCutModel::onExecuteCutPolygon));  
409         sizer->Add(btnExecutePolygonCut, 0, wxALIGN_LEFT);
410
411         _notebook->AddPage(panel, _T("Polygon Cutter"), false);
412 }
413
414 void PolygonCutterEventHandlerCutModel::onCheckChanged(wxCommandEvent& event){
415         CutModelMainPanel::getInstance()->onCheckChanged();
416 }
417
418 void PolygonCutterEventHandlerCutModel::onExecuteCutPolygon(wxCommandEvent& event){
419         CutModelMainPanel::getInstance()->onExecuteCutPolygon();
420 }
421
422 /**
423 **
424 **/
425 ToolBarCutModel::ToolBarCutModel(wxWindow * parent)
426 : wxToolBar(parent, -1, wxDefaultPosition, wxDefaultSize)
427 {
428         wxBitmap bitmap10(Add_xpm);
429         this->AddTool(10, wxString(_T("Add")),bitmap10);
430
431         this->AddSeparator();
432
433         wxBitmap bitmap20(Undo_xpm);
434         this->AddTool(20, wxString(_T("Undo")),bitmap20);
435
436         wxBitmap bitmap30(Redo_xpm);
437         this->AddTool(30, wxString(_T("Redo")),bitmap30);       
438
439         this->AddSeparator();
440
441         wxBitmap bitmap40(OkAll_xpm);
442         this->AddTool(40, wxString(_T("Ok All")),bitmap40);     
443
444         this->Realize();
445
446         _evthand = new ToolBarEventHandlerCutModel();
447         this->SetEventHandler(_evthand);
448 }
449
450 ToolBarCutModel::~ToolBarCutModel(void){
451 }
452
453 ToolBarEventHandlerCutModel::ToolBarEventHandlerCutModel()
454 : wxEvtHandler(){
455 }
456 ToolBarEventHandlerCutModel::~ToolBarEventHandlerCutModel(){
457 }
458
459 void ToolBarEventHandlerCutModel::onAdd(wxCommandEvent& event){
460         CutModelMainPanel::getInstance()->onAddCutModel();
461 }
462
463 void ToolBarEventHandlerCutModel::onUndo(wxCommandEvent& event){
464         CutModelMainPanel::getInstance()->onUndo();     
465 }
466
467 void ToolBarEventHandlerCutModel::onRedo(wxCommandEvent& event){
468         CutModelMainPanel::getInstance()->onRedo();
469 }
470
471 void ToolBarEventHandlerCutModel::onExecuteAll(wxCommandEvent& event){
472         CutModelMainPanel::getInstance()->ExecuteAll();
473 }
474
475 BEGIN_EVENT_TABLE(ToolBarEventHandlerCutModel, wxEvtHandler)
476         EVT_MENU(10, ToolBarEventHandlerCutModel::onAdd)
477         EVT_MENU(20, ToolBarEventHandlerCutModel::onUndo)
478         EVT_MENU(30, ToolBarEventHandlerCutModel::onRedo)
479         EVT_MENU(40, ToolBarEventHandlerCutModel::onExecuteAll)
480 END_EVENT_TABLE()