]> Creatis software - creaImageIO.git/blob - src2/creaImageIOWxViewer.cpp
f8ae7b917f26ea326f15948c1afc39dedcb7dad7
[creaImageIO.git] / src2 / creaImageIOWxViewer.cpp
1
2 #include <creaImageIOWxViewer.h>
3 #include <creaImageIOSystem.h>
4 #include <fstream>
5 #include <vtkCamera.h>
6 #include <vtkRenderer.h>
7 #include <vtkImageData.h>
8
9 #include <creaMessageManager.h>
10 #include <stdio.h>
11 #include <time.h>
12
13
14 using namespace crea;
15
16 namespace creaImageIO
17 {
18
19   //=====================================================================
20
21   //=====================================================================
22   class ThreadedMovie: public wxThread
23   {
24   public:
25     ThreadedMovie(std::vector<vtkImageData*> m, vtkImageViewer2* v, crea::creawxVTKRenderWindowInteractor* i, WxViewer* parent) :
26       mImagesToPlay(m), mViewer(v), mInteractor(i), mParent(parent)
27     {}
28
29     void* Entry();
30     void SetImagesToPlay(std::vector<vtkImageData*> im);
31     void ShowImage(vtkImageData* v);
32         void StartIterator();
33     void  OnExit();
34
35   private:
36           std::vector<vtkImageData*> mImagesToPlay;
37           vtkImageViewer2* mViewer;
38           /// Associated wxvtk interactor
39         crea::creawxVTKRenderWindowInteractor  *mInteractor;
40         std::vector<vtkImageData*>::iterator i;
41         WxViewer* mParent;
42   
43     int mx1,mx2,my1,my2,mz1,mz2;
44     double mspx,mspy,mspz;
45   };
46
47
48         // CTor
49   WxViewer::WxViewer(wxWindow *parent, 
50                                                wxWindowID id,
51                                                wxString title,
52                                                const wxPoint& pos,
53                                                const wxSize& size)
54  :   wxFrame( parent, 
55                   id, 
56                   title,
57                   pos,
58                   size, 
59                   wxCAPTION)
60   {
61     GimmickDebugMessage(1,"WxViewer::WxViewer"
62                         <<std::endl);
63     wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
64
65         
66          // previewer
67         
68         mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
69     mInteractor->UseCaptureMouseOn();   
70  
71     mViewer     = vtkImageViewer2::New();
72     mViewer->SetupInteractor ( mInteractor );
73
74         mMovie=new ThreadedMovie(images, mViewer, mInteractor, this);
75         
76     topsizer-> Add( mInteractor ,1,wxGROW  ,0);
77     SetSizer( topsizer );     
78     Layout(); 
79   }
80
81   /// Destructor
82   WxViewer::~WxViewer()
83   {
84     GimmickDebugMessage(1,"WxViewer::~WxViewer"
85                         <<std::endl);
86   }
87
88
89   void WxViewer::ShowImage(vtkImageData* im)
90   {
91         mViewer->SetInput(im);
92         mViewer->SetSlice( 0 );
93
94         int x1,x2,y1,y2,z1,z2;
95         double spx,spy,spz;
96     im->Update();
97     
98     im->GetSpacing(spx,spy,spz);
99     im->GetExtent (x1,x2,y1,y2,z1,z2);
100     /*
101     std::cout << "-----------------------------"<<std::endl;
102       std::cout << x1 << "-"<<x2<<std::endl; 
103       std::cout << y1 << "-"<<y2<<std::endl; 
104       std::cout << z1 << "-"<<z2<<std::endl; 
105       std::cout << spx << "-"<<spy<<"-"<<spz<<std::endl; 
106     */
107    
108     if ((x1!=mx1) ||
109         (x2!=mx2) ||
110         (y1!=my1) ||
111         (y2!=my2) ||
112         (z1!=mz1) ||
113         (z2!=mz2) ||
114         (spx!=mspx) ||
115         (spy!=mspy) ||
116         (spz!=mspz) 
117         )
118       {
119         mx1 = x1;
120         mx2 = x2;
121         my1 = y1;
122         my2 = y2;
123         mz1 = z1;
124         mz2 = z2;
125         mspx = spx;
126         mspy = spy;
127         mspz = spz;
128         
129         double *range = im->GetScalarRange();
130          mViewer->SetColorWindow(range[1] - range[0]);
131          mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
132
133          mViewer->GetRenderer()->ResetCamera();
134         double bounds[6];
135
136
137          mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
138
139          /*
140         std::cout <<"bounds : "<<bounds[0]<<","
141 <<bounds[1]<<","
142 <<bounds[2]<<","
143 <<bounds[3]<<","
144 <<bounds[4]<<","
145                   <<bounds[5]<<std::endl;
146          */
147           
148          mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
149         /*
150         vtkCamera *camera = mViewer->GetRenderer()->GetActiveCamera();
151         
152         camera->SetViewUp ( spx*0, -spy*1, spz*0);
153         camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*10000000); 
154         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0); 
155         
156         camera->ComputeViewPlaneNormal();
157         camera->SetParallelScale(  spx*(x2-x1)/2.0 );
158         
159         camera->Roll ( 180 );
160         */
161           
162       }
163     
164     
165         
166   } 
167
168   //================================================================
169   
170   //================================================================
171
172   void WxViewer::AddImage(vtkImageData* im)
173   {
174           images.push_back(im);
175   }
176
177   //================================================================
178    
179   //================================================================
180   
181   void WxViewer::ShowImages()
182   {
183           if(!(mMovie->IsAlive()))
184           {
185                 mMovie->SetImagesToPlay(images);
186                 mMovie->StartIterator();
187                 mMovie->Create();
188                 mMovie->Run(); 
189           }
190           else
191           {
192                   if(!images.empty())
193                   {
194                         mMovie->Pause();
195                         mMovie->SetImagesToPlay(images);
196                         mMovie->StartIterator();
197                         mMovie->Resume();
198                   }
199                   else
200                   {
201                         GimmickMessage(1,"I'm empty!!!!! "<<std::endl);
202                   }
203           }
204           
205           
206   }
207
208    //================================================================
209   
210   //================================================================
211
212   void WxViewer::ClearImages()
213   {
214           images.clear();
215   }
216
217    //================================================================
218   
219   //================================================================
220
221   bool WxViewer::ImagesEmpty()
222   {
223           return images.empty();
224   }
225   //================================================================
226   //  BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
227   //    END_EVENT_TABLE()
228   //================================================================
229
230 //========================================================================
231 //========================================================================
232 //========================================================================
233 //========================================================================
234 //========================================================================
235 //========================================================================
236 //========================================================================
237 //========================================================================
238
239   void*  ThreadedMovie::Entry()
240   {
241           
242                         
243         while(true)
244         {               
245                         clock_t endwait;
246                                 for(i=mImagesToPlay.begin();i!=mImagesToPlay.end();++i)
247                                 {
248                                         if(i!=mImagesToPlay.end())
249                                         {
250                                                 ShowImage(*i);
251                                                 mParent->Refresh();
252                                                 endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
253                                                 while (clock() < endwait) {}
254                                         }
255                                         
256                                 }
257                                         
258         }
259         return 0;
260   }
261
262   //=====================================================================
263
264   //=====================================================================
265   void ThreadedMovie::OnExit()
266   {
267     GimmickMessage(1,"Hello WORLD IM OUT!!!!!!!! "<<std::endl);
268   }
269
270    //=====================================================================
271
272   //=====================================================================
273   void ThreadedMovie::SetImagesToPlay(std::vector<vtkImageData*> im)
274   {
275                 mImagesToPlay=im;
276   }
277
278     //=====================================================================
279
280   //=====================================================================
281   void ThreadedMovie::StartIterator()
282   {
283                 i=mImagesToPlay.begin();
284   }
285                         
286   //=====================================================================
287
288   //=====================================================================
289  
290   void  ThreadedMovie::ShowImage(vtkImageData* im)
291   {
292         mViewer->SetInput(im);
293         mViewer->SetSlice( 0 );
294
295         int x1,x2,y1,y2,z1,z2;
296         double spx,spy,spz;
297
298     im->Update();
299     
300     im->GetSpacing(spx,spy,spz);
301     im->GetExtent (x1,x2,y1,y2,z1,z2);
302     /*
303     std::cout << "-----------------------------"<<std::endl;
304       std::cout << x1 << "-"<<x2<<std::endl; 
305       std::cout << y1 << "-"<<y2<<std::endl; 
306       std::cout << z1 << "-"<<z2<<std::endl; 
307       std::cout << spx << "-"<<spy<<"-"<<spz<<std::endl; 
308     */
309    
310     if ((x1!=mx1) ||
311         (x2!=mx2) ||
312         (y1!=my1) ||
313         (y2!=my2) ||
314         (z1!=mz1) ||
315         (z2!=mz2) ||
316         (spx!=mspx) ||
317         (spy!=mspy) ||
318         (spz!=mspz) 
319         )
320       {
321         mx1 = x1;
322         mx2 = x2;
323         my1 = y1;
324         my2 = y2;
325         mz1 = z1;
326         mz2 = z2;
327         mspx = spx;
328         mspy = spy;
329         mspz = spz;
330         
331         double *range = im->GetScalarRange();
332          mViewer->SetColorWindow(range[1] - range[0]);
333          mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
334
335          mViewer->GetRenderer()->ResetCamera();
336         double bounds[6];
337
338
339          mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
340
341          /*
342         std::cout <<"bounds : "<<bounds[0]<<","
343 <<bounds[1]<<","
344 <<bounds[2]<<","
345 <<bounds[3]<<","
346 <<bounds[4]<<","
347                   <<bounds[5]<<std::endl;
348          */
349           
350          mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
351         /*
352         vtkCamera *camera = mViewer->GetRenderer()->GetActiveCamera();
353         
354         camera->SetViewUp ( spx*0, -spy*1, spz*0);
355         camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*10000000); 
356         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0); 
357         
358         camera->ComputeViewPlaneNormal();
359         camera->SetParallelScale(  spx*(x2-x1)/2.0 );
360         
361         camera->Roll ( 180 );
362         */
363           
364       }
365     
366     //mInteractor->Render();
367   }
368
369 } // EO namespace creaImageIO
370