]> Creatis software - bbtk.git/blob - packages/wxvtk/src/bbwxvtkViewer2D.cxx
*** empty log message ***
[bbtk.git] / packages / wxvtk / src / bbwxvtkViewer2D.cxx
1 /*=========================================================================
2                                                                                 
3   Program:   bbtk
4   Module:    $RCSfile: bbwxvtkViewer2D.cxx,v $
5   Language:  C++
6   Date:      $Date: 2008/06/17 11:12:03 $
7   Version:   $Revision: 1.8 $
8                                                                                 
9   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10   l'Image). All rights reserved. See Doc/License.txt or
11   http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details.
12                                                                                 
13      This software is distributed WITHOUT ANY WARRANTY; without even
14      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15      PURPOSE.  See the above copyright notices for more information.
16                                                                                 
17 =========================================================================*/
18 /**
19  *  \file 
20  *  \brief 
21  */
22
23
24 #ifdef _USE_WXWIDGETS_
25
26
27 #include "bbwxvtkViewer2D.h"
28 #include "bbwxvtkPackage.h"
29 //#include <wx/dialog.h>
30
31 #include "vtkInteractorStyleImage.h"
32 #include "vtkCamera.h"
33 #include "vtkRenderer.h"
34
35
36
37
38 namespace bbwxvtk
39 {
40
41   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D);
42   
43
44   Viewer2DWidget::Viewer2DWidget(Viewer2D* box,
45                                  wxWindow *parent)
46     :  
47     wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
48     mBox(box)
49   {
50     wxPanel *panel      = this;
51
52     wxvtkrenderwindowinteractor = new wxVTKRenderWindowInteractor(panel,-1);
53     wxvtkrenderwindowinteractor->UseCaptureMouseOn();   
54
55     imageViewer = vtkImageViewer2::New();
56     imageViewer->SetupInteractor ( wxvtkrenderwindowinteractor );
57     
58     mDefaultImage = vtkImageData::New();
59     int dim[3];
60     dim[0] = dim[1] = dim[2] = 1; 
61     mDefaultImage->SetDimensions ( dim );
62     mDefaultImage->SetSpacing(1,1,1);
63
64     mDefaultImage->SetScalarTypeToUnsignedChar();
65     mDefaultImage->AllocateScalars();    
66     for (int i=0;i<dim[0];i++) 
67       for (int j=0;j<dim[1];j++) 
68         mDefaultImage->SetScalarComponentFromFloat(i,j,0,0,0);
69
70     backImageData = mDefaultImage;
71     imageViewer->SetInput( backImageData );
72     mUpdateCamera = true;
73
74     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
75     sizer       -> Add( wxvtkrenderwindowinteractor , 1, wxEXPAND, 0);
76     panel       -> SetSizer(sizer);
77     panel       -> SetAutoLayout(true);
78     panel       -> Layout();
79     
80   }
81   //-------------------------------------------------------------------------
82   
83   Viewer2DWidget::~Viewer2DWidget()
84   {
85     //    delete wxvtkrenderwindowinteractor;
86     // pourquoi pas wxvtkrenderwindowinteractor->Delete(); // JP
87     // LG : because it has been allocated with operator new not method ::New 
88     // we want to force its destruction without taking care of vtk ref counting
89     // on the contrary the following vtk objects are deleted with vtk Delete
90     //    std::cout << "Viewer2DWidget::~Viewer2DWidget()" << std::endl;
91     mDefaultImage->Delete();
92
93     if (backImageData)
94       {
95         //      backImageData->UnRegister(NULL);
96       }
97     if (imageViewer) 
98       {
99         imageViewer->Delete();
100       }
101     delete wxvtkrenderwindowinteractor;
102     //    std::cout << "Viewer2DWidget::~Viewer2DWidget() OK" << std::endl;
103   }
104   
105   //-------------------------------------------------------------------------
106   
107
108
109
110   void Viewer2DWidget::UpdateView()
111   {
112     //    std::cout << "Viewer2DWidget::UpdateView() "<<mBox->bbGetFullName() << std::endl;
113     //   std::cout << "slice="<<mBox->bbGetInputSlice()<<std::endl;
114
115     if ( ( mBox->bbGetInputIn() == NULL ) &&
116          ( backImageData != mDefaultImage ) )
117       {
118         backImageData = mDefaultImage;
119         mUpdateCamera = true;
120       }
121     else if ( ( mBox->bbGetInputIn() != NULL ) && 
122               (backImageData != mBox->bbGetInputIn()) ) 
123       {
124         backImageData = mBox->bbGetInputIn();
125         backImageData->Update();
126         imageViewer->SetInput( backImageData );
127         mUpdateCamera = true;
128       }
129
130     if (mUpdateCamera)
131       {
132         int x1,x2,y1,y2,z1,z2;
133         double spx,spy,spz;
134         backImageData->GetSpacing(spx,spy,spz);
135         backImageData->GetExtent (x1,x2,y1,y2,z1,z2);
136         
137         //      bbtkMessage("Output",2,"Viewer2D '"<<mBox->bbGetName()<<"' - Image :"<<std::endl);
138         //      std::cout << " extent  = "<< x1<<"-"<<x2<<" x "<<y1<<"-"<<y2<<" x "<<z1<<"-"<<z2<<std::endl;
139         //      std::cout << " spacing = "<<spx << " - "<< spy << " - "<<spz<<std::endl;
140         
141         vtkCamera *camera = imageViewer->GetRenderer()->GetActiveCamera();
142
143         camera->SetViewUp ( spx*0, -spy*1, spz*0);
144         camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000); 
145         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0); 
146
147         camera->ComputeViewPlaneNormal();
148         camera->SetParallelScale(  spx*(x2-x1)/2.0 );
149         //   
150         //      imageViewer->GetRenderer()->ResetCamera(x1,x2,y1,y2,z1,z2);
151         mUpdateCamera = false;
152       }
153   
154     //  std::cout << "OW = "<< mBox->bbGetWindow() << std::endl;
155     //    std::cout << "CW = "<< mBox->bbGetContainingWindow() << std::endl;
156     //    std::cout << "Sh = "<< mBox->bbIsShown() << std::endl;
157     
158     // mBox->bbIsShown() is necessary to be sure that the wxWindow is already 
159     // created and displayed. 
160     // Else when slice != 0 we get an X Window System error with wxGTK
161     if (
162         (backImageData!=NULL)&&
163         (mBox->bbIsShown()))
164       {
165         int z = mBox->bbGetInputSlice();
166         //      std::cout << "slice = "<<z<<std::endl;
167         int ext[6];
168         backImageData->GetWholeExtent(ext);
169
170         //      std::cout << "ext = "<<ext[4]<<" - "<<ext[5]<<std::endl;
171
172         if (z<ext[4]) { z=ext[4]; }
173         if (z>=ext[5]) { z=ext[5]-1; }
174
175
176 #if (VTK_MAJOR_VERSION >= 5)
177         imageViewer->SetSlice( z );
178 #else
179         imageViewer->SetZSlice( z );
180 #endif
181         wxvtkrenderwindowinteractor->Render();
182
183       }
184
185     
186
187   }
188
189
190
191
192   //--------------------------------------------------------------------------
193   //-------------------------------------------------------------------------
194   //--------------------------------------------------------------------------
195   //--------------------------------------------------------------------------
196
197
198
199
200   BBTK_BLACK_BOX_IMPLEMENTATION(Viewer2D,bbtk::WxBlackBox);
201
202
203   void Viewer2D::Process() 
204   { 
205     // LG : Bug on Linux (wxGTK) when initial slice != 0 on first time 
206     // (see wxvtk/appli/ExampleSimpleSlicer)
207     // I think there is a problem with rendering before window 
208     // has been reparented ... we have to check this 
209
210     ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView();
211     bbSetOutputOut( bbGetInputSlice() );
212   }
213   
214
215   void Viewer2D::bbUserConstructor()
216   {
217     bbSetInputIn(0);
218   }
219
220   /**
221    * \brief  Create wxWidget . 
222    *
223    *
224    */ 
225   void Viewer2D::CreateWidget()
226   {
227     bbtkDebugMessageInc("Core",9,"Viewer2D::CreateWidget()"<<std::endl);
228
229     Viewer2DWidget* w = new Viewer2DWidget(this,bbGetWxParent());
230     bbSetOutputWidget(w);
231
232     bbtkDebugDecTab("Core",9);
233   }
234
235
236   // This callback is necessary to get actual processing of the view 
237   // when window is shown
238   void  Viewer2D::bbUserOnShow()
239   {
240     ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView();
241   }
242   
243
244 }//namespace bbtk
245
246 #endif
247