]> Creatis software - bbtk.git/blob - packages/wxvtk/src/bbwxvtkViewer2D.cxx
#3135 BBTK Feature New Normal - branch 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 "creawxVTKRenderWindowInteractor.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     crea::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     wxvtkrenderwindowinteractor = new crea::wxVTKRenderWindowInteractor(panel,-1);
106     wxvtkrenderwindowinteractor->UseCaptureMouseOn();   
107
108 //EED 2017-01-01 Migration VTK7
109 #if VTK_MAJOR_VERSION <= 5
110     imageViewer = wxvtkImageViewer2::New();
111 #else
112     imageViewer = vtkImageViewer2::New();
113 #endif
114
115     imageViewer->SetSlice( 1 );
116     imageViewer->SetupInteractor ( wxvtkrenderwindowinteractor );
117     
118     mDefaultImage = vtkImageData::New();
119     int dim[3];
120     dim[0] = dim[1] = 256 ; 
121     dim[2] = 2; 
122     mDefaultImage->SetDimensions ( dim );
123     mDefaultImage->SetSpacing(1,1,1);
124     mDefaultImage->SetExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1);
125
126 //EED 2017-01-01 Migration VTK7
127 #if VTK_MAJOR_VERSION <= 5
128     mDefaultImage->SetWholeExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1);
129     mDefaultImage->SetScalarTypeToUnsignedChar();
130     mDefaultImage->AllocateScalars();   
131 #else
132     mDefaultImage->AllocateScalars(VTK_UNSIGNED_CHAR,1);   
133 #endif
134  
135         int i,j,k;
136     for (i=0;i<dim[0];i++) 
137         {
138                 for (j=0;j<dim[1];j++)
139                 { 
140                         for (k=0;k<dim[2];k++)
141                         { 
142                            mDefaultImage->SetScalarComponentFromFloat(i,j,k,0,0);
143                         } // for k
144                 }// for j
145         } // for i
146
147     for (i=0;i<dim[0];i++) 
148         {
149                 /*
150                 mDefaultImage->SetScalarComponentFromFloat(i,0,0,0,255);
151                 mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-1,0,0,255);
152                 mDefaultImage->SetScalarComponentFromFloat(0,i,0,0,255);
153                 mDefaultImage->SetScalarComponentFromFloat(dim[0]-1,i,0,0,255);
154                 mDefaultImage->SetScalarComponentFromFloat(i,0,1,0,255);
155                 mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-1,1,0,255);
156                 mDefaultImage->SetScalarComponentFromFloat(0,i,1,0,255);
157                 mDefaultImage->SetScalarComponentFromFloat(dim[0]-1,i,1,0,255);
158                 */
159                 mDefaultImage->SetScalarComponentFromFloat(i,i,0,0,255);
160                 mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-i-1,0,0,255);
161                 mDefaultImage->SetScalarComponentFromFloat(i,i,1,0,255);
162                 mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-i-1,1,0,255);
163       } // for i
164
165     mDefaultImage->Modified();
166     backImageData = mDefaultImage;
167
168 //EED 2017-01-01 Migration VTK7
169 #if VTK_MAJOR_VERSION <= 5
170     imageViewer->SetInput( backImageData );
171 #else
172     imageViewer->SetInputData( backImageData );
173 #endif
174
175     mUpdateCamera = true;
176     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
177     sizer->Add( wxvtkrenderwindowinteractor, 1, wxEXPAND, 0);
178     panel->SetSizer(sizer);
179     panel->SetAutoLayout(true);
180     panel->Layout();
181     //  wxvtkrenderwindowinteractor->Refresh();
182     //  wxvtkrenderwindowinteractor->Render();
183     //  imageViewer->GetRenderer()->ResetCameraClippingRange();
184     imageViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);
185   }
186   //-------------------------------------------------------------------------
187   
188   Viewer2DWidget::~Viewer2DWidget()
189   {
190     //    delete wxvtkrenderwindowinteractor;
191     // pourquoi pas wxvtkrenderwindowinteractor->Delete(); // JP
192     // LG : because it has been allocated with operator new not method ::New 
193     // we want to force its destruction without taking care of vtk ref counting
194     // on the contrary the following vtk objects are deleted with vtk Delete
195     //    std::cout << "Viewer2DWidget::~Viewer2DWidget()" << std::endl;
196     mDefaultImage->Delete();
197
198     if (backImageData)
199     {
200 //              backImageData->UnRegister(NULL);
201     }
202     if (imageViewer) 
203     {
204                 imageViewer->Delete();
205     }
206     delete wxvtkrenderwindowinteractor;
207     //    std::cout << "Viewer2DWidget::~Viewer2DWidget() OK" << std::endl;
208   }
209
210   //-------------------------------------------------------------------------
211   void Viewer2DWidget::UpdateView()
212   {
213     //    std::cout << "Viewer2DWidget::UpdateView() " << std::endl;
214     //    std::cout << "slice="<<mBox->bbGetInputSlice()<<std::endl;
215     mUpdateCamera = false; //JPR  
216     if ( ( mBox->bbGetInputIn() == NULL ) && ( backImageData != mDefaultImage ) )
217     {
218                 // 
219                 //      std::cout << "** Viewer2DWidget::UpdateView() : NULL Input (reset)" <<std::endl;
220                 backImageData = mDefaultImage;
221                 mUpdateCamera = true;
222     } else if ( ( mBox->bbGetInputIn() != NULL ) && 
223               (( mBox->bbGetInputStatus("In") != bbtk::UPTODATE  ) ||
224                ( mFirstTime))
225               )
226               //(backImageData != mBox->bbGetInputIn()) ) 
227         {       
228                 //      std::cout << "** Viewer2DWidget::UpdateView() : Input changed"  <<std::endl;
229                 mFirstTime = false;
230                 if (backImageData != mBox->bbGetInputIn()) // Don't update if just Slice changed
231                 {
232                   backImageData = mBox->bbGetInputIn();
233         //EED 2017-01-01 Migration VTK7
234         #if VTK_MAJOR_VERSION <= 5
235                   backImageData->Update();
236                   imageViewer->SetInput( backImageData );
237         #else
238                   imageViewer->SetInputData( backImageData );
239         #endif
240                   mUpdateCamera = true;
241                 } // if BackImageData
242       } // if BoxInputIn
243
244     if (mUpdateCamera)
245     {
246                 //      std::cout << "** Viewer2DWidget::UpdateView() : Update Camera"
247                 //                <<std::endl;
248                 int x1,x2,y1,y2,z1,z2;
249                 double spx,spy,spz;
250                 backImageData->GetSpacing(spx,spy,spz);
251                 backImageData->GetExtent (x1,x2,y1,y2,z1,z2);
252         
253                 double *range = backImageData->GetScalarRange();
254                 imageViewer->SetColorWindow(range[1] - range[0]);
255                 imageViewer->SetColorLevel(0.5 * (range[1] + range[0]));
256
257                 imageViewer->GetRenderer()->ResetCamera();
258                 double bounds[6];
259                 imageViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
260                 imageViewer->GetRenderer()->ResetCameraClippingRange(bounds);
261         
262                 //      bbtkMessage("Output",2,"Viewer2D '"<<mBox->bbGetName()<<"' - Image :"<<std::endl);
263                 //      std::cout << " extent  = "<< x1<<"-"<<x2<<" x "<<y1<<"-"<<y2<<" x "<<z1<<"-"<<z2<<std::endl;
264                 //      std::cout << " spacing = "<<spx << " - "<< spy << " - "<<spz<<std::endl;
265                 /*
266                 vtkCamera *camera = imageViewer->GetRenderer()->GetActiveCamera();
267
268                 camera->SetViewUp    ( spx*0,         -spy*1,        spz*0 );
269                 camera->SetPosition  ( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000 ); 
270                 camera->SetFocalPoint( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*0 ); 
271
272                 camera->ComputeViewPlaneNormal();
273                 camera->SetParallelScale(  spx*(x2-x1)/2.0 );
274                 //   
275                 //      imageViewer->GetRenderer()->ResetCamera(x1,x2,y1,y2,z1,z2);
276                 mUpdateCamera = false;
277                 //      std::cout << "Viewer2DWidget::UpdateView() passe par 3" << std::endl;
278                 imageViewer->SetColorWindow(512);
279                 imageViewer->SetColorLevel(256);
280                 */
281                  /*
282                 for (int i=0;i<10;i++)
283                   for (int j=0;j<10;j++)
284                         std::cout << mBox->bbGetInputIn()->GetScalarComponentAsFloat(i,j,0,0)
285                                   << std::endl;
286                  */
287     }
288
289     //  std::cout << "OW = "<< mBox->bbGetWindow() << std::endl;
290     //  std::cout << "CW = "<< mBox->bbGetContainingWindow() << std::endl;
291     //  std::cout << "Sh = "<< mBox->bbIsShown() << std::endl;
292
293     bool interp = mBox->bbGetInputInterpolate();
294     if ( interp )
295         {
296         imageViewer->GetImageActor()->InterpolateOn();
297     } else {
298         imageViewer->GetImageActor()->InterpolateOff();
299         }
300     
301     int orientation = mBox->bbGetInputOrientation();
302     if (orientation<0 || orientation>2) 
303         {
304        bbtkMessage("Output", 2, "Viewer2D : Orientation was not 0< <2 "<<std::endl);
305        orientation=2; // Why not?      
306     }
307
308     // mBox->bbIsShown() is necessary to be sure that the wxWindow is already 
309     // created and displayed. 
310     // Else when slice != 0 we get an X Window System error with wxGTK
311     if ( (backImageData!=NULL) && (mBox->bbIsShown()) )
312     {
313                 int z = mBox->bbGetInputSlice();
314                 int ext[6];
315
316 //EED 2017-01-01 Migration VTK7
317 #if VTK_MAJOR_VERSION <= 5
318                 backImageData->GetWholeExtent(ext);
319 #else
320                 backImageData->GetExtent(ext);
321 #endif
322
323                 /*
324                 std::cout << "ext = "<<ext[0]<<" - "<<ext[1]<<" ; "
325                           <<ext[2]<<" - "<<ext[3]<<" ; "
326                           <<ext[4]<<" - "<<ext[5]
327                           <<std::endl;
328                 */
329             switch(orientation){
330                case 0:
331                 if (z<ext[0]) { z=ext[0]; }
332                 if (z>ext[1]) { z=ext[1]; }
333                  
334                 break;
335                                    
336                case 1:
337                 if (z<ext[2]) { z=ext[2]; }
338                 if (z>ext[3]) { z=ext[3]; }
339                 break;
340                                                     
341                case 2:
342                 if (z<ext[4]) { z=ext[4]; }
343                 if (z>ext[5]) { z=ext[5]; }
344                 break;
345                 
346               default:
347                 bbtkMessage("Output", 2, "Viewer2D : Orientation was not 0< <2 (shouldn't arrive here!"<<std::endl);
348                 z = ext[5]; // Why not?
349            }
350
351 //EED 2017-01-01 Migration VTK7
352 #if VTK_MAJOR_VERSION <= 5
353             wxvtkrenderwindowinteractor->Refresh();
354 #else
355                 //wxRect *rect=new wxRect(0, 0, 50, 50);
356             //wxvtkrenderwindowinteractor->Refresh(true, rect);
357                 // ..
358 #endif
359
360             wxvtkrenderwindowinteractor->Render();
361             bbtkDebugMessage("Output",3,"Viewer2D : slice = "<<z<<std::endl);
362             imageViewer->SetSliceOrientation (orientation);
363             imageViewer->SetSlice( z );
364     } // if backImageData
365
366
367 }
368
369   //--------------------------------------------------------------------------
370 vtkRenderer * Viewer2DWidget::GetRenderer()
371 {
372         return imageViewer->GetRenderer();
373 }
374
375   //--------------------------------------------------------------------------
376   //-------------------------------------------------------------------------
377   //--------------------------------------------------------------------------
378   //--------------------------------------------------------------------------
379
380
381   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D);
382   BBTK_BLACK_BOX_IMPLEMENTATION(Viewer2D,bbtk::WxBlackBox);
383
384         
385         //-----------------------------------------------------------------     
386         void Viewer2D::bbUserSetDefaultValues()
387         {
388                 bbSetInputIn(NULL);
389                 bbSetInputInterpolate(true);  // JP
390                 bbSetInputSlice(0);
391                 bbSetOutputWidget(0);
392                 bbSetOutputRenderer(0);
393                 bbSetInputOrientation(2);
394         }
395         
396         //-----------------------------------------------------------------     
397         void Viewer2D::bbUserInitializeProcessing()
398         {
399         }
400         
401         //-----------------------------------------------------------------     
402         void Viewer2D::bbUserFinalizeProcessing()
403         {
404         }
405         
406         //--------------------------------------------------------------------------
407   void Viewer2D::Process() 
408   { 
409     //    std::cout << "Viewer2D::Process" << std::endl;
410     //    std::cout << "In="<<bbtk::GetIOStatusString(bbGetInputStatus("In")) << std::endl;
411     //    std::cout << "Slice="<<bbtk::GetIOStatusString(bbGetInputStatus("Slice")) << std::endl;
412     Viewer2DWidget* w = (Viewer2DWidget*)bbGetOutputWidget(); 
413     if (w)
414         {      
415                 w->UpdateView();
416     }
417     bbSetOutputOut( bbGetInputSlice() );  
418   }
419   
420
421
422
423         //--------------------------------------------------------------------------
424   void Viewer2D::CreateWidget(wxWindow* parent)
425   {
426     Viewer2DWidget* w = new Viewer2DWidget(this,parent);
427     w->UpdateView();
428     bbSetOutputWidget(w);
429     bbSetOutputRenderer( ((Viewer2DWidget*)bbGetOutputWidget())->GetRenderer() );
430   }
431
432
433
434 }//namespace bbtk
435
436 #endif
437 #endif
438