]> Creatis software - creaMaracasVisu.git/blob - lib/maracasVisuLib/src/interface/wxWindows/widgets/wxMaracas_N_ViewersWidget.cxx
38da613ae54c9cb8be9253c2d28e9f24e6f01507
[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: 2010/10/23 12:01:32 $
7   Version:   $Revision: 1.20 $
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 -> SplitVertically( 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                         wxwindow1 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[0], mvtkmprbasedata);
258                         wxwindow2 = new wxMaracas_ViewerWidget(spliterA, imagedata, (*nTypeView)[1], mvtkmprbasedata);
259                         spliterA-> SplitHorizontally( wxwindow1 , wxwindow2  );
260                         wxwindow3 = new wxMaracas_ViewerWidget(spliterB, imagedata, (*nTypeView)[2], mvtkmprbasedata);
261                         wxwindow4 = new wxMaracas_ViewerWidget(spliterB, imagedata, (*nTypeView)[3], mvtkmprbasedata);
262                         spliterB-> SplitHorizontally( wxwindow3 , wxwindow4  );
263                         wxwindow = spliter;
264                 }
265
266
267                 //panel->SetDimension()
268                 sizer->Add( wxwindow , 1, wxGROW);
269                 sizer->Layout();
270                 //_currentwxw = wxwindow;
271                 //_currentwxw->Show(true);
272
273                 //this->Layout();
274                 //this->Refresh();
275
276
277 // I don't undestand how this works and not the opposite ...
278                 if (wxwindow4!=NULL) {wxwindow4->ConfigureVTK(); }
279                 if (wxwindow3!=NULL) {wxwindow3->ConfigureVTK(); }
280                 if (wxwindow2!=NULL) {wxwindow2->ConfigureVTK(); }
281                 if (wxwindow1!=NULL) {wxwindow1->ConfigureVTK(); }
282  }
283
284
285 //-----------------------------------------------------------------------------------
286  void wxMaracas_N_ViewersWidget::SetType(std::vector<int>* type){
287          nTypeView = type;
288  }
289
290
291
292 //-----------------------------------------------------------------------------------
293  void wxMaracas_N_ViewersWidget::SetImage( vtkImageData *image  )
294  {
295          if (wxwindow1!=NULL) { wxwindow1->SetImage(image); }
296          if (wxwindow2!=NULL) { wxwindow2->SetImage(image); }
297          if (wxwindow3!=NULL) { wxwindow3->SetImage(image); }
298          if (wxwindow4!=NULL) { wxwindow4->SetImage(image); }
299          ConfigureVTK();
300
301  }
302
303 //-----------------------------------------------------------------------------------
304  void wxMaracas_N_ViewersWidget::ConfigureVTK()
305  {
306          if (wxwindow1!=NULL) { wxwindow1->ConfigureVTK(); }
307          if (wxwindow2!=NULL) { wxwindow2->ConfigureVTK(); }
308          if (wxwindow3!=NULL) { wxwindow3->ConfigureVTK(); }
309          if (wxwindow4!=NULL) { wxwindow4->ConfigureVTK(); }
310  }
311
312 //-----------------------------------------------------------------------------------
313 double wxMaracas_N_ViewersWidget :: GetX()
314 {
315         invariant();
316         return mvtkmprbasedata->GetX();
317 //      return wxwindow1->GetX();
318 }
319
320 //-----------------------------------------------------------------------------------
321 double wxMaracas_N_ViewersWidget :: GetY()
322 {
323         invariant();
324         return mvtkmprbasedata->GetY();
325 //      return wxwindow1->GetY();
326 }
327
328
329 //-----------------------------------------------------------------------------------
330 double wxMaracas_N_ViewersWidget :: GetZ()
331 {
332         invariant();
333         return mvtkmprbasedata->GetZ();
334 //      return wxwindow1->GetZ();
335 }
336
337 void wxMaracas_N_ViewersWidget :: invariant(){
338         if(mvtkmprbasedata == 0){
339                 throw "The image has not been set in the viewer";
340         }
341 }
342
343 void wxMaracas_N_ViewersWidget::setColorTransferFunction(vtkColorTransferFunction* colortable){
344     if (wxwindow1!=NULL) {
345                 wxwindow1->setColorTransferFunction(colortable);
346         }
347         if (wxwindow2!=NULL) {
348                 wxwindow2->setColorTransferFunction(colortable);
349         }
350         if (wxwindow3!=NULL) {
351                 wxwindow3->setColorTransferFunction(colortable);
352         }
353         if (wxwindow4!=NULL) {
354                 wxwindow4->setColorTransferFunction(colortable);
355         }
356 }
357
358 void wxMaracas_N_ViewersWidget::setWindowLevel(double level){
359         if (wxwindow1!=NULL) {
360                 wxwindow1->setWindowLevel(level);
361         }
362         if (wxwindow2!=NULL) {
363                 wxwindow2->setWindowLevel(level);
364         }
365         if (wxwindow3!=NULL) {
366                 wxwindow3->setWindowLevel(level);
367         }
368         if (wxwindow4!=NULL) {
369                 wxwindow4->setWindowLevel(level);
370         }
371 }
372 void wxMaracas_N_ViewersWidget::setColorLevel(double level){
373         if (wxwindow1!=NULL) {
374                 wxwindow1->setColorLevel(level);
375         }
376         if (wxwindow2!=NULL) {
377                 wxwindow2->setColorLevel(level);
378         }
379         if (wxwindow3!=NULL) {
380                 wxwindow3->setColorLevel(level);
381         }
382         if (wxwindow4!=NULL) {
383                 wxwindow4->setColorLevel(level);
384         }
385 }
386