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