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