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