2 #include <creaImageIOWxViewer.h>
3 #include <creaImageIOSystem.h>
6 #include <vtkRenderer.h>
7 #include <vtkImageData.h>
9 #include <creaMessageManager.h>
18 //=====================================================================
20 //=====================================================================
21 class WxViewerPlayer: public wxThread
24 WxViewerPlayer(WxViewer* v) :
29 // void SetImagesToPlay(std::vector<vtkImageData*> im);
30 // void ShowImage(vtkImageData* v);
31 // void StartIterator();
35 //std::vector<vtkImageData*> mImagesToPlay;
36 //vtkImageViewer2* mViewer;
37 /// Associated wxvtk interactor
38 //crea::creawxVTKRenderWindowInteractor *mInteractor;
39 //std::vector<vtkImageData*>::iterator i;
42 // int mx1,mx2,my1,my2,mz1,mz2;
43 // double mspx,mspy,mspz;
46 //=====================================================================
52 //=====================================================================
54 WxViewer::WxViewer(wxWindow *parent,
64 wxMutexLocker lock(mMutex);
65 GimmickDebugMessage(1,"WxViewer::WxViewer"
69 mLastImageShown = NULL;
71 wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
76 mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
77 mInteractor->UseCaptureMouseOn();
79 mViewer = vtkImageViewer2::New();
80 mViewer->SetupInteractor ( mInteractor );
84 mPlayer = new WxViewerPlayer(this); //images, mViewer, mInteractor, this);
89 topsizer-> Add( mInteractor ,1,wxGROW ,0);
93 //=====================================================================
95 //=====================================================================
99 wxMutexLocker lock(mMutex);
100 GimmickDebugMessage(1,"WxViewer::~WxViewer"
103 // TO DO : desallocate cleanly
105 // delete mInteractor;
107 //=====================================================================
110 //================================================================
112 void WxViewer::SetImage(int i, vtkImageData* im)
114 wxMutexLocker lock(mMutex);
117 GimmickDebugMessage(5,"WxViewer::SetImage "<<i+1<<"/"<<images.size()
121 // if (images[i]!=0) images[i]->UnRegister(NULL);
123 // if (im!=0) im->Register(NULL);
130 //================================================================
134 //================================================================
136 bool WxViewer::ImagesEmpty()
138 wxMutexLocker lock(mMutex);
139 return images.empty();
141 //================================================================
143 //================================================================
145 void WxViewer::SetMovieSize(unsigned int si)
147 wxMutexLocker lock(mMutex);
148 GimmickDebugMessage(5,"WxViewer::SetMovieSize("<<(int)si<<")"
150 for (unsigned int i=0;i<images.size();++i)
154 // images[i]->UnRegister(NULL);
158 for (unsigned int i=0;i<si;++i) images.push_back(0);
161 //================================================================
163 //================================================================
165 void WxViewer::ShowNextImage()
167 wxMutexLocker lock(mMutex);
169 GimmickMessage(1,"WxViewer::ShowNextImage() "
171 <<images.size()<<std::endl);
174 if (mCurrent<images.size())
176 ShowImage(images[mCurrent]);
177 if ( images[mCurrent] != mLastImageShown ) mNeedRefresh = true;
178 mLastImageShown = images[mCurrent];
181 if (mCurrent >= images.size()) mCurrent = 0;
183 //================================================================
188 //=====================================================================
189 void WxViewer::ShowImage(vtkImageData* im)
191 GimmickDebugMessage(5,"WxViewer::ShowImage"
195 mViewer->SetInput(im);
196 mViewer->SetSlice( 0 );
198 int x1,x2,y1,y2,z1,z2;
202 im->GetSpacing(spx,spy,spz);
203 im->GetExtent (x1,x2,y1,y2,z1,z2);
205 std::cout << "-----------------------------"<<std::endl;
206 std::cout << x1 << "-"<<x2<<std::endl;
207 std::cout << y1 << "-"<<y2<<std::endl;
208 std::cout << z1 << "-"<<z2<<std::endl;
209 std::cout << spx << "-"<<spy<<"-"<<spz<<std::endl;
233 double *range = im->GetScalarRange();
234 mViewer->SetColorWindow(range[1] - range[0]);
235 mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
237 mViewer->GetRenderer()->ResetCamera();
241 mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
244 std::cout <<"bounds : "<<bounds[0]<<","
249 <<bounds[5]<<std::endl;
252 mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
254 vtkCamera *camera = mViewer->GetRenderer()->GetActiveCamera();
256 camera->SetViewUp ( spx*0, -spy*1, spz*0);
257 camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*10000000);
258 camera->SetFocalPoint ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0);
260 camera->ComputeViewPlaneNormal();
261 camera->SetParallelScale( spx*(x2-x1)/2.0 );
263 camera->Roll ( 180 );
268 // mInteractor->Refresh();
269 //mInteractor->Render();
270 // mViewer->Render();
274 //================================================================
276 //==================================================
277 void WxViewer::OnInternalIdle()
279 // mInteractor->Refresh();
282 // mInteractor->Render();
287 //================================================================
288 bool WxViewer::RefreshIfNecessary()
292 GimmickMessage(1,"WxViewer : Refreshing"<<std::endl);
293 mInteractor->Render();
294 // mViewer->Render();
296 mNeedRefresh = false;
301 //==================================================
302 void WxViewer::StopPlayer()
309 // BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
311 //================================================================
313 //========================================================================
314 //========================================================================
315 //========================================================================
316 //========================================================================
317 //========================================================================
318 //========================================================================
319 //========================================================================
320 //========================================================================
322 void* WxViewerPlayer::Entry()
325 GimmickMessage(1,"WxViewerPlayer::Entry()"<<std::endl);
331 mWxViewer->ShowNextImage();
332 // mWxViewer->Refresh();
335 endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
336 while (clock() < endwait) {}
343 for(i=mImagesToPlay.begin();i!=mImagesToPlay.end();++i)
345 if(i!=mImagesToPlay.end())
348 GimmickMessage(1,"ThreadedMovie next image"<<std::endl);
352 endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
353 while (clock() < endwait) {}
362 //=====================================================================
364 //=====================================================================
365 void WxViewerPlayer::OnExit()
367 GimmickMessage(1,"WxViewerPlayer::OnExit() "<<std::endl);
371 } // EO namespace creaImageIO