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