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