]> 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/19 09:46:49 $
7   Version:   $Revision: 1.9 $
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 #include <vtkInteractorStyleImage.h>
35 #include <vtkCommand.h>
36
37
38
39 namespace bbwxvtk
40 {
41
42   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D);
43   
44
45   Viewer2DWidget::Viewer2DWidget(Viewer2D* box,
46                                  wxWindow *parent)
47     :  
48     wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
49     mBox(box)
50   {
51     wxPanel *panel      = this;
52
53     wxvtkrenderwindowinteractor = new wxVTKRenderWindowInteractor(panel,-1);
54     wxvtkrenderwindowinteractor->UseCaptureMouseOn();   
55
56     imageViewer = vtkImageViewer2::New();
57         imageViewer->SetSlice( 1 );
58     imageViewer->SetupInteractor ( wxvtkrenderwindowinteractor );
59     
60     mDefaultImage = vtkImageData::New();
61     int dim[3];
62     dim[0] = dim[1] = 32 ; 
63         dim[2] = 2; 
64     mDefaultImage->SetDimensions ( dim );
65     mDefaultImage->SetSpacing(1,1,1);
66     mDefaultImage->SetExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1);
67     mDefaultImage->SetWholeExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1);
68
69     mDefaultImage->SetScalarTypeToUnsignedChar();
70     mDefaultImage->AllocateScalars();    
71     for (int i=0;i<dim[0];i++) 
72       for (int j=0;j<dim[1];j++) 
73         for (int k=0;k<dim[2];k++) 
74         mDefaultImage->SetScalarComponentFromFloat(i,j,k,0,0);
75
76     for (int i=0;i<dim[0];i++) 
77         {
78           mDefaultImage->SetScalarComponentFromFloat(dim[0]-i-1,i,0,0,255);
79           mDefaultImage->SetScalarComponentFromFloat(i,i,1,0,255);
80         }
81
82     backImageData = mDefaultImage;
83     imageViewer->SetInput( backImageData );
84     mUpdateCamera = true;
85
86     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
87     sizer       -> Add( wxvtkrenderwindowinteractor , 1, wxEXPAND, 0);
88     panel       -> SetSizer(sizer);
89     panel       -> SetAutoLayout(true);
90     panel       -> Layout();
91     
92   }
93   //-------------------------------------------------------------------------
94   
95   Viewer2DWidget::~Viewer2DWidget()
96   {
97     //    delete wxvtkrenderwindowinteractor;
98     // pourquoi pas wxvtkrenderwindowinteractor->Delete(); // JP
99     // LG : because it has been allocated with operator new not method ::New 
100     // we want to force its destruction without taking care of vtk ref counting
101     // on the contrary the following vtk objects are deleted with vtk Delete
102     //    std::cout << "Viewer2DWidget::~Viewer2DWidget()" << std::endl;
103     mDefaultImage->Delete();
104
105     if (backImageData)
106       {
107         //      backImageData->UnRegister(NULL);
108       }
109     if (imageViewer) 
110       {
111         imageViewer->Delete();
112       }
113     delete wxvtkrenderwindowinteractor;
114     //    std::cout << "Viewer2DWidget::~Viewer2DWidget() OK" << std::endl;
115   }
116   
117   //-------------------------------------------------------------------------
118   
119
120
121
122   void Viewer2DWidget::UpdateView()
123   {
124     //    std::cout << "Viewer2DWidget::UpdateView() "<<mBox->bbGetFullName() << std::endl;
125     //   std::cout << "slice="<<mBox->bbGetInputSlice()<<std::endl;
126
127
128     if ( ( mBox->bbGetInputIn() == NULL ) &&
129          ( backImageData != mDefaultImage ) )
130       {
131         backImageData = mDefaultImage;
132         mUpdateCamera = true;
133       }
134     else if ( ( mBox->bbGetInputIn() != NULL ) && 
135               (backImageData != mBox->bbGetInputIn()) ) 
136       {
137         backImageData = mBox->bbGetInputIn();
138         backImageData->Update();
139         imageViewer->SetInput( backImageData );
140         mUpdateCamera = true;
141       }
142
143     if (mUpdateCamera)
144       {
145         int x1,x2,y1,y2,z1,z2;
146         double spx,spy,spz;
147         backImageData->GetSpacing(spx,spy,spz);
148         backImageData->GetExtent (x1,x2,y1,y2,z1,z2);
149         
150         //      bbtkMessage("Output",2,"Viewer2D '"<<mBox->bbGetName()<<"' - Image :"<<std::endl);
151         //      std::cout << " extent  = "<< x1<<"-"<<x2<<" x "<<y1<<"-"<<y2<<" x "<<z1<<"-"<<z2<<std::endl;
152         //      std::cout << " spacing = "<<spx << " - "<< spy << " - "<<spz<<std::endl;
153         
154         vtkCamera *camera = imageViewer->GetRenderer()->GetActiveCamera();
155
156         camera->SetViewUp ( spx*0, -spy*1, spz*0 );
157         camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000 ); 
158         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0 ); 
159
160         camera->ComputeViewPlaneNormal();
161         camera->SetParallelScale(  spx*(x2-x1)/2.0 );
162         //   
163         //      imageViewer->GetRenderer()->ResetCamera(x1,x2,y1,y2,z1,z2);
164         mUpdateCamera = false;
165       }
166   
167     //  std::cout << "OW = "<< mBox->bbGetWindow() << std::endl;
168     //    std::cout << "CW = "<< mBox->bbGetContainingWindow() << std::endl;
169     //    std::cout << "Sh = "<< mBox->bbIsShown() << std::endl;
170     
171
172
173     // mBox->bbIsShown() is necessary to be sure that the wxWindow is already 
174     // created and displayed. 
175     // Else when slice != 0 we get an X Window System error with wxGTK
176     if (
177         (backImageData!=NULL)&&
178         (mBox->bbIsShown()))
179     {
180         int z = mBox->bbGetInputSlice();
181         //      std::cout << "slice = "<<z<<std::endl;
182         int ext[6];
183         backImageData->GetWholeExtent(ext);
184
185         //      std::cout << "ext = "<<ext[4]<<" - "<<ext[5]<<std::endl;
186
187         if (z<ext[4]) { z=ext[4]; }
188         if (z>ext[5]) { z=ext[5]; }
189
190
191 #if (VTK_MAJOR_VERSION >= 5)
192         imageViewer->SetSlice( z );
193 #else
194         imageViewer->SetZSlice( z );
195 #endif
196
197         //imageViewer->UpdateDisplayExtent();
198    //wxvtkrenderwindowinteractor->Render();
199     imageViewer->GetRenderer()->ResetCameraClippingRange();
200   }
201
202
203
204 }
205
206
207   vtkRenderer * Viewer2DWidget::GetRenderer()
208   {
209           return imageViewer->GetRenderer();
210   }
211
212
213
214   //--------------------------------------------------------------------------
215   //-------------------------------------------------------------------------
216   //--------------------------------------------------------------------------
217   //--------------------------------------------------------------------------
218
219
220
221
222   BBTK_BLACK_BOX_IMPLEMENTATION(Viewer2D,bbtk::WxBlackBox);
223
224
225   void Viewer2D::Process() 
226   { 
227     // LG : Bug on Linux (wxGTK) when initial slice != 0 on first time 
228     // (see wxvtk/appli/ExampleSimpleSlicer)
229     // I think there is a problem with rendering before window 
230     // has been reparented ... we have to check this 
231
232     ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView();
233     bbSetOutputOut( bbGetInputSlice() );
234         bbSetOutputRenderer( ((Viewer2DWidget*)bbGetOutputWidget())->GetRenderer() );
235         
236   }
237   
238
239   void Viewer2D::bbUserConstructor()
240   {
241     bbSetInputIn(NULL);
242     bbSetInputSlice(0);
243   }
244
245   /**
246    * \brief  Create wxWidget . 
247    *
248    *
249    */ 
250   void Viewer2D::CreateWidget()
251   {
252     bbtkDebugMessageInc("Core",9,"Viewer2D::CreateWidget()"<<std::endl);
253
254     Viewer2DWidget* w = new Viewer2DWidget(this,bbGetWxParent());
255     bbSetOutputWidget(w);
256
257     bbtkDebugDecTab("Core",9);
258   }
259
260
261   // This callback is necessary to get actual processing of the view 
262   // when window is shown
263   void  Viewer2D::bbUserOnShow()
264   {
265     ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView();
266   }
267   
268
269 }//namespace bbtk
270
271 #endif
272