]> Creatis software - creaImageIO.git/blob - src/creaImageIOWxViewer.cpp
Feature #1764
[creaImageIO.git] / src / creaImageIOWxViewer.cpp
1 /*
2 # ---------------------------------------------------------------------
3 #
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image 
5 #                        pour la Santé)
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
9 #
10 #  This software is governed by the CeCILL-B license under French law and 
11 #  abiding by the rules of distribution of free software. You can  use, 
12 #  modify and/ or redistribute the software under the terms of the CeCILL-B 
13 #  license as circulated by CEA, CNRS and INRIA at the following URL 
14 #  http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html 
15 #  or in the file LICENSE.txt.
16 #
17 #  As a counterpart to the access to the source code and  rights to copy,
18 #  modify and redistribute granted by the license, users are provided only
19 #  with a limited warranty  and the software's author,  the holder of the
20 #  economic rights,  and the successive licensors  have only  limited
21 #  liability. 
22 #
23 #  The fact that you are presently reading this means that you have had
24 #  knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------
26 */
27
28 #include <creaImageIOWxViewer.h>
29 #include <creaImageIOSystem.h>
30 #include <fstream>
31 #include <vtkCamera.h>
32 #include <vtkRenderer.h>
33 #include <vtkImageData.h>
34 #include <creawxVTKRenderWindowInteractor.h>
35 #include <creaMessageManager.h>
36 #include <stdio.h>
37 #include <time.h>
38
39
40 using namespace crea;
41
42 namespace creaImageIO
43 {
44   
45   //=====================================================================
46
47   //=====================================================================
48   class WxViewerPlayer: public wxThread
49   {
50   public:
51     WxViewerPlayer(WxViewer* v) :
52       mWxViewer(v)
53     {}
54     
55     void* Entry();
56     void  OnExit();
57         
58   private:
59
60     WxViewer* mWxViewer;
61   };
62   
63   //=====================================================================
64
65
66
67   
68
69   //=====================================================================
70   // CTor
71   WxViewer::WxViewer(wxWindow *parent, 
72                      wxWindowID id,
73                      wxString title,
74                      const wxPoint& pos,
75                      const wxSize& size)
76     :   wxPanel( parent, 
77                  id, 
78                  pos,
79                  size)
80   {
81     wxMutexLocker lock(mMutex);
82     GimmickDebugMessage(6,"WxViewer::WxViewer"
83                         <<std::endl);
84
85     mNeedRefresh = false;
86     mLastImageShown = NULL;
87         
88         // previewer    
89     mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
90     mInteractor->UseCaptureMouseOn();   
91  
92     mViewer     = vtkImageViewer2::New();
93     mViewer->SetupInteractor ( mInteractor );
94     
95     mCurrent = 0;
96         mPlayer = 0;
97
98         // Grid to place checkbox and slider 
99         mflexSizer = new wxFlexGridSizer(1,2,1,1);
100         //Slider
101         mslide = new wxSlider(this,-1,0,0,1, wxDefaultPosition, wxSize(400,40), wxSL_HORIZONTAL | wxSL_LABELS);
102         Connect( mslide->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WxViewer::OnSlide ); 
103         //CheckBox
104         mcheck = new wxCheckBox(this,5123,crea::std2wx("Cine Loop"));
105         Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &WxViewer::OnCineLoop ); 
106         mcheck->SetValue(false);
107         mflexSizer->Add(mcheck,0, wxFIXED_MINSIZE);
108         mflexSizer-> Add( mslide,1,wxALIGN_CENTER | wxFIXED_MINSIZE );
109
110         // Sizer for Previewer and GridSizer
111         mtopSizer = new wxBoxSizer(wxVERTICAL);
112         mtopSizer->Add(mflexSizer,0);
113     mtopSizer-> Add( mInteractor ,1,wxGROW,0);
114         SetSizer(mtopSizer,true);
115         
116         Update();  
117     Layout(); 
118   }
119   //=====================================================================
120
121   //=====================================================================
122   /// Destructor
123   WxViewer::~WxViewer()
124   {
125     wxMutexLocker lock(mMutex);
126     GimmickDebugMessage(6,"WxViewer::~WxViewer"
127                         <<std::endl);
128     // TO DO : desallocate cleanly
129         if(mPlayer)
130         {
131                 mPlayer->Pause();
132                 mPlayer->Delete();
133                 mPlayer = 0;
134         }
135         delete mInteractor;
136         //delete mslide;
137         //delete mflexSizer;
138   }
139   //=====================================================================
140
141   //================================================================
142    void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
143   {
144         wxMutexLocker lock(mMutex);
145         GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
146         imagePointers=pointers;
147         
148         mslide->SetMax(pointers.size());
149         mslide->SetMin(1);
150         // Refresh don't work, TO MODIFY
151         mslide->Refresh();
152         mslide->ClearTicks();
153         mslide->Hide();
154         mslide->Show();
155         StartPlayer();
156   }
157
158   //================================================================
159
160   void WxViewer::ShowNextImage()
161   {
162          
163         
164           mMutex.Unlock();
165         wxMutexLocker lock(mMutex);
166             
167     GimmickMessage(2,"WxViewer::ShowNextImage() "
168                    <<mCurrent+1<<"/"
169                    <<imagePointers.size()<<std::endl);
170     
171     if(imagePointers.size()>0)
172         {
173                 if (mCurrent<imagePointers.size()) 
174                 {
175                         boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
176                         //ImagePointerHolder* iph= imagePointers[mCurrent];
177                         vtkImageData* currIm=iph->Get();
178                         ShowImage(currIm);
179                         if ( currIm != mLastImageShown ) 
180                         {
181                                 mNeedRefresh = true;
182                                 mLastImageShown = currIm;
183                         }
184                 mCurrent++;
185             }
186                 else
187                 {
188                         mCurrent = 0;
189                         //ImagePointerHolder* iph=imagePointers[mCurrent];
190                         boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
191                         vtkImageData* currIm=iph->Get();
192                         ShowImage(currIm);
193                         if ( currIm != mLastImageShown ) 
194                         {
195                                 mNeedRefresh = true;
196                                 mLastImageShown = currIm;
197                         }
198                         mCurrent++;
199                 }
200         }
201   }
202   //================================================================
203
204   //=====================================================================
205   void WxViewer::ShowImage(vtkImageData* im)
206   {
207     GimmickDebugMessage(6,"WxViewer::ShowImage"
208                         <<std::endl);
209     if (im==0) return;
210
211     mViewer->SetInput(im);
212
213     mViewer->SetSlice( 0 );
214
215     int x1,x2,y1,y2,z1,z2;
216     double spx,spy,spz;
217     im->Update();
218
219 //std::cout << "in WxViewer::ShowImage PrintSelf() =";
220 //im->PrintSelf(std::cout, vtkIndent(2));
221
222     im->GetSpacing(spx,spy,spz);
223     //im->GetExtent (x1,x2,y1,y2,z1,z2);  // JPR
224     im->GetWholeExtent (x1,x2,y1,y2,z1,z2); 
225 /*       
226 std::cout << "in WxViewer::ShowImage GetWholeExtent ext =";
227         std::cout << "   [x1]=" << x1;
228         std::cout << "   [x2]=" << x2;
229         std::cout << "   [y1]=" << y1;
230         std::cout << "   [y2]=" << y2;
231         std::cout << "   [z1]=" << z1;
232         std::cout << "   [z2]=" << z2;
233 std::cout << std::endl; 
234 */   
235     if ((x1!=mx1) ||
236         (x2!=mx2) ||
237         (y1!=my1) ||
238         (y2!=my2) ||
239         (z1!=mz1) ||
240         (z2!=mz2) ||
241         (spx!=mspx) ||
242         (spy!=mspy) ||
243         (spz!=mspz) 
244         )
245       {
246         mx1 = x1;
247         mx2 = x2;
248         my1 = y1;
249         my2 = y2;
250         mz1 = z1;
251         mz2 = z2;
252         mspx = spx;
253         mspy = spy;
254         mspz = spz;
255
256         double *range = im->GetScalarRange();
257         mViewer->SetColorWindow(range[1] - range[0]);
258         mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
259
260         mViewer->GetRenderer()->ResetCamera();
261                   
262         //EED 21 mars 2012  FLIP problem  ..PLOP..
263         vtkCamera *camera =mViewer->GetRenderer()->GetActiveCamera();             
264         camera->SetViewUp               (       0               ,       -1              ,       0       );
265         camera->SetPosition             ((x1+x2)/2      , (y1+y2)/2     , -10000);
266         camera->SetFocalPoint   ((x1+x2)/2      , (y1+y2)/2     ,       0       );
267         camera->SetParallelScale( (x2-x1)/3.0 );
268                   
269                   
270         double bounds[6];
271
272         mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
273
274         mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
275         mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);  
276       }
277   } 
278   //================================================================
279   
280   //================================================================
281   bool WxViewer::RefreshIfNecessary()
282   {
283     if (mNeedRefresh)
284       {
285         GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
286
287         mInteractor->Render();
288         mNeedRefresh = false;
289         return true;
290       }
291     return false;
292   }
293   //================================================================
294   
295   //==================================================
296   void WxViewer::StopPlayer()
297   {
298           wxMutexLocker lock(mMutex);
299           if (mPlayer==0 ) return;
300           mPlayer->Delete();  
301           mPlayer=0;
302           mMutex.Unlock();
303   }
304   //================================================================
305   
306   //==================================================
307   void WxViewer::StartPlayer()
308         {
309                 if(mcheck->IsChecked())
310                 {
311                         //      wxMutexLocker lock(mMutex);
312                         if (mPlayer != 0) return;
313                         mPlayer = new WxViewerPlayer(this);
314                         mPlayer->Create();
315                         mPlayer->Run();  
316                 }
317                 else
318                 {
319                         ShowNextImage();
320                 }
321         }
322
323   //================================================================
324   
325   //==================================================
326
327     void WxViewer::OnCineLoop(wxCommandEvent &Event)
328         {
329                 if(!mcheck->IsChecked())
330                 {
331                         mPlayer->Pause();
332                         mPlayer->Delete();
333                         mPlayer = 0;
334                 }
335                 StartPlayer();
336         }
337         
338  //================================================================
339   
340   //==================================================
341         
342         void WxViewer::OnSlide(wxCommandEvent &Event)
343          {
344                  mCurrent = mslide->GetValue() -1;
345                  StartPlayer();
346          }
347          //================================================================
348   
349   //==================================================
350
351          void WxViewer::SetValue()
352          {
353                  mslide->SetValue(mCurrent);
354          }
355
356   //  BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
357   //    END_EVENT_TABLE()
358   //================================================================
359
360 //========================================================================
361 //========================================================================
362 //========================================================================
363 //========================================================================
364 //========================================================================
365 //========================================================================
366 //========================================================================
367 //========================================================================
368
369   void*  WxViewerPlayer::Entry()
370   {
371           
372     GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
373         
374         while(!TestDestroy())
375             { 
376                         
377                         mWxViewer->ShowNextImage();
378                         mWxViewer->SetValue();
379                         ::wxWakeUpIdle();
380                         clock_t endwait;
381                         endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
382                         while (clock() < endwait ) {}
383                         
384       }
385     return 0;
386   }
387
388   //=====================================================================
389
390   //=====================================================================
391   void WxViewerPlayer::OnExit()
392   {
393     GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
394   }
395
396  
397 } // EO namespace creaImageIO
398