]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_N_ViewersWidget.cxx
Bug #1679
[creaMaracasVisu.git] / lib / maracasVisuLib / src / interface / wxWindows / widgets / wxMaracas_N_ViewersWidget.cxx
1 /*=========================================================================
2
3   Program:   wxMaracas
4   Module:    $RCSfile: wxMaracas_N_ViewersWidget.cxx,v $
5   Language:  C++
6   Date:      $Date: 2012/10/11 10:45:16 $
7   Version:   $Revision: 1.22 $
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 // Definition includes
20 //------------------------------------------------------------------------------------------------------------
21 #include "wxMaracas_N_ViewersWidget.h"
22
23 //------------------------------------------------------------------------------------------------------------
24 // Other includes
25 //------------------------------------------------------------------------------------------------------------
26
27
28         //------------------------------------------------------------------------------------------------------------
29         // Constructors & Destructors
30         //------------------------------------------------------------------------------------------------------------
31
32
33         BEGIN_EVENT_TABLE( wxMaracas_N_ViewersWidget, wxPanel )
34                 EVT_MENU( 12121, wxMaracas_N_ViewersWidget::OnRefreshView )
35                 EVT_MENU( 12122, wxMaracas_N_ViewersWidget::OnDClickLeft  )
36         END_EVENT_TABLE( );
37
38
39         //------------------------------------------------------------------------------------------------------------
40         // Constructors & Destructors
41         //------------------------------------------------------------------------------------------------------------
42
43
44
45         wxMaracas_N_ViewersWidget::wxMaracas_N_ViewersWidget(wxWindow *parent, vtkImageData* imagedata, std::vector<int> *nTypeView)
46                 : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL)
47         {
48                 wxwindow1               = NULL;
49                 wxwindow2               = NULL;
50                 wxwindow3               = NULL;
51                 wxwindow4               = NULL;
52                 _currentwxw             = NULL;
53                 mvtkmprbasedata = NULL;
54
55                 wxSizer *sizer  = new wxBoxSizer(wxVERTICAL);
56                 this->SetSizer(sizer);
57                 this->SetAutoLayout(true);
58
59
60                 if(imagedata!=NULL && nTypeView!=NULL ){
61                         this->SetType(nTypeView);
62                         this->UpdateLayout(imagedata);
63                 }
64
65
66         }
67         /**
68         *       @pre A wxWindow* object must be provided as a parent for the viewer and the type of layout for the viewer
69         *       @post The layout of the viewer is initialized, if no image is provided at first, a default image is
70         *               used
71         *       @param wxWindow* parent of the window
72         *       @param std::vector<int>* vector of the type for the viewer
73         *       @param vtkImageData* imagedata of the viewer
74         */
75         wxMaracas_N_ViewersWidget::wxMaracas_N_ViewersWidget(wxWindow *parent, std::vector<int> *nTypeView, vtkImageData* imagedata)
76         : wxPanel( parent, -1){
77                 wxwindow1               = NULL;
78                 wxwindow2               = NULL;
79                 wxwindow3               = NULL;
80                 wxwindow4               = NULL;
81                 _currentwxw             = NULL;
82                 mvtkmprbasedata = NULL;
83
84                 wxSizer *sizer  = new wxBoxSizer(wxVERTICAL);
85                 this->SetSizer(sizer);
86                 this->SetAutoLayout(true);
87
88                 this->SetType(nTypeView);
89
90                 /*if(imagedata==NULL){
91                         double spc[3];
92                         spc[0] = 1;
93                         spc[1] = 1;
94                         spc[2] = 1;
95                         int extent[6];
96                         extent[0] = 0;
97                         extent[1] = 1;
98                         extent[2] = 0;
99                         extent[3] = 1;
100                         extent[4] = 0;
101                         extent[5] = 0;
102
103                         imagedata = vtkImageData::New();
104                         imagedata->SetSpacing(spc);
105                         imagedata->SetExtent(extent);
106                         imagedata->SetScalarTypeToUnsignedChar();
107                         imagedata->AllocateScalars();
108                 }*/
109
110                 this->UpdateLayout(imagedata);
111         }
112         //-------------------------------------------------------------------------
113
114         wxMaracas_N_ViewersWidget::~wxMaracas_N_ViewersWidget()
115         {
116                 if (mvtkmprbasedata!=NULL)
117                 {
118                         delete mvtkmprbasedata;
119                 }
120
121         }
122         //------------------------------------------------------------------------------------------------------------
123         // Methods
124         //------------------------------------------------------------------------------------------------------------
125
126
127         //-------------------------------------------------------------------------
128
129         void wxMaracas_N_ViewersWidget::Update()
130         {
131                 //wxvtkrenderwindowinteractor->Render();
132         //    wxvtkrenderwindowinteractor->Refresh();
133         //    Refresh();
134         }
135
136         //-------------------------------------------------------------------------
137
138         void wxMaracas_N_ViewersWidget::OnRefreshView(wxCommandEvent & event)
139         {
140                 RefreshView();
141         }
142         //----------------------------------------------------------------------------
143         void wxMaracas_N_ViewersWidget::OnDClickLeft(wxCommandEvent & event)
144         {
145                 RefreshView();
146         }
147
148                 //-------------------------------------------------------------------------
149
150         vtkRenderer *wxMaracas_N_ViewersWidget::GetRenderer()
151         {
152                 return NULL; //renderer;
153         }
154
155         void wxMaracas_N_ViewersWidget::RefreshView()
156         {
157
158                 if (wxwindow1!=NULL) {wxwindow1->RefreshView(); }
159                 if (wxwindow2!=NULL) {wxwindow2->RefreshView(); }
160                 if (wxwindow3!=NULL) {wxwindow3->RefreshView(); }
161                 if (wxwindow4!=NULL) {wxwindow4->RefreshView(); }
162         }
163
164         //-------------------------------------------------------------------------
165         wxMaracas_ViewerWidget *wxMaracas_N_ViewersWidget::GetWindow(int iWin)
166         {
167                 wxMaracas_ViewerWidget *tmpWin=NULL;
168                 if  (iWin==1)
169                 {
170                         tmpWin=wxwindow1;
171                 }
172                 if  (iWin==2)
173                 {
174                         tmpWin=wxwindow2;
175                 }
176                 if  (iWin==3)
177                 {
178                         tmpWin=wxwindow3;
179                 }
180                 if  (iWin==4)
181                 {
182                         tmpWin=wxwindow4;
183                 }
184                 return tmpWin;
185         }
186
187         //-------------------------------------------------------------------------
188         wxVtkBaseView *wxMaracas_N_ViewersWidget::GetwxVtkBaseView(int iWin)
189         {
190                 wxVtkBaseView *wxvtkbaseview=NULL;
191                 wxMaracas_ViewerWidget *tmpWin=GetWindow(iWin);
192                 if (tmpWin!=NULL){  wxvtkbaseview = tmpWin->GetwxVtkBaseView();  }
193                 return wxvtkbaseview;
194         }
195
196         //-------------------------------------------------------------------------
197         void wxMaracas_N_ViewersWidget::Refresh(bool eraseBackground, const wxRect* rect )
198         {
199                 wxPanel::Refresh(false);
200         }
201
202         //-------------------------------------------------------------------------
203         void wxMaracas_N_ViewersWidget::UpdateLayout(vtkImageData* imagedata)
204         {
205                 wxWindow                                *wxwindow       = NULL;
206                 wxSizer *sizer                                          = this->GetSizer();
207
208                 if (mvtkmprbasedata!=NULL)
209                 {
210                         delete mvtkmprbasedata;
211                 }
212
213                 marImageData    *marimagedata   = new marImageData( imagedata );
214                 mvtkmprbasedata                                 = new vtkMPRBaseData();
215                 mvtkmprbasedata->SetMarImageData(marimagedata);
216
217                 if(_currentwxw != NULL){
218                         _currentwxw->Show(false);
219                         delete _currentwxw;
220                         //sizer->Remove(currentwxwindow);
221                         //delete currentwxwindow;
222                 }
223
224                 //std::cout<<"size "<<nTypeView->size()<<std::endl;
225                 if (nTypeView->size()==1)
226                 {
227                         wxwindow1 = new wxMaracas_ViewerWidget(this, imagedata, (*nTypeView)[0], mvtkmprbasedata);
228                         wxwindow = wxwindow1;
229                 }else   if (nTypeView->size()==2)       {
230                         wxSplitterWindow        *spliter        = new wxSplitterWindow( this , -1);
231                         spliter->SetMinimumPaneSize(1);
232                         wxwindow1 = new wxMaracas_ViewerWidget(spliter, imagedata, (*nTypeView)[0], mvtkmprbasedata);
233                         wxwindow2 = new wxMaracas_ViewerWidget(spliter, imagedata, (*nTypeView)[1], mvtkmprbasedata);
234                         spliter -> SplitHorizontally( wxwindow1 , wxwindow2  );
235                         wxwindow = spliter;
236                 }else if (nTypeView->size()==3)
237                 {
238                         wxSplitterWindow        *spliter        = new wxSplitterWindow( this , -1);
239                         wxSplitterWindow        *spliterA       = new wxSplitterWindow( spliter , -1);
240                         spliter->SetMinimumPaneSize(1);
241                         spliterA->SetMinimumPaneSize(1);
242                         wxwindow1 = new wxMaracas_ViewerWidget(spliter , imagedata, (*nTypeView)[0], mvtkmprbasedata);
243                         wxwindow2 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[1], mvtkmprbasedata);
244                         wxwindow3 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[2], mvtkmprbasedata);
245                         spliter -> SplitVertically( wxwindow1 , spliterA   );
246                         spliterA-> SplitHorizontally( wxwindow2 , wxwindow3  );
247                         wxwindow = spliter;
248                 }else if (nTypeView->size()>=4){
249                         wxSplitterWindow        *spliter        = new wxSplitterWindow( this , -1);
250                         wxSplitterWindow        *spliterA       = new wxSplitterWindow( spliter , -1);
251                         wxSplitterWindow        *spliterB       = new wxSplitterWindow( spliter , -1);
252                         spliter->SetMinimumPaneSize(1);
253                         spliterA->SetMinimumPaneSize(1);
254                         spliterB->SetMinimumPaneSize(1);
255
256                         spliter -> SplitVertically( spliterA , spliterB   );
257                         
258                         
259 //EED 21 mars 2012  FLIP probleme  ..PLOP..                     
260 //                      wxwindow1 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[0], mvtkmprbasedata);
261 //                      wxwindow2 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[1], mvtkmprbasedata);
262 //                      wxwindow3 = new wxMaracas_ViewerWidget(spliterB, imagedata, (*nTypeView)[2], mvtkmprbasedata);
263 //                      wxwindow4 = new wxMaracas_ViewerWidget(spliterB, imagedata, (*nTypeView)[3], mvtkmprbasedata);
264 //                      spliterA-> SplitHorizontally( wxwindow1 , wxwindow2  );
265 //                      spliterB-> SplitHorizontally( wxwindow3 , wxwindow4  );
266                         
267                         wxwindow1 = new wxMaracas_ViewerWidget(spliterB, imagedata, (*nTypeView)[0], mvtkmprbasedata);
268                         wxwindow2 = new wxMaracas_ViewerWidget(spliterB, imagedata, (*nTypeView)[1], mvtkmprbasedata);
269                         wxwindow3 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[2], mvtkmprbasedata);
270                         wxwindow4 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[3], mvtkmprbasedata);
271                         spliterA-> SplitHorizontally( wxwindow3 , wxwindow4  );
272                         spliterB-> SplitHorizontally( wxwindow2 , wxwindow1  );
273                         
274                         wxwindow = spliter;
275                 }
276
277
278                 //panel->SetDimension()
279                 sizer->Add( wxwindow , 1, wxGROW);
280                 sizer->Layout();
281                 //_currentwxw = wxwindow;
282                 //_currentwxw->Show(true);
283
284                 //this->Layout();
285                 //this->Refresh();
286
287
288 // I don't undestand how this works and not the opposite ...
289                 if (wxwindow4!=NULL) {wxwindow4->ConfigureVTK(); }
290                 if (wxwindow3!=NULL) {wxwindow3->ConfigureVTK(); }
291                 if (wxwindow2!=NULL) {wxwindow2->ConfigureVTK(); }
292                 if (wxwindow1!=NULL) {wxwindow1->ConfigureVTK(); }
293  }
294
295
296 //-----------------------------------------------------------------------------------
297  void wxMaracas_N_ViewersWidget::SetType(std::vector<int>* type){
298          nTypeView = type;
299  }
300
301
302
303 //-----------------------------------------------------------------------------------
304  void wxMaracas_N_ViewersWidget::SetImage( vtkImageData *image  )
305  {
306          if (wxwindow1!=NULL) { wxwindow1->SetImage(image); }
307          if (wxwindow2!=NULL) { wxwindow2->SetImage(image); }
308          if (wxwindow3!=NULL) { wxwindow3->SetImage(image); }
309          if (wxwindow4!=NULL) { wxwindow4->SetImage(image); }
310          
311 //       ConfigureVTK();
312  }
313
314
315 //-----------------------------------------------------------------------------------
316  void wxMaracas_N_ViewersWidget::ConfigureVTK()
317  {
318          if (wxwindow1!=NULL) { wxwindow1->ConfigureVTK(); }
319          if (wxwindow2!=NULL) { wxwindow2->ConfigureVTK(); }
320          if (wxwindow3!=NULL) { wxwindow3->ConfigureVTK(); }
321          if (wxwindow4!=NULL) { wxwindow4->ConfigureVTK(); }
322  }
323
324 //-----------------------------------------------------------------------------------
325 double wxMaracas_N_ViewersWidget :: GetX()
326 {
327         invariant();
328         return mvtkmprbasedata->GetX();
329 //      return wxwindow1->GetX();
330 }
331
332 //-----------------------------------------------------------------------------------
333 double wxMaracas_N_ViewersWidget :: GetY()
334 {
335         invariant();
336         return mvtkmprbasedata->GetY();
337 //      return wxwindow1->GetY();
338 }
339
340
341 //-----------------------------------------------------------------------------------
342 double wxMaracas_N_ViewersWidget :: GetZ()
343 {
344         invariant();
345         return mvtkmprbasedata->GetZ();
346 //      return wxwindow1->GetZ();
347 }
348
349 void wxMaracas_N_ViewersWidget :: invariant(){
350         if(mvtkmprbasedata == 0){
351                 throw "The image has not been set in the viewer";
352         }
353 }
354
355 void wxMaracas_N_ViewersWidget::setColorTransferFunction(vtkColorTransferFunction* colortable){
356     if (wxwindow1!=NULL) {
357                 wxwindow1->setColorTransferFunction(colortable);
358         }
359         if (wxwindow2!=NULL) {
360                 wxwindow2->setColorTransferFunction(colortable);
361         }
362         if (wxwindow3!=NULL) {
363                 wxwindow3->setColorTransferFunction(colortable);
364         }
365         if (wxwindow4!=NULL) {
366                 wxwindow4->setColorTransferFunction(colortable);
367         }
368 }
369
370 void wxMaracas_N_ViewersWidget::setWindowLevel(double level){
371         if (wxwindow1!=NULL) {
372                 wxwindow1->setWindowLevel(level);
373         }
374         if (wxwindow2!=NULL) {
375                 wxwindow2->setWindowLevel(level);
376         }
377         if (wxwindow3!=NULL) {
378                 wxwindow3->setWindowLevel(level);
379         }
380         if (wxwindow4!=NULL) {
381                 wxwindow4->setWindowLevel(level);
382         }
383 }
384 void wxMaracas_N_ViewersWidget::setColorLevel(double level){
385         if (wxwindow1!=NULL) {
386                 wxwindow1->setColorLevel(level);
387         }
388         if (wxwindow2!=NULL) {
389                 wxwindow2->setColorLevel(level);
390         }
391         if (wxwindow3!=NULL) {
392                 wxwindow3->setColorLevel(level);
393         }
394         if (wxwindow4!=NULL) {
395                 wxwindow4->setColorLevel(level);
396         }
397 }
398