]> Creatis software - bbtk.git/blob - packages/wxvtk/src/bbwxvtkViewer2D.cxx
* Major changes on IOStatus update / propagation
[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/08 12:56:03 $
7   Version:   $Revision: 1.28 $
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 = wxvtkImageViewer2::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     //  wxvtkrenderwindowinteractor->Refresh();
94     //  wxvtkrenderwindowinteractor->Render();
95     //  imageViewer->GetRenderer()->ResetCameraClippingRange();
96
97     imageViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);
98
99   }
100   //-------------------------------------------------------------------------
101   
102   Viewer2DWidget::~Viewer2DWidget()
103   {
104     //    delete wxvtkrenderwindowinteractor;
105     // pourquoi pas wxvtkrenderwindowinteractor->Delete(); // JP
106     // LG : because it has been allocated with operator new not method ::New 
107     // we want to force its destruction without taking care of vtk ref counting
108     // on the contrary the following vtk objects are deleted with vtk Delete
109     //    std::cout << "Viewer2DWidget::~Viewer2DWidget()" << std::endl;
110     mDefaultImage->Delete();
111
112     if (backImageData)
113       {
114         //      backImageData->UnRegister(NULL);
115       }
116     if (imageViewer) 
117       {
118         imageViewer->Delete();
119       }
120     delete wxvtkrenderwindowinteractor;
121     //    std::cout << "Viewer2DWidget::~Viewer2DWidget() OK" << std::endl;
122   }
123   
124   //-------------------------------------------------------------------------
125   
126
127
128
129   void Viewer2DWidget::UpdateView()
130   {
131     //    std::cout << "Viewer2DWidget::UpdateView() "<<mBox->bbGetFullName() << std::endl;
132     //   std::cout << "slice="<<mBox->bbGetInputSlice()<<std::endl;
133     
134     std::cout << "--- Testing status of input connection 'In'" << std::endl;
135     bbtk::BlackBoxInputConnector* c =  mBox->bbGetInputConnectorMap().find("In")->second ;
136     if (c->GetStatus()==bbtk::MODIFIED) 
137       {
138         std::cout << "===> MODIFIED"<<std::endl;
139       }
140     else if (c->GetStatus()==bbtk::UPTODATE) 
141       {
142         std::cout << "===> UPTODATE"<<std::endl;
143       }
144
145
146
147
148     if ( ( mBox->bbGetInputIn() == NULL ) &&
149          ( backImageData != mDefaultImage ) )
150       {
151         // 
152         std::cout << "** Viewer2DWidget::UpdateView() : NULL Input (reset)"
153                   <<std::endl;
154         backImageData = mDefaultImage;
155         mUpdateCamera = true;
156
157       }
158     else if ( ( mBox->bbGetInputIn() != NULL ) && 
159               //      (true) ) //
160               (backImageData != mBox->bbGetInputIn()) ) 
161       {
162         std::cout << "** Viewer2DWidget::UpdateView() : Input changed"
163                   <<std::endl;
164         backImageData = mBox->bbGetInputIn();
165         backImageData->Update();
166         imageViewer->SetInput( backImageData );
167         mUpdateCamera = true;
168       }
169
170     if (mUpdateCamera)
171       {
172         std::cout << "** Viewer2DWidget::UpdateView() : Update Camera"
173                   <<std::endl;
174         int x1,x2,y1,y2,z1,z2;
175         double spx,spy,spz;
176         backImageData->GetSpacing(spx,spy,spz);
177         backImageData->GetExtent (x1,x2,y1,y2,z1,z2);
178         
179         double *range = backImageData->GetScalarRange();
180         imageViewer->SetColorWindow(range[1] - range[0]);
181         imageViewer->SetColorLevel(0.5 * (range[1] + range[0]));
182
183         imageViewer->GetRenderer()->ResetCamera();
184         double bounds[6];
185         imageViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
186         imageViewer->GetRenderer()->ResetCameraClippingRange(bounds);
187         
188         //      bbtkMessage("Output",2,"Viewer2D '"<<mBox->bbGetName()<<"' - Image :"<<std::endl);
189         //      std::cout << " extent  = "<< x1<<"-"<<x2<<" x "<<y1<<"-"<<y2<<" x "<<z1<<"-"<<z2<<std::endl;
190         //      std::cout << " spacing = "<<spx << " - "<< spy << " - "<<spz<<std::endl;
191         /*
192         vtkCamera *camera = imageViewer->GetRenderer()->GetActiveCamera();
193
194         camera->SetViewUp    ( spx*0,         -spy*1,        spz*0 );
195         camera->SetPosition  ( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000 ); 
196         camera->SetFocalPoint( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*0 ); 
197
198         camera->ComputeViewPlaneNormal();
199         camera->SetParallelScale(  spx*(x2-x1)/2.0 );
200         //   
201         //      imageViewer->GetRenderer()->ResetCamera(x1,x2,y1,y2,z1,z2);
202         mUpdateCamera = false;
203         //      std::cout << "Viewer2DWidget::UpdateView() passe par 3" << std::endl;
204         imageViewer->SetColorWindow(512);
205         imageViewer->SetColorLevel(256);
206         */
207          /*
208         for (int i=0;i<10;i++)
209           for (int j=0;j<10;j++)
210             std::cout << mBox->bbGetInputIn()->GetScalarComponentAsFloat(i,j,0,0)
211                       << std::endl;
212          */
213     }
214   
215     //  std::cout << "OW = "<< mBox->bbGetWindow() << std::endl;
216     //  std::cout << "CW = "<< mBox->bbGetContainingWindow() << std::endl;
217     //  std::cout << "Sh = "<< mBox->bbIsShown() << std::endl;
218     
219     int orientation = mBox->bbGetInputOrientation();
220     if (orientation<0 || orientation>2) {
221       bbtkMessage("Output", 2, "Viewer2D : Orientation was not 0< <2 "<<std::endl);
222        orientation=2; // Why not?      
223     }
224     // mBox->bbIsShown() is necessary to be sure that the wxWindow is already 
225     // created and displayed. 
226     // Else when slice != 0 we get an X Window System error with wxGTK
227     if (
228         (backImageData!=NULL)&&
229         (mBox->bbIsShown()))
230     {
231                 int z = mBox->bbGetInputSlice();
232                 //      std::cout << "slice = "<<z<<std::endl;
233                 int ext[6];
234                 backImageData->GetWholeExtent(ext);
235                 /*
236                 std::cout << "ext = "<<ext[0]<<" - "<<ext[1]<<" ; "
237                           <<ext[2]<<" - "<<ext[3]<<" ; "
238                           <<ext[4]<<" - "<<ext[5]
239                           <<std::endl;
240                 */
241             switch(orientation){
242                case 0:
243                 if (z<ext[0]) { z=ext[0]; }
244                 if (z>ext[1]) { z=ext[1]; }
245                  
246                 break;
247                                    
248                case 1:
249                 if (z<ext[2]) { z=ext[2]; }
250                 if (z>ext[3]) { z=ext[3]; }
251                 break;
252                                                     
253                case 2:
254                 if (z<ext[4]) { z=ext[4]; }
255                 if (z>ext[5]) { z=ext[5]; }
256                 break;
257                 
258               default:
259                 bbtkMessage("Output", 2, "Viewer2D : Orientation was not 0< <2 (shouldn't arrive here!"<<std::endl);
260                 z = ext[5]; // Why not?
261            }
262             wxvtkrenderwindowinteractor->Refresh();
263             wxvtkrenderwindowinteractor->Render();
264             bbtkDebugMessage("Output",3,"Viewer2D : slice = "<<z<<std::endl);
265             imageViewer->SetSliceOrientation (orientation);
266             imageViewer->SetSlice( z );
267
268     } 
269     
270     
271   }
272
273
274   vtkRenderer * Viewer2DWidget::GetRenderer()
275   {
276           return imageViewer->GetRenderer();
277   }
278
279
280
281   //--------------------------------------------------------------------------
282   //-------------------------------------------------------------------------
283   //--------------------------------------------------------------------------
284   //--------------------------------------------------------------------------
285
286
287
288
289   BBTK_BLACK_BOX_IMPLEMENTATION(Viewer2D,bbtk::WxBlackBox);
290
291
292   void Viewer2D::Process() 
293   { 
294     Viewer2DWidget* w = (Viewer2DWidget*)bbGetOutputWidget(); 
295     if (w)
296       {
297         w->UpdateView();
298         bbSetOutputRenderer( ((Viewer2DWidget*)bbGetOutputWidget())->GetRenderer() );
299       }
300     bbSetOutputOut( bbGetInputSlice() );
301     
302   }
303   
304
305   void Viewer2D::bbUserConstructor()
306   {
307     bbSetInputIn(NULL);
308     bbSetInputSlice(0);
309     bbSetOutputWidget(0);
310     bbSetInputOrientation(2);
311   }
312
313   /**
314    * \brief  Create wxWidget . 
315    *
316    *
317    */ 
318   void Viewer2D::CreateWidget(wxWindow* parent)
319   {
320     Viewer2DWidget* w = new Viewer2DWidget(this,parent);//bbGetWxParent());
321     bbSetOutputWidget(w);
322   }
323
324
325   // This callback is *no more*
326   // necessary to get actual processing of the view 
327   // when window is shown
328   void  Viewer2D::OnShowWidget()
329   {
330     // ((Viewer2DWidget*)bbGetOutputWidget())->Update();
331     // ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView();
332   }
333   
334
335 }//namespace bbtk
336
337 #endif
338