]> Creatis software - bbtk.git/blob - packages/wxvtk/src/bbwxvtkViewer2D.cxx
3e284eb9a4f40961eeac7b82b57273cf2edaf5e7
[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/12/11 09:50:38 $
7   Version:   $Revision: 1.31 $
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   
43
44
45   //--------------------------------------------------------------------------
46   class Viewer2DWidget : public wxPanel
47   {
48   public:
49     Viewer2DWidget(Viewer2D* box, wxWindow *parent);
50     ~Viewer2DWidget();
51     void UpdateView();
52     vtkRenderer         *GetRenderer();
53   private:
54     bool                        mFirstTime;
55     Viewer2D                    *mBox;
56     wxvtkImageViewer2           *imageViewer;
57     vtkImageData                *backImageData;
58     vtkImageData                *mDefaultImage;
59     wxVTKRenderWindowInteractor *wxvtkrenderwindowinteractor;
60     bool mUpdateCamera;
61
62     vtkImplicitPlaneWidget * maPlane1, * maPlane2, * mbPlane1, * mbPlane2;
63   };
64   
65   Viewer2DWidget::Viewer2DWidget(Viewer2D* box,
66                                  wxWindow *parent)
67     :  
68     wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL),
69     mFirstTime(true),
70     mBox(box)
71   {
72     wxPanel *panel      = this;
73
74     wxvtkrenderwindowinteractor = new wxVTKRenderWindowInteractor(panel,-1);
75     wxvtkrenderwindowinteractor->UseCaptureMouseOn();   
76
77     imageViewer = wxvtkImageViewer2::New();
78     imageViewer->SetSlice( 1 );
79     imageViewer->SetupInteractor ( wxvtkrenderwindowinteractor );
80     
81     mDefaultImage = vtkImageData::New();
82     int dim[3];
83     dim[0] = dim[1] = 32 ; 
84     dim[2] = 2; 
85     mDefaultImage->SetDimensions ( dim );
86     mDefaultImage->SetSpacing(1,1,1);
87     mDefaultImage->SetExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1);
88     mDefaultImage->SetWholeExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1);
89
90     mDefaultImage->SetScalarTypeToUnsignedChar();
91     mDefaultImage->AllocateScalars();    
92     for (int i=0;i<dim[0];i++) 
93       for (int j=0;j<dim[1];j++) 
94         for (int k=0;k<dim[2];k++) 
95         mDefaultImage->SetScalarComponentFromFloat(i,j,k,0,0);
96
97     for (int i=0;i<dim[0];i++) 
98         {
99           mDefaultImage->SetScalarComponentFromFloat(dim[0]-i-1,i,0,0,255);
100           mDefaultImage->SetScalarComponentFromFloat(i,i,1,0,255);
101         }
102
103     backImageData = mDefaultImage;
104     imageViewer->SetInput( backImageData );
105     mUpdateCamera = true;
106
107     wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
108     sizer-> Add( wxvtkrenderwindowinteractor , 1, wxEXPAND, 0);
109     panel-> SetSizer(sizer);
110     panel-> SetAutoLayout(true);
111     panel-> Layout();
112
113
114     //  wxvtkrenderwindowinteractor->Refresh();
115     //  wxvtkrenderwindowinteractor->Render();
116     //  imageViewer->GetRenderer()->ResetCameraClippingRange();
117
118     imageViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);
119
120   }
121   //-------------------------------------------------------------------------
122   
123   Viewer2DWidget::~Viewer2DWidget()
124   {
125     //    delete wxvtkrenderwindowinteractor;
126     // pourquoi pas wxvtkrenderwindowinteractor->Delete(); // JP
127     // LG : because it has been allocated with operator new not method ::New 
128     // we want to force its destruction without taking care of vtk ref counting
129     // on the contrary the following vtk objects are deleted with vtk Delete
130     //    std::cout << "Viewer2DWidget::~Viewer2DWidget()" << std::endl;
131     mDefaultImage->Delete();
132
133     if (backImageData)
134       {
135         //      backImageData->UnRegister(NULL);
136       }
137     if (imageViewer) 
138       {
139         imageViewer->Delete();
140       }
141     delete wxvtkrenderwindowinteractor;
142     //    std::cout << "Viewer2DWidget::~Viewer2DWidget() OK" << std::endl;
143   }
144   
145   //-------------------------------------------------------------------------
146   
147
148
149
150   void Viewer2DWidget::UpdateView()
151   {
152     //    std::cout << "Viewer2DWidget::UpdateView() " << std::endl;
153     //   std::cout << "slice="<<mBox->bbGetInputSlice()<<std::endl;
154     
155     
156     if ( ( mBox->bbGetInputIn() == NULL ) &&
157          ( backImageData != mDefaultImage ) )
158       {
159         // 
160         //      std::cout << "** Viewer2DWidget::UpdateView() : NULL Input (reset)"               <<std::endl;
161         backImageData = mDefaultImage;
162         mUpdateCamera = true;
163
164       }
165     else if ( ( mBox->bbGetInputIn() != NULL ) && 
166               (( mBox->bbGetInputStatus("In") != bbtk::UPTODATE  ) ||
167                ( mFirstTime))
168               )
169               //(backImageData != mBox->bbGetInputIn()) ) 
170       {
171         
172         //      std::cout << "** Viewer2DWidget::UpdateView() : Input changed"                    <<std::endl;
173         mFirstTime = false;
174         backImageData = mBox->bbGetInputIn();
175         backImageData->Update();
176         imageViewer->SetInput( backImageData );
177         mUpdateCamera = true;
178       }
179
180     if (mUpdateCamera)
181       {
182         //      std::cout << "** Viewer2DWidget::UpdateView() : Update Camera"
183         //                <<std::endl;
184         int x1,x2,y1,y2,z1,z2;
185         double spx,spy,spz;
186         backImageData->GetSpacing(spx,spy,spz);
187         backImageData->GetExtent (x1,x2,y1,y2,z1,z2);
188         
189         double *range = backImageData->GetScalarRange();
190         imageViewer->SetColorWindow(range[1] - range[0]);
191         imageViewer->SetColorLevel(0.5 * (range[1] + range[0]));
192
193         imageViewer->GetRenderer()->ResetCamera();
194         double bounds[6];
195         imageViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
196         imageViewer->GetRenderer()->ResetCameraClippingRange(bounds);
197         
198         //      bbtkMessage("Output",2,"Viewer2D '"<<mBox->bbGetName()<<"' - Image :"<<std::endl);
199         //      std::cout << " extent  = "<< x1<<"-"<<x2<<" x "<<y1<<"-"<<y2<<" x "<<z1<<"-"<<z2<<std::endl;
200         //      std::cout << " spacing = "<<spx << " - "<< spy << " - "<<spz<<std::endl;
201         /*
202         vtkCamera *camera = imageViewer->GetRenderer()->GetActiveCamera();
203
204         camera->SetViewUp    ( spx*0,         -spy*1,        spz*0 );
205         camera->SetPosition  ( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000 ); 
206         camera->SetFocalPoint( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*0 ); 
207
208         camera->ComputeViewPlaneNormal();
209         camera->SetParallelScale(  spx*(x2-x1)/2.0 );
210         //   
211         //      imageViewer->GetRenderer()->ResetCamera(x1,x2,y1,y2,z1,z2);
212         mUpdateCamera = false;
213         //      std::cout << "Viewer2DWidget::UpdateView() passe par 3" << std::endl;
214         imageViewer->SetColorWindow(512);
215         imageViewer->SetColorLevel(256);
216         */
217          /*
218         for (int i=0;i<10;i++)
219           for (int j=0;j<10;j++)
220             std::cout << mBox->bbGetInputIn()->GetScalarComponentAsFloat(i,j,0,0)
221                       << std::endl;
222          */
223     }
224   
225     //  std::cout << "OW = "<< mBox->bbGetWindow() << std::endl;
226     //  std::cout << "CW = "<< mBox->bbGetContainingWindow() << std::endl;
227     //  std::cout << "Sh = "<< mBox->bbIsShown() << std::endl;
228     
229     int orientation = mBox->bbGetInputOrientation();
230     if (orientation<0 || orientation>2) {
231       bbtkMessage("Output", 2, "Viewer2D : Orientation was not 0< <2 "<<std::endl);
232        orientation=2; // Why not?      
233     }
234     // mBox->bbIsShown() is necessary to be sure that the wxWindow is already 
235     // created and displayed. 
236     // Else when slice != 0 we get an X Window System error with wxGTK
237     if (
238         (backImageData!=NULL)&&
239         (mBox->bbIsShown()))
240     {
241                 int z = mBox->bbGetInputSlice();
242                 //      std::cout << "slice = "<<z<<std::endl;
243                 int ext[6];
244                 backImageData->GetWholeExtent(ext);
245                 /*
246                 std::cout << "ext = "<<ext[0]<<" - "<<ext[1]<<" ; "
247                           <<ext[2]<<" - "<<ext[3]<<" ; "
248                           <<ext[4]<<" - "<<ext[5]
249                           <<std::endl;
250                 */
251             switch(orientation){
252                case 0:
253                 if (z<ext[0]) { z=ext[0]; }
254                 if (z>ext[1]) { z=ext[1]; }
255                  
256                 break;
257                                    
258                case 1:
259                 if (z<ext[2]) { z=ext[2]; }
260                 if (z>ext[3]) { z=ext[3]; }
261                 break;
262                                                     
263                case 2:
264                 if (z<ext[4]) { z=ext[4]; }
265                 if (z>ext[5]) { z=ext[5]; }
266                 break;
267                 
268               default:
269                 bbtkMessage("Output", 2, "Viewer2D : Orientation was not 0< <2 (shouldn't arrive here!"<<std::endl);
270                 z = ext[5]; // Why not?
271            }
272             wxvtkrenderwindowinteractor->Refresh();
273             wxvtkrenderwindowinteractor->Render();
274             bbtkDebugMessage("Output",3,"Viewer2D : slice = "<<z<<std::endl);
275             imageViewer->SetSliceOrientation (orientation);
276             imageViewer->SetSlice( z );
277
278     } 
279     
280     
281   }
282
283
284   vtkRenderer * Viewer2DWidget::GetRenderer()
285   {
286           return imageViewer->GetRenderer();
287   }
288
289
290
291   //--------------------------------------------------------------------------
292   //-------------------------------------------------------------------------
293   //--------------------------------------------------------------------------
294   //--------------------------------------------------------------------------
295
296
297   BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D);
298   BBTK_BLACK_BOX_IMPLEMENTATION(Viewer2D,bbtk::WxBlackBox);
299
300
301   void Viewer2D::Process() 
302   { 
303     //    std::cout << "Viewer2D::Process" << std::endl;
304     //    std::cout << "In="<<bbtk::GetIOStatusString(bbGetInputStatus("In")) << std::endl;
305     //    std::cout << "Slice="<<bbtk::GetIOStatusString(bbGetInputStatus("Slice")) << std::endl;
306     Viewer2DWidget* w = (Viewer2DWidget*)bbGetOutputWidget(); 
307     if (w)
308       {      
309         w->UpdateView();
310       }
311     bbSetOutputOut( bbGetInputSlice() );
312     
313   }
314   
315
316   void Viewer2D::bbUserConstructor()
317   {
318     bbSetInputIn(NULL);
319     bbSetInputSlice(0);
320     bbSetOutputWidget(0);
321     bbSetOutputRenderer(0);
322     bbSetInputOrientation(2);
323   }
324
325
326   void Viewer2D::CreateWidget(wxWindow* parent)
327   {
328     Viewer2DWidget* w = new Viewer2DWidget(this,parent);
329     w->UpdateView();
330     bbSetOutputWidget(w);
331     bbSetOutputRenderer( ((Viewer2DWidget*)bbGetOutputWidget())->GetRenderer() );
332
333   }
334
335
336
337 }//namespace bbtk
338
339 #endif
340