]> Creatis software - bbtk.git/blob - packages/wxvtk/src/bbwxvtkViewer2D.cxx
Merge remote-tracking branch 'origin/changestoITK3and4' into vtk7itk4wx3
[bbtk.git] / packages / wxvtk / src / bbwxvtkViewer2D.cxx
1 /*
2  # ---------------------------------------------------------------------
3  #
4  # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
5  #                        pour la SantÈ)
6  # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7  # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8  # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9  #
10  #  This software is governed by the CeCILL-B license under French law and
11  #  abiding by the rules of distribution of free software. You can  use,
12  #  modify and/ or redistribute the software under the terms of the CeCILL-B
13  #  license as circulated by CEA, CNRS and INRIA at the following URL
14  #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15  #  or in the file LICENSE.txt.
16  #
17  #  As a counterpart to the access to the source code and  rights to copy,
18  #  modify and redistribute granted by the license, users are provided only
19  #  with a limited warranty  and the software's author,  the holder of the
20  #  economic rights,  and the successive licensors  have only  limited
21  #  liability.
22  #
23  #  The fact that you are presently reading this means that you have had
24  #  knowledge of the CeCILL-B license and that you accept its terms.
25  # ------------------------------------------------------------------------ */
26
27
28 /*=========================================================================
29                                                                                 
30   Program:   bbtk
31   Module:    $RCSfile: bbwxvtkViewer2D.cxx,v $
32   Language:  C++
33   Date:      $Date: 2012/11/16 08:52:36 $
34   Version:   $Revision: 1.39 $
35                                                                                 
36 =========================================================================*/
37 /**
38  *  \file 
39  *  \brief 
40  */
41
42
43 #ifdef USE_WXWIDGETS
44 #ifdef USE_VTK
45
46 #include "bbwxvtkViewer2D.h"
47 #include "bbwxvtkPackage.h"
48 //#include <wx/dialog.h>
49
50 #include "vtkInteractorStyleImage.h"
51 #include "vtkCamera.h"
52 #include "vtkRenderer.h"
53 #include <vtkInteractorStyleImage.h>
54 #include <vtkCommand.h>
55 #include <vtkImageActor.h>
56 #include <wx/gdicmn.h>
57
58 //EED 2017-01-01 Migration VTK7
59 #if VTK_MAJOR_VERSION <= 5
60         #include "wxvtkImageViewer2.h"
61 #else
62         #include <vtkImageViewer2.h>
63 #endif
64
65
66 #include "wxVTKRenderWindowInteractor.h"
67
68 namespace bbwxvtk
69 {
70   //--------------------------------------------------------------------------
71   class Viewer2DWidget : public wxPanel
72   {
73   public:
74     Viewer2DWidget(Viewer2D* box, wxWindow *parent);
75     ~Viewer2DWidget();
76     void UpdateView();
77     vtkRenderer                                 *GetRenderer();
78     vtkImageActor                       *GetImageActor();
79   private:
80     bool                                        mFirstTime;
81     Viewer2D                            *mBox;
82
83 //EED 2017-01-01 Migration VTK7
84 #if VTK_MAJOR_VERSION <= 5
85     wxvtkImageViewer2                   *imageViewer;
86 #else
87     vtkImageViewer2                             *imageViewer;
88 #endif
89
90     vtkImageData                                *backImageData;
91     vtkImageData                                *mDefaultImage;
92     wxVTKRenderWindowInteractor *wxvtkrenderwindowinteractor;
93     bool mUpdateCamera;
94
95     vtkImplicitPlaneWidget * maPlane1, * maPlane2, * mbPlane1, * mbPlane2;
96   };
97   
98   Viewer2DWidget::Viewer2DWidget(Viewer2D* box,  wxWindow *parent)
99     :  
100     wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
101     mFirstTime(true),
102     mBox(box)
103   {
104     wxPanel *panel      = this;
105
106     wxvtkrenderwindowinteractor = new wxVTKRenderWindowInteractor(panel,-1);
107     wxvtkrenderwindowinteractor->UseCaptureMouseOn();   
108
109 //EED 2017-01-01 Migration VTK7
110 #if VTK_MAJOR_VERSION <= 5
111     imageViewer = wxvtkImageViewer2::New();
112 #else
113     imageViewer = vtkImageViewer2::New();
114 #endif
115
116     imageViewer->SetSlice( 1 );
117     imageViewer->SetupInteractor ( wxvtkrenderwindowinteractor );
118     
119     mDefaultImage = vtkImageData::New();
120     int dim[3];
121     dim[0] = dim[1] = 256 ; 
122     dim[2] = 2; 
123     mDefaultImage->SetDimensions ( dim );
124     mDefaultImage->SetSpacing(1,1,1);
125     mDefaultImage->SetExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1);
126
127 //EED 2017-01-01 Migration VTK7
128 #if VTK_MAJOR_VERSION <= 5
129     mDefaultImage->SetWholeExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1);
130     mDefaultImage->SetScalarTypeToUnsignedChar();
131     mDefaultImage->AllocateScalars();   
132 #else
133     mDefaultImage->AllocateScalars(VTK_UNSIGNED_CHAR,1);   
134 #endif
135  
136         int i,j,k;
137     for (i=0;i<dim[0];i++) 
138         {
139                 for (j=0;j<dim[1];j++)
140                 { 
141                         for (k=0;k<dim[2];k++)
142                         { 
143                            mDefaultImage->SetScalarComponentFromFloat(i,j,k,0,0);
144                         } // for k
145                 }// for j
146         } // for i
147
148     for (i=0;i<dim[0];i++) 
149         {
150                 /*
151                 mDefaultImage->SetScalarComponentFromFloat(i,0,0,0,255);
152                 mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-1,0,0,255);
153                 mDefaultImage->SetScalarComponentFromFloat(0,i,0,0,255);
154                 mDefaultImage->SetScalarComponentFromFloat(dim[0]-1,i,0,0,255);
155                 mDefaultImage->SetScalarComponentFromFloat(i,0,1,0,255);
156                 mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-1,1,0,255);
157                 mDefaultImage->SetScalarComponentFromFloat(0,i,1,0,255);
158                 mDefaultImage->SetScalarComponentFromFloat(dim[0]-1,i,1,0,255);
159                 */
160                 mDefaultImage->SetScalarComponentFromFloat(i,i,0,0,255);
161                 mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-i-1,0,0,255);
162                 mDefaultImage->SetScalarComponentFromFloat(i,i,1,0,255);
163                 mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-i-1,1,0,255);
164       } // for i
165
166     mDefaultImage->Modified();
167     backImageData = mDefaultImage;
168
169 //EED 2017-01-01 Migration VTK7
170 #if VTK_MAJOR_VERSION <= 5
171     imageViewer->SetInput( backImageData );
172 #else
173     imageViewer->SetInputData( backImageData );
174 #endif
175
176     mUpdateCamera = true;
177     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
178     sizer->Add( wxvtkrenderwindowinteractor, 1, wxEXPAND, 0);
179     panel->SetSizer(sizer);
180     panel->SetAutoLayout(true);
181     panel->Layout();
182     //  wxvtkrenderwindowinteractor->Refresh();
183     //  wxvtkrenderwindowinteractor->Render();
184     //  imageViewer->GetRenderer()->ResetCameraClippingRange();
185     imageViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);
186   }
187   //-------------------------------------------------------------------------
188   
189   Viewer2DWidget::~Viewer2DWidget()
190   {
191     //    delete wxvtkrenderwindowinteractor;
192     // pourquoi pas wxvtkrenderwindowinteractor->Delete(); // JP
193     // LG : because it has been allocated with operator new not method ::New 
194     // we want to force its destruction without taking care of vtk ref counting
195     // on the contrary the following vtk objects are deleted with vtk Delete
196     //    std::cout << "Viewer2DWidget::~Viewer2DWidget()" << std::endl;
197     mDefaultImage->Delete();
198
199     if (backImageData)
200     {
201 //              backImageData->UnRegister(NULL);
202     }
203     if (imageViewer) 
204     {
205                 imageViewer->Delete();
206     }
207     delete wxvtkrenderwindowinteractor;
208     //    std::cout << "Viewer2DWidget::~Viewer2DWidget() OK" << std::endl;
209   }
210
211   //-------------------------------------------------------------------------
212   void Viewer2DWidget::UpdateView()
213   {
214     //    std::cout << "Viewer2DWidget::UpdateView() " << std::endl;
215     //    std::cout << "slice="<<mBox->bbGetInputSlice()<<std::endl;
216     mUpdateCamera = false; //JPR  
217     if ( ( mBox->bbGetInputIn() == NULL ) && ( backImageData != mDefaultImage ) )
218     {
219                 // 
220                 //      std::cout << "** Viewer2DWidget::UpdateView() : NULL Input (reset)" <<std::endl;
221                 backImageData = mDefaultImage;
222                 mUpdateCamera = true;
223     } else if ( ( mBox->bbGetInputIn() != NULL ) && 
224               (( mBox->bbGetInputStatus("In") != bbtk::UPTODATE  ) ||
225                ( mFirstTime))
226               )
227               //(backImageData != mBox->bbGetInputIn()) ) 
228         {       
229                 //      std::cout << "** Viewer2DWidget::UpdateView() : Input changed"  <<std::endl;
230                 mFirstTime = false;
231                 if (backImageData != mBox->bbGetInputIn()) // Don't update if just Slice changed
232                 {
233                   backImageData = mBox->bbGetInputIn();
234         //EED 2017-01-01 Migration VTK7
235         #if VTK_MAJOR_VERSION <= 5
236                   backImageData->Update();
237                   imageViewer->SetInput( backImageData );
238         #else
239                   imageViewer->SetInputData( backImageData );
240         #endif
241                   mUpdateCamera = true;
242                 } // if BackImageData
243       } // if BoxInputIn
244
245     if (mUpdateCamera)
246     {
247                 //      std::cout << "** Viewer2DWidget::UpdateView() : Update Camera"
248                 //                <<std::endl;
249                 int x1,x2,y1,y2,z1,z2;
250                 double spx,spy,spz;
251                 backImageData->GetSpacing(spx,spy,spz);
252                 backImageData->GetExtent (x1,x2,y1,y2,z1,z2);
253         
254                 double *range = backImageData->GetScalarRange();
255                 imageViewer->SetColorWindow(range[1] - range[0]);
256                 imageViewer->SetColorLevel(0.5 * (range[1] + range[0]));
257
258                 imageViewer->GetRenderer()->ResetCamera();
259                 double bounds[6];
260                 imageViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
261                 imageViewer->GetRenderer()->ResetCameraClippingRange(bounds);
262         
263                 //      bbtkMessage("Output",2,"Viewer2D '"<<mBox->bbGetName()<<"' - Image :"<<std::endl);
264                 //      std::cout << " extent  = "<< x1<<"-"<<x2<<" x "<<y1<<"-"<<y2<<" x "<<z1<<"-"<<z2<<std::endl;
265                 //      std::cout << " spacing = "<<spx << " - "<< spy << " - "<<spz<<std::endl;
266                 /*
267                 vtkCamera *camera = imageViewer->GetRenderer()->GetActiveCamera();
268
269                 camera->SetViewUp    ( spx*0,         -spy*1,        spz*0 );
270                 camera->SetPosition  ( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000 ); 
271                 camera->SetFocalPoint( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*0 ); 
272
273                 camera->ComputeViewPlaneNormal();
274                 camera->SetParallelScale(  spx*(x2-x1)/2.0 );
275                 //   
276                 //      imageViewer->GetRenderer()->ResetCamera(x1,x2,y1,y2,z1,z2);
277                 mUpdateCamera = false;
278                 //      std::cout << "Viewer2DWidget::UpdateView() passe par 3" << std::endl;
279                 imageViewer->SetColorWindow(512);
280                 imageViewer->SetColorLevel(256);
281                 */
282                  /*
283                 for (int i=0;i<10;i++)
284                   for (int j=0;j<10;j++)
285                         std::cout << mBox->bbGetInputIn()->GetScalarComponentAsFloat(i,j,0,0)
286                                   << std::endl;
287                  */
288     }
289
290     //  std::cout << "OW = "<< mBox->bbGetWindow() << std::endl;
291     //  std::cout << "CW = "<< mBox->bbGetContainingWindow() << std::endl;
292     //  std::cout << "Sh = "<< mBox->bbIsShown() << std::endl;
293
294     bool interp = mBox->bbGetInputInterpolate();
295     if ( interp )
296         {
297         imageViewer->GetImageActor()->InterpolateOn();
298     } else {
299         imageViewer->GetImageActor()->InterpolateOff();
300         }
301     
302     int orientation = mBox->bbGetInputOrientation();
303     if (orientation<0 || orientation>2) 
304         {
305        bbtkMessage("Output", 2, "Viewer2D : Orientation was not 0< <2 "<<std::endl);
306        orientation=2; // Why not?      
307     }
308
309     // mBox->bbIsShown() is necessary to be sure that the wxWindow is already 
310     // created and displayed. 
311     // Else when slice != 0 we get an X Window System error with wxGTK
312     if ( (backImageData!=NULL) && (mBox->bbIsShown()) )
313     {
314                 int z = mBox->bbGetInputSlice();
315                 int ext[6];
316
317 //EED 2017-01-01 Migration VTK7
318 #if VTK_MAJOR_VERSION <= 5
319                 backImageData->GetWholeExtent(ext);
320 #else
321                 backImageData->GetExtent(ext);
322 #endif
323
324                 /*
325                 std::cout << "ext = "<<ext[0]<<" - "<<ext[1]<<" ; "
326                           <<ext[2]<<" - "<<ext[3]<<" ; "
327                           <<ext[4]<<" - "<<ext[5]
328                           <<std::endl;
329                 */
330             switch(orientation){
331                case 0:
332                 if (z<ext[0]) { z=ext[0]; }
333                 if (z>ext[1]) { z=ext[1]; }
334                  
335                 break;
336                                    
337                case 1:
338                 if (z<ext[2]) { z=ext[2]; }
339                 if (z>ext[3]) { z=ext[3]; }
340                 break;
341                                                     
342                case 2:
343                 if (z<ext[4]) { z=ext[4]; }
344                 if (z>ext[5]) { z=ext[5]; }
345                 break;
346                 
347               default:
348                 bbtkMessage("Output", 2, "Viewer2D : Orientation was not 0< <2 (shouldn't arrive here!"<<std::endl);
349                 z = ext[5]; // Why not?
350            }
351
352 //EED 2017-01-01 Migration VTK7
353 #if VTK_MAJOR_VERSION <= 5
354             wxvtkrenderwindowinteractor->Refresh();
355 #else
356                 //wxRect *rect=new wxRect(0, 0, 50, 50);
357             //wxvtkrenderwindowinteractor->Refresh(true, rect);
358                 // ..
359 #endif
360
361             wxvtkrenderwindowinteractor->Render();
362             bbtkDebugMessage("Output",3,"Viewer2D : slice = "<<z<<std::endl);
363             imageViewer->SetSliceOrientation (orientation);
364             imageViewer->SetSlice( z );
365     } // if backImageData
366
367
368 }
369
370   //--------------------------------------------------------------------------
371 vtkRenderer * Viewer2DWidget::GetRenderer()
372 {
373         return imageViewer->GetRenderer();
374 }
375
376   //--------------------------------------------------------------------------
377   //-------------------------------------------------------------------------
378   //--------------------------------------------------------------------------
379   //--------------------------------------------------------------------------
380
381
382   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D);
383   BBTK_BLACK_BOX_IMPLEMENTATION(Viewer2D,bbtk::WxBlackBox);
384
385         
386         //-----------------------------------------------------------------     
387         void Viewer2D::bbUserSetDefaultValues()
388         {
389                 bbSetInputIn(NULL);
390                 bbSetInputInterpolate(true);  // JP
391                 bbSetInputSlice(0);
392                 bbSetOutputWidget(0);
393                 bbSetOutputRenderer(0);
394                 bbSetInputOrientation(2);
395         }
396         
397         //-----------------------------------------------------------------     
398         void Viewer2D::bbUserInitializeProcessing()
399         {
400         }
401         
402         //-----------------------------------------------------------------     
403         void Viewer2D::bbUserFinalizeProcessing()
404         {
405         }
406         
407         //--------------------------------------------------------------------------
408   void Viewer2D::Process() 
409   { 
410     //    std::cout << "Viewer2D::Process" << std::endl;
411     //    std::cout << "In="<<bbtk::GetIOStatusString(bbGetInputStatus("In")) << std::endl;
412     //    std::cout << "Slice="<<bbtk::GetIOStatusString(bbGetInputStatus("Slice")) << std::endl;
413     Viewer2DWidget* w = (Viewer2DWidget*)bbGetOutputWidget(); 
414     if (w)
415         {      
416                 w->UpdateView();
417     }
418     bbSetOutputOut( bbGetInputSlice() );  
419   }
420   
421
422
423
424         //--------------------------------------------------------------------------
425   void Viewer2D::CreateWidget(wxWindow* parent)
426   {
427     Viewer2DWidget* w = new Viewer2DWidget(this,parent);
428     w->UpdateView();
429     bbSetOutputWidget(w);
430     bbSetOutputRenderer( ((Viewer2DWidget*)bbGetOutputWidget())->GetRenderer() );
431   }
432
433
434
435 }//namespace bbtk
436
437 #endif
438 #endif
439