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