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