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