]> Creatis software - creaImageIO.git/blob - src/creaImageIOWxViewer.cpp
0b99b6675b06754e6ed90988671a8d511c012cb9
[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
30 #include <fstream>
31 #include <vtkCamera.h>
32 #include <vtkRenderer.h>
33 #include <vtkImageData.h>
34 #include <creaMessageManager.h>
35 #include <stdio.h>
36 #include <time.h>
37
38
39 using namespace crea;
40
41 namespace creaImageIO
42 {
43   
44   //=====================================================================
45
46   //=====================================================================
47   class WxViewerPlayer: public wxThread
48   {
49   public:
50     WxViewerPlayer(WxViewer* v) :
51       mWxViewer(v)
52     {}
53     
54     void* Entry();
55     void  OnExit();
56         
57   private:
58
59     WxViewer* mWxViewer;
60   };
61   
62   //=====================================================================
63
64
65
66   
67
68   //=====================================================================
69   // CTor
70   WxViewer::WxViewer(wxWindow *parent, 
71                      wxWindowID id,
72                      wxString title,
73                      const wxPoint& pos,
74                      const wxSize& size)
75     :   wxPanel( parent, 
76                  id, 
77                  pos,
78                  size)
79   {
80     wxMutexLocker lock(mMutex);
81     GimmickDebugMessage(6,"WxViewer::WxViewer" <<std::endl);
82
83     mNeedRefresh        = false;
84     mLastImageShown = NULL;
85         
86         // previewer    
87     mInteractor = new crea::wxVTKRenderWindowInteractor(this,-1);
88     mInteractor->UseCaptureMouseOn();   
89  
90     mViewer     = vtkImageViewer2::New();
91     mViewer->SetupInteractor ( mInteractor );
92     
93     mCurrent    = 0;
94         mPlayer         = NULL;
95
96         // Grid to place checkbox and slider 
97         mflexSizer = new wxFlexGridSizer(1,2,1,1);
98         //Slider
99         mslide = new wxSlider(this,-1,0,0,1, wxDefaultPosition, wxSize(400,40), wxSL_HORIZONTAL | wxSL_LABELS);
100         Connect( mslide->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WxViewer::OnSlide ); 
101         //CheckBox
102         mcheck = new wxCheckBox(this,5123,crea::std2wx("Cine Loop"));
103         Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &WxViewer::OnCineLoop ); 
104         mcheck->SetValue(false);
105         mflexSizer->Add(mcheck,0, wxFIXED_MINSIZE);
106         mflexSizer-> Add( mslide,1,wxALIGN_CENTER | wxFIXED_MINSIZE );
107
108         // Sizer for Previewer and GridSizer
109         mtopSizer = new wxBoxSizer(wxVERTICAL);
110         mtopSizer->Add(mflexSizer,0);
111     mtopSizer-> Add( mInteractor ,1,wxGROW,0);
112         SetSizer(mtopSizer,true);
113         
114         Update();  
115     Layout(); 
116   }
117   //=====================================================================
118
119   //=====================================================================
120   /// Destructor
121   WxViewer::~WxViewer()
122   {
123     wxMutexLocker lock(mMutex);
124     GimmickDebugMessage(6,"WxViewer::~WxViewer"<<std::endl);
125     // TO DO : desallocate cleanly
126         if(mPlayer)
127         {
128                 mPlayer->Pause();
129                 mPlayer->Delete();
130                 mPlayer = 0;
131         }
132         delete mInteractor;
133         //delete mslide;
134         //delete mflexSizer;
135   }
136   //=====================================================================
137
138   //================================================================
139    void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
140   {
141         wxMutexLocker lock(mMutex);
142         GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
143         imagePointers=pointers;
144         
145         mslide->SetMax((int)pointers.size());
146         mslide->SetMin(1);
147         // Refresh don't work, TO MODIFY
148         mslide->Refresh();
149         mslide->ClearTicks();
150         mslide->Hide();
151         mslide->Show();
152         StartPlayer();
153   }
154
155   //================================================================
156
157   void WxViewer::ShowNextImage()
158   {
159         mMutex.Unlock();
160         wxMutexLocker lock(mMutex);
161             
162     GimmickMessage(2,"WxViewer::ShowNextImage() "
163                    <<mCurrent+1<<"/"
164                    <<imagePointers.size()<<std::endl);
165     
166     if(imagePointers.size()>0)
167         {
168                 if (mCurrent<imagePointers.size()) 
169                 {
170                         boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
171                         //ImagePointerHolder* iph= imagePointers[mCurrent];
172                         vtkImageData* currIm=iph->Get();
173                         ShowImage(currIm);
174                         if ( currIm != mLastImageShown ) 
175                         {
176                                 mNeedRefresh = true;
177                                 mLastImageShown = currIm;
178                         }
179                         mCurrent++;
180             } else {
181                         mCurrent = 0;
182                         //ImagePointerHolder* iph=imagePointers[mCurrent];
183                         boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
184                         vtkImageData* currIm=iph->Get();
185                         ShowImage(currIm);
186                         if ( currIm != mLastImageShown ) 
187                         {
188                                 mNeedRefresh = true;
189                                 mLastImageShown = currIm;
190                         }
191                         mCurrent++;
192                 } // if mCurrent
193         } // if imagePointers
194   }
195   //================================================================
196
197   //=====================================================================
198   void WxViewer::ShowImage(vtkImageData* im)
199   {
200     GimmickDebugMessage(6,"WxViewer::ShowImage"
201                         <<std::endl);
202     if (im==0) return;
203
204 //EED 2017-01-01 Migration VTK7
205 #if VTK_MAJOR_VERSION <= 5
206     mViewer->SetInput(im);
207 #else
208     mViewer->SetInputData(im);
209 #endif
210
211     mViewer->SetSlice( 0 );
212
213     int x1,x2,y1,y2,z1,z2;
214     double spx,spy,spz;
215 //EED 2017-01-01 Migration VTK7
216 #if VTK_MAJOR_VERSION <= 5
217     im->Update();
218 #else
219         // ...
220 #endif
221
222
223 //std::cout << "in WxViewer::ShowImage PrintSelf() =";
224 //im->PrintSelf(std::cout, vtkIndent(2));
225
226     im->GetSpacing(spx,spy,spz);
227     //im->GetExtent (x1,x2,y1,y2,z1,z2);  // JPR
228
229
230 //EED 2017-01-01 Migration VTK7
231 #if VTK_MAJOR_VERSION <= 5
232     im->GetWholeExtent (x1,x2,y1,y2,z1,z2); 
233 #else
234     im->GetExtent (x1,x2,y1,y2,z1,z2); 
235 #endif
236
237
238 /*       
239 std::cout << "in WxViewer::ShowImage GetWholeExtent ext =";
240         std::cout << "   [x1]=" << x1;
241         std::cout << "   [x2]=" << x2;
242         std::cout << "   [y1]=" << y1;
243         std::cout << "   [y2]=" << y2;
244         std::cout << "   [z1]=" << z1;
245         std::cout << "   [z2]=" << z2;
246 std::cout << std::endl; 
247 */   
248     if ((x1!=mx1) ||
249         (x2!=mx2) ||
250         (y1!=my1) ||
251         (y2!=my2) ||
252         (z1!=mz1) ||
253         (z2!=mz2) ||
254         (spx!=mspx) ||
255         (spy!=mspy) ||
256         (spz!=mspz) 
257         )
258       {
259         mx1 = x1;
260         mx2 = x2;
261         my1 = y1;
262         my2 = y2;
263         mz1 = z1;
264         mz2 = z2;
265         mspx = spx;
266         mspy = spy;
267         mspz = spz;
268
269         double *range = im->GetScalarRange();
270         mViewer->SetColorWindow(range[1] - range[0]);
271         mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
272
273         mViewer->GetRenderer()->ResetCamera();
274                   
275         //EED 21 mars 2012  FLIP problem  ..PLOP..
276         vtkCamera *camera =mViewer->GetRenderer()->GetActiveCamera();             
277         camera->SetViewUp               (       0               ,       -1              ,       0       );
278         camera->SetPosition             ((x1+x2)/2      , (y1+y2)/2     , -10000);
279         camera->SetFocalPoint   ((x1+x2)/2      , (y1+y2)/2     ,       0       );
280         camera->SetParallelScale( (x2-x1)/3.0 );
281                   
282                   
283         double bounds[6];
284
285         mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
286
287         mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
288         mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);  
289       }
290   } 
291   //================================================================
292   
293   //================================================================
294   bool WxViewer::RefreshIfNecessary()
295   {
296     if (mNeedRefresh)
297     {
298                 GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
299                 mInteractor->Render();
300                 mNeedRefresh = false;
301                 return true;
302     }
303     return false;
304   }
305   //================================================================
306   
307   //==================================================
308   void WxViewer::StopPlayer()
309   {
310           wxMutexLocker lock(mMutex);
311           if (mPlayer==NULL ) return;
312           mPlayer->Delete();  
313           mPlayer=NULL;
314           mMutex.Unlock();
315   }
316   //================================================================
317   
318   //==================================================
319   void WxViewer::StartPlayer()
320         {
321                 if(mcheck->IsChecked())
322                 {
323                         //      wxMutexLocker lock(mMutex);
324                         if (mPlayer != NULL) return;
325                         mPlayer = new WxViewerPlayer(this);
326                         mPlayer->Create();
327                         mPlayer->Run();  
328                 } else {
329                         ShowNextImage();
330                 } // if
331         }
332
333   //================================================================
334   
335   //==================================================
336
337     void WxViewer::OnCineLoop(wxCommandEvent &Event)
338         {
339                 if(!mcheck->IsChecked())
340                 {
341                         mPlayer->Pause();
342                         mPlayer->Delete();
343                         mPlayer = NULL;
344                 }
345                 StartPlayer();
346         }
347         
348  //================================================================
349   
350   //==================================================
351         
352         void WxViewer::OnSlide(wxCommandEvent &Event)
353          {
354                  mCurrent = mslide->GetValue() -1;
355                  StartPlayer();
356          }
357          //================================================================
358   
359   //==================================================
360
361          void WxViewer::SetValue()
362          {
363                  mslide->SetValue(mCurrent);
364          }
365
366   //  BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
367   //    END_EVENT_TABLE()
368   //================================================================
369
370 //========================================================================
371 //========================================================================
372 //========================================================================
373 //========================================================================
374 //========================================================================
375 //========================================================================
376 //========================================================================
377 //========================================================================
378
379   void*  WxViewerPlayer::Entry()
380   {
381           
382     GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
383         
384         while(!TestDestroy())
385             { 
386                         
387                         mWxViewer->ShowNextImage();
388                         mWxViewer->SetValue();
389                         ::wxWakeUpIdle();
390                         clock_t endwait;
391                         endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
392                         while (clock() < endwait ) {}
393                         
394       }
395     return 0;
396   }
397
398   //=====================================================================
399
400   //=====================================================================
401   void WxViewerPlayer::OnExit()
402   {
403     GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
404   }
405
406  
407 } // EO namespace creaImageIO
408