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