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