]> Creatis software - creaImageIO.git/blob - src2/creaImageIOWxViewer.cpp
Windows comp
[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         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     GimmickMessage(1,"WxViewer::ShowNextImage() "
166                    <<mCurrent+1<<"/"
167                    <<images.size()<<std::endl);
168     if (mCurrent<images.size()) 
169       {
170         ShowImage(images[mCurrent]);
171       }
172     mCurrent++;
173     if (mCurrent >= images.size()) mCurrent = 0;
174   }
175   //================================================================
176
177
178
179
180   //=====================================================================
181   void WxViewer::ShowImage(vtkImageData* im)
182   {
183     GimmickDebugMessage(5,"WxViewer::ShowImage"
184                         <<std::endl);
185     if (im==0) return;
186
187     mViewer->SetInput(im);
188     mViewer->SetSlice( 0 );
189     
190     int x1,x2,y1,y2,z1,z2;
191     double spx,spy,spz;
192     im->Update();
193     
194     im->GetSpacing(spx,spy,spz);
195     im->GetExtent (x1,x2,y1,y2,z1,z2);
196     /*
197     std::cout << "-----------------------------"<<std::endl;
198     std::cout << x1 << "-"<<x2<<std::endl; 
199     std::cout << y1 << "-"<<y2<<std::endl; 
200     std::cout << z1 << "-"<<z2<<std::endl; 
201     std::cout << spx << "-"<<spy<<"-"<<spz<<std::endl; 
202     */
203     
204     if ((x1!=mx1) ||
205         (x2!=mx2) ||
206         (y1!=my1) ||
207         (y2!=my2) ||
208         (z1!=mz1) ||
209         (z2!=mz2) ||
210         (spx!=mspx) ||
211         (spy!=mspy) ||
212         (spz!=mspz) 
213         )
214       {
215         mx1 = x1;
216         mx2 = x2;
217         my1 = y1;
218         my2 = y2;
219         mz1 = z1;
220         mz2 = z2;
221         mspx = spx;
222         mspy = spy;
223         mspz = spz;
224         
225         double *range = im->GetScalarRange();
226          mViewer->SetColorWindow(range[1] - range[0]);
227          mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
228
229          mViewer->GetRenderer()->ResetCamera();
230         double bounds[6];
231
232
233          mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
234
235          /*
236         std::cout <<"bounds : "<<bounds[0]<<","
237 <<bounds[1]<<","
238 <<bounds[2]<<","
239 <<bounds[3]<<","
240 <<bounds[4]<<","
241                   <<bounds[5]<<std::endl;
242          */
243           
244          mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
245         /*
246         vtkCamera *camera = mViewer->GetRenderer()->GetActiveCamera();
247         
248         camera->SetViewUp ( spx*0, -spy*1, spz*0);
249         camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*10000000); 
250         camera->SetFocalPoint   ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0); 
251         
252         camera->ComputeViewPlaneNormal();
253         camera->SetParallelScale(  spx*(x2-x1)/2.0 );
254         
255         camera->Roll ( 180 );
256         */
257           
258       }
259     
260     //  mInteractor->Refresh();
261     //mInteractor->Render();
262     //    mViewer->Render();    
263
264    ::wxWakeUpIdle();
265   } 
266   //================================================================
267   
268   //==================================================
269   void WxViewer::OnInternalIdle()
270   {
271     //    mInteractor->Refresh();
272         if(images.size()>0)
273         {
274          mInteractor->Render();
275         }
276     //mViewer->Render();      
277   }
278   
279   //=================================================
280  
281
282   //  BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
283   //    END_EVENT_TABLE()
284   //================================================================
285
286 //========================================================================
287 //========================================================================
288 //========================================================================
289 //========================================================================
290 //========================================================================
291 //========================================================================
292 //========================================================================
293 //========================================================================
294
295   void*  WxViewerPlayer::Entry()
296   {
297           
298     GimmickMessage(1,"WxViewerPlayer::Entry()"<<std::endl);
299                         
300     while(true)
301       {                 
302         mWxViewer->ShowNextImage();
303         clock_t endwait;
304         endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
305         while (clock() < endwait) {}
306         /*
307         for(i=mImagesToPlay.begin();i!=mImagesToPlay.end();++i)
308           {
309             if(i!=mImagesToPlay.end())
310               {   
311
312                 GimmickMessage(1,"ThreadedMovie next image"<<std::endl);
313                 
314                 ShowImage(*i);
315                 mParent->Refresh();
316                 endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
317                 while (clock() < endwait) {}
318               }
319             
320           }
321         */
322       }
323     return 0;
324   }
325
326   //=====================================================================
327
328   //=====================================================================
329   void WxViewerPlayer::OnExit()
330   {
331     GimmickMessage(1,"WxViewerPlayer::OnExit() "<<std::endl);
332   }
333
334    //=====================================================================
335
336  
337 } // EO namespace creaImageIO
338