#include #include #include #include #include #include #include #include #include #include using namespace crea; // Memory tracking allocation namespace creaImageIO { //===================================================================== //===================================================================== class WxViewerPlayer: public wxThread { public: WxViewerPlayer(WxViewer* v) : mWxViewer(v) {} void* Entry(); void OnExit(); private: WxViewer* mWxViewer; }; //===================================================================== //===================================================================== // CTor WxViewer::WxViewer(wxWindow *parent, wxWindowID id, wxString title, const wxPoint& pos, const wxSize& size) : wxPanel( parent, id, pos, size) { wxMutexLocker lock(mMutex); GimmickDebugMessage(6,"WxViewer::WxViewer" <UseCaptureMouseOn(); mViewer = vtkImageViewer2::New(); mViewer->SetupInteractor ( mInteractor ); mCurrent = 0; mPlayer = 0; topsizer-> Add( mInteractor ,1,wxGROW ,0); SetSizer( topsizer ); Layout(); } //===================================================================== //===================================================================== /// Destructor WxViewer::~WxViewer() { wxMutexLocker lock(mMutex); GimmickDebugMessage(6,"WxViewer::~WxViewer" < >& pointers) { wxMutexLocker lock(mMutex); GimmickDebugMessage(6,"WxViewer::SetImageVector"<0) { if (mCurrent iph = imagePointers[mCurrent]; //ImagePointerHolder* iph= imagePointers[mCurrent]; vtkImageData* currIm=iph->Get(); ShowImage(currIm); if ( currIm != mLastImageShown ) { mNeedRefresh = true; mLastImageShown = currIm; } mCurrent++; } else { mCurrent = 0; //ImagePointerHolder* iph=imagePointers[mCurrent]; boost::shared_ptr iph = imagePointers[mCurrent]; vtkImageData* currIm=iph->Get(); ShowImage(currIm); if ( currIm != mLastImageShown ) { mNeedRefresh = true; mLastImageShown = currIm; } mCurrent++; } } } //================================================================ //===================================================================== void WxViewer::ShowImage(vtkImageData* im) { GimmickDebugMessage(6,"WxViewer::ShowImage" <SetInput(im); mViewer->SetSlice( 0 ); int x1,x2,y1,y2,z1,z2; double spx,spy,spz; im->Update(); im->GetSpacing(spx,spy,spz); im->GetExtent (x1,x2,y1,y2,z1,z2); if ((x1!=mx1) || (x2!=mx2) || (y1!=my1) || (y2!=my2) || (z1!=mz1) || (z2!=mz2) || (spx!=mspx) || (spy!=mspy) || (spz!=mspz) ) { mx1 = x1; mx2 = x2; my1 = y1; my2 = y2; mz1 = z1; mz2 = z2; mspx = spx; mspy = spy; mspz = spz; double *range = im->GetScalarRange(); mViewer->SetColorWindow(range[1] - range[0]); mViewer->SetColorLevel(0.5 * (range[1] + range[0])); mViewer->GetRenderer()->ResetCamera(); double bounds[6]; mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds); mViewer->GetRenderer()->ResetCameraClippingRange(bounds); } } //================================================================ //================================================================ bool WxViewer::RefreshIfNecessary() { if (mNeedRefresh) { GimmickDebugMessage(10,"WxViewer : Refreshing"<Render(); mNeedRefresh = false; return true; } return false; } //================================================================ //================================================== void WxViewer::StopPlayer() { wxMutexLocker lock(mMutex); if (mPlayer==0 ) return; mPlayer->Delete(); mPlayer=0; } //================================================================ //================================================== void WxViewer::StartPlayer() { // wxMutexLocker lock(mMutex); if (mPlayer != 0) return; mPlayer = new WxViewerPlayer(this); mPlayer->Create(); mPlayer->Run(); } // BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog) // END_EVENT_TABLE() //================================================================ //======================================================================== //======================================================================== //======================================================================== //======================================================================== //======================================================================== //======================================================================== //======================================================================== //======================================================================== void* WxViewerPlayer::Entry() { GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<ShowNextImage(); ::wxWakeUpIdle(); clock_t endwait; endwait = clock () + 0.2 * CLOCKS_PER_SEC ; while (clock() < endwait ) {} } return 0; } //===================================================================== //===================================================================== void WxViewerPlayer::OnExit() { GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<