]> Creatis software - creaImageIO.git/blob - src2/creaImageIOWxViewer.cpp
No more cine loop, add a slider control by default to preview images
[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 #include <creawxVTKRenderWindowInteractor.h>
9 #include <creaMessageManager.h>
10 #include <stdio.h>
11 #include <time.h>
12
13 using namespace crea;
14 // Memory tracking allocation
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  OnExit();
30         
31   private:
32
33     WxViewer* mWxViewer;
34   };
35   
36   //=====================================================================
37
38
39
40   
41
42   //=====================================================================
43   // CTor
44   WxViewer::WxViewer(wxWindow *parent, 
45                      wxWindowID id,
46                      wxString title,
47                      const wxPoint& pos,
48                      const wxSize& size)
49     :   wxPanel( parent, 
50                  id, 
51                  pos,
52                  size)
53   {
54     wxMutexLocker lock(mMutex);
55     GimmickDebugMessage(6,"WxViewer::WxViewer"
56                         <<std::endl);
57
58     mNeedRefresh = false;
59     mLastImageShown = NULL;
60
61     wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
62
63         mslide = new wxSlider(this,-1,0,0,1, wxDefaultPosition, wxSize(400,10), wxSL_HORIZONTAL | wxSL_LABELS);
64         Connect( mslide->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WxViewer::OnSlide ); 
65         mcheck = new wxCheckBox(this,5123,crea::std2wx("Cine Loop"));
66         Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &WxViewer::OnCineLoop ); 
67         mcheck->SetValue(false);
68     // previewer        
69     mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
70     mInteractor->UseCaptureMouseOn();   
71  
72     mViewer     = vtkImageViewer2::New();
73     mViewer->SetupInteractor ( mInteractor );
74     
75     mCurrent = 0;
76         mPlayer = 0;
77
78         topsizer-> Add( mslide,1,wxALIGN_CENTER  ,0);
79     topsizer-> Add( mInteractor ,1,wxGROW  ,0);
80
81     SetSizer( topsizer );     
82     Layout(); 
83   }
84   //=====================================================================
85
86   //=====================================================================
87   /// Destructor
88   WxViewer::~WxViewer()
89   {
90     wxMutexLocker lock(mMutex);
91     GimmickDebugMessage(6,"WxViewer::~WxViewer"
92                         <<std::endl);
93     // TO DO : desallocate cleanly
94     //    delete mPlayer;
95     //    delete mInteractor;
96         delete mslide;
97   }
98   //=====================================================================
99
100   //================================================================
101    void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
102   {
103         wxMutexLocker lock(mMutex);
104         GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
105         imagePointers=pointers;
106         
107         mslide->SetMax(pointers.size());
108         // Refresh don't work, TO MODIFY
109         mslide->Refresh();
110         mslide->ClearTicks();
111         mslide->Hide();
112         mslide->Show();
113         StartPlayer();
114   }
115
116   //================================================================
117
118   void WxViewer::ShowNextImage()
119   {
120         wxMutexLocker lock(mMutex);
121         
122     
123     GimmickDebugMessage(10,"WxViewer::ShowNextImage() "
124                    <<mCurrent+1<<"/"
125                    <<imagePointers.size()<<std::endl);
126     
127     if(imagePointers.size()>0)
128         {
129                 if (mCurrent<imagePointers.size()) 
130                 {
131                         boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
132                         //ImagePointerHolder* iph= imagePointers[mCurrent];
133                         vtkImageData* currIm=iph->Get();
134                         ShowImage(currIm);
135                         if ( currIm != mLastImageShown ) 
136                         {
137                                 mNeedRefresh = true;
138                                 mLastImageShown = currIm;
139                         }
140                 mCurrent++;
141             }
142                 else
143                 {
144                         mCurrent = 0;
145                         //ImagePointerHolder* iph=imagePointers[mCurrent];
146                         boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
147                         vtkImageData* currIm=iph->Get();
148                         ShowImage(currIm);
149                         if ( currIm != mLastImageShown ) 
150                         {
151                                 mNeedRefresh = true;
152                                 mLastImageShown = currIm;
153                         }
154                         mCurrent++;
155                 }
156         }
157   }
158   //================================================================
159
160   //=====================================================================
161   void WxViewer::ShowImage(vtkImageData* im)
162   {
163     GimmickDebugMessage(6,"WxViewer::ShowImage"
164                         <<std::endl);
165     if (im==0) return;
166
167     mViewer->SetInput(im);
168
169     mViewer->SetSlice( 0 );
170
171     int x1,x2,y1,y2,z1,z2;
172     double spx,spy,spz;
173     im->Update();
174
175 //std::cout << "in WxViewer::ShowImage PrintSelf() =";
176 //im->PrintSelf(std::cout, vtkIndent(2));
177
178     im->GetSpacing(spx,spy,spz);
179     //im->GetExtent (x1,x2,y1,y2,z1,z2);  // JPR
180     im->GetWholeExtent (x1,x2,y1,y2,z1,z2); 
181 /*       
182 std::cout << "in WxViewer::ShowImage GetWholeExtent ext =";
183         std::cout << "   [x1]=" << x1;
184         std::cout << "   [x2]=" << x2;
185         std::cout << "   [y1]=" << y1;
186         std::cout << "   [y2]=" << y2;
187         std::cout << "   [z1]=" << z1;
188         std::cout << "   [z2]=" << z2;
189 std::cout << std::endl; 
190 */   
191     if ((x1!=mx1) ||
192         (x2!=mx2) ||
193         (y1!=my1) ||
194         (y2!=my2) ||
195         (z1!=mz1) ||
196         (z2!=mz2) ||
197         (spx!=mspx) ||
198         (spy!=mspy) ||
199         (spz!=mspz) 
200         )
201       {
202         mx1 = x1;
203         mx2 = x2;
204         my1 = y1;
205         my2 = y2;
206         mz1 = z1;
207         mz2 = z2;
208         mspx = spx;
209         mspy = spy;
210         mspz = spz;
211
212         double *range = im->GetScalarRange();
213         mViewer->SetColorWindow(range[1] - range[0]);
214         mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
215
216         mViewer->GetRenderer()->ResetCamera();
217         double bounds[6];
218
219         mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
220
221         mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
222         mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);  
223       }
224   } 
225   //================================================================
226   
227   //================================================================
228   bool WxViewer::RefreshIfNecessary()
229   {
230     if (mNeedRefresh)
231       {
232         GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
233
234         mInteractor->Render();
235         mNeedRefresh = false;
236         return true;
237       }
238     return false;
239   }
240   //================================================================
241   
242   //==================================================
243   void WxViewer::StopPlayer()
244   {
245           wxMutexLocker lock(mMutex);
246           if (mPlayer==0 ) return;
247           mPlayer->Delete();  
248           mPlayer=0;
249   }
250   //================================================================
251   
252   //==================================================
253   void WxViewer::StartPlayer()
254         {
255                 if(mcheck->IsChecked())
256                 {
257                         //      wxMutexLocker lock(mMutex);
258                         if (mPlayer != 0) return;
259                         mPlayer = new WxViewerPlayer(this);
260                         mPlayer->Create();
261                         mPlayer->Run();  
262                 }
263                 else
264                 {
265                         ShowNextImage();
266                 }
267         }
268
269   //================================================================
270   
271   //==================================================
272
273     void WxViewer::OnCineLoop(wxCommandEvent &Event)
274         {
275                 if(!mcheck->IsChecked())
276                 {
277                         mPlayer->Pause();
278                         mPlayer->Delete();
279                         mPlayer = 0;
280                 }
281                 StartPlayer();
282         }
283         
284  //================================================================
285   
286   //==================================================
287         
288         void WxViewer::OnSlide(wxCommandEvent &Event)
289          {
290                  mCurrent = mslide->GetValue();
291                  StartPlayer();
292          }
293          //================================================================
294   
295   //==================================================
296
297          void WxViewer::SetValue()
298          {
299                  mslide->SetValue(mCurrent);
300          }
301
302   //  BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
303   //    END_EVENT_TABLE()
304   //================================================================
305
306 //========================================================================
307 //========================================================================
308 //========================================================================
309 //========================================================================
310 //========================================================================
311 //========================================================================
312 //========================================================================
313 //========================================================================
314
315   void*  WxViewerPlayer::Entry()
316   {
317           
318     GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
319         
320         while(!TestDestroy())
321             { 
322                         
323                         mWxViewer->ShowNextImage();
324                         mWxViewer->SetValue();
325                         ::wxWakeUpIdle();
326                         clock_t endwait;
327                         endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
328                         while (clock() < endwait ) {}
329                         
330       }
331     return 0;
332   }
333
334   //=====================================================================
335
336   //=====================================================================
337   void WxViewerPlayer::OnExit()
338   {
339     GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
340   }
341
342  
343 } // EO namespace creaImageIO
344