00001
00002 #include <creaImageIOWxViewer.h>
00003 #include <creaImageIOSystem.h>
00004 #include <fstream>
00005 #include <vtkCamera.h>
00006 #include <vtkRenderer.h>
00007 #include <vtkImageData.h>
00008 #include <creawxVTKRenderWindowInteractor.h>
00009 #include <creaMessageManager.h>
00010 #include <stdio.h>
00011 #include <time.h>
00012
00013
00014 using namespace crea;
00015
00016 namespace creaImageIO
00017 {
00018
00019
00020
00021
00022 class WxViewerPlayer: public wxThread
00023 {
00024 public:
00025 WxViewerPlayer(WxViewer* v) :
00026 mWxViewer(v)
00027 {}
00028
00029 void* Entry();
00030 void OnExit();
00031
00032 private:
00033
00034 WxViewer* mWxViewer;
00035 };
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045 WxViewer::WxViewer(wxWindow *parent,
00046 wxWindowID id,
00047 wxString title,
00048 const wxPoint& pos,
00049 const wxSize& size)
00050 : wxPanel( parent,
00051 id,
00052 pos,
00053 size)
00054 {
00055 wxMutexLocker lock(mMutex);
00056 GimmickDebugMessage(6,"WxViewer::WxViewer"
00057 <<std::endl);
00058
00059 mNeedRefresh = false;
00060 mLastImageShown = NULL;
00061
00062
00063 mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
00064 mInteractor->UseCaptureMouseOn();
00065
00066 mViewer = vtkImageViewer2::New();
00067 mViewer->SetupInteractor ( mInteractor );
00068
00069 mCurrent = 0;
00070 mPlayer = 0;
00071
00072
00073 mflexSizer = new wxFlexGridSizer(1,2,1,1);
00074
00075 mslide = new wxSlider(this,-1,0,0,1, wxDefaultPosition, wxSize(400,40), wxSL_HORIZONTAL | wxSL_LABELS);
00076 Connect( mslide->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WxViewer::OnSlide );
00077
00078 mcheck = new wxCheckBox(this,5123,crea::std2wx("Cine Loop"));
00079 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &WxViewer::OnCineLoop );
00080 mcheck->SetValue(false);
00081 mflexSizer->Add(mcheck,0, wxFIXED_MINSIZE);
00082 mflexSizer-> Add( mslide,1,wxALIGN_CENTER | wxFIXED_MINSIZE );
00083
00084
00085 mtopSizer = new wxBoxSizer(wxVERTICAL);
00086 mtopSizer->Add(mflexSizer,0);
00087 mtopSizer-> Add( mInteractor ,1,wxGROW,0);
00088 SetSizer(mtopSizer,true);
00089
00090 Update();
00091 Layout();
00092 }
00093
00094
00095
00097 WxViewer::~WxViewer()
00098 {
00099 wxMutexLocker lock(mMutex);
00100 GimmickDebugMessage(6,"WxViewer::~WxViewer"
00101 <<std::endl);
00102
00103 if(mPlayer)
00104 {
00105 mPlayer->Pause();
00106 mPlayer->Delete();
00107 mPlayer = 0;
00108 }
00109 delete mInteractor;
00110
00111
00112 }
00113
00114
00115
00116 void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
00117 {
00118 wxMutexLocker lock(mMutex);
00119 GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
00120 imagePointers=pointers;
00121
00122 mslide->SetMax(pointers.size());
00123 mslide->SetMin(1);
00124
00125 mslide->Refresh();
00126 mslide->ClearTicks();
00127 mslide->Hide();
00128 mslide->Show();
00129 StartPlayer();
00130 }
00131
00132
00133
00134 void WxViewer::ShowNextImage()
00135 {
00136
00137
00138 mMutex.Unlock();
00139 wxMutexLocker lock(mMutex);
00140
00141 GimmickMessage(2,"WxViewer::ShowNextImage() "
00142 <<mCurrent+1<<"/"
00143 <<imagePointers.size()<<std::endl);
00144
00145 if(imagePointers.size()>0)
00146 {
00147 if (mCurrent<imagePointers.size())
00148 {
00149 boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
00150
00151 vtkImageData* currIm=iph->Get();
00152 ShowImage(currIm);
00153 if ( currIm != mLastImageShown )
00154 {
00155 mNeedRefresh = true;
00156 mLastImageShown = currIm;
00157 }
00158 mCurrent++;
00159 }
00160 else
00161 {
00162 mCurrent = 0;
00163
00164 boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
00165 vtkImageData* currIm=iph->Get();
00166 ShowImage(currIm);
00167 if ( currIm != mLastImageShown )
00168 {
00169 mNeedRefresh = true;
00170 mLastImageShown = currIm;
00171 }
00172 mCurrent++;
00173 }
00174 }
00175 }
00176
00177
00178
00179 void WxViewer::ShowImage(vtkImageData* im)
00180 {
00181 GimmickDebugMessage(6,"WxViewer::ShowImage"
00182 <<std::endl);
00183 if (im==0) return;
00184
00185 mViewer->SetInput(im);
00186
00187 mViewer->SetSlice( 0 );
00188
00189 int x1,x2,y1,y2,z1,z2;
00190 double spx,spy,spz;
00191 im->Update();
00192
00193
00194
00195
00196 im->GetSpacing(spx,spy,spz);
00197
00198 im->GetWholeExtent (x1,x2,y1,y2,z1,z2);
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209 if ((x1!=mx1) ||
00210 (x2!=mx2) ||
00211 (y1!=my1) ||
00212 (y2!=my2) ||
00213 (z1!=mz1) ||
00214 (z2!=mz2) ||
00215 (spx!=mspx) ||
00216 (spy!=mspy) ||
00217 (spz!=mspz)
00218 )
00219 {
00220 mx1 = x1;
00221 mx2 = x2;
00222 my1 = y1;
00223 my2 = y2;
00224 mz1 = z1;
00225 mz2 = z2;
00226 mspx = spx;
00227 mspy = spy;
00228 mspz = spz;
00229
00230 double *range = im->GetScalarRange();
00231 mViewer->SetColorWindow(range[1] - range[0]);
00232 mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
00233
00234 mViewer->GetRenderer()->ResetCamera();
00235 double bounds[6];
00236
00237 mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
00238
00239 mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
00240 mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);
00241 }
00242 }
00243
00244
00245
00246 bool WxViewer::RefreshIfNecessary()
00247 {
00248 if (mNeedRefresh)
00249 {
00250 GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
00251
00252 mInteractor->Render();
00253 mNeedRefresh = false;
00254 return true;
00255 }
00256 return false;
00257 }
00258
00259
00260
00261 void WxViewer::StopPlayer()
00262 {
00263 wxMutexLocker lock(mMutex);
00264 if (mPlayer==0 ) return;
00265 mPlayer->Delete();
00266 mPlayer=0;
00267 mMutex.Unlock();
00268 }
00269
00270
00271
00272 void WxViewer::StartPlayer()
00273 {
00274 if(mcheck->IsChecked())
00275 {
00276
00277 if (mPlayer != 0) return;
00278 mPlayer = new WxViewerPlayer(this);
00279 mPlayer->Create();
00280 mPlayer->Run();
00281 }
00282 else
00283 {
00284 ShowNextImage();
00285 }
00286 }
00287
00288
00289
00290
00291
00292 void WxViewer::OnCineLoop(wxCommandEvent &Event)
00293 {
00294 if(!mcheck->IsChecked())
00295 {
00296 mPlayer->Pause();
00297 mPlayer->Delete();
00298 mPlayer = 0;
00299 }
00300 StartPlayer();
00301 }
00302
00303
00304
00305
00306
00307 void WxViewer::OnSlide(wxCommandEvent &Event)
00308 {
00309 mCurrent = mslide->GetValue() -1;
00310 StartPlayer();
00311 }
00312
00313
00314
00315
00316 void WxViewer::SetValue()
00317 {
00318 mslide->SetValue(mCurrent);
00319 }
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334 void* WxViewerPlayer::Entry()
00335 {
00336
00337 GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
00338
00339 while(!TestDestroy())
00340 {
00341
00342 mWxViewer->ShowNextImage();
00343 mWxViewer->SetValue();
00344 ::wxWakeUpIdle();
00345 clock_t endwait;
00346 endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
00347 while (clock() < endwait ) {}
00348
00349 }
00350 return 0;
00351 }
00352
00353
00354
00355
00356 void WxViewerPlayer::OnExit()
00357 {
00358 GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
00359 }
00360
00361
00362 }
00363