#include <vtkCamera.h>
#include <vtkRenderer.h>
#include <vtkImageData.h>
-
+#include <creawxVTKRenderWindowInteractor.h>
#include <creaMessageManager.h>
#include <stdio.h>
#include <time.h>
-
using namespace crea;
namespace creaImageIO
{
-
+
//=====================================================================
//=====================================================================
- class ThreadedMovie: public wxThread
+ class WxViewerPlayer: public wxThread
{
public:
- ThreadedMovie(std::vector<vtkImageData*> m, vtkImageViewer2* v, crea::creawxVTKRenderWindowInteractor* i, WxViewer* parent) :
- mImagesToPlay(m), mViewer(v), mInteractor(i), mParent(parent)
+ WxViewerPlayer(WxViewer* v) :
+ mWxViewer(v)
{}
-
+
void* Entry();
- void SetImagesToPlay(std::vector<vtkImageData*> im);
- void ShowImage(vtkImageData* v);
- void StartIterator();
void OnExit();
-
+
private:
- std::vector<vtkImageData*> mImagesToPlay;
- vtkImageViewer2* mViewer;
- /// Associated wxvtk interactor
- crea::creawxVTKRenderWindowInteractor *mInteractor;
- std::vector<vtkImageData*>::iterator i;
- WxViewer* mParent;
-
- int mx1,mx2,my1,my2,mz1,mz2;
- double mspx,mspy,mspz;
+
+ WxViewer* mWxViewer;
};
+
+ //=====================================================================
+
- // CTor
+
+
+ //=====================================================================
+ // CTor
WxViewer::WxViewer(wxWindow *parent,
- wxWindowID id,
- wxString title,
- const wxPoint& pos,
- const wxSize& size)
- : wxFrame( parent,
- id,
- title,
- pos,
- size,
- wxCAPTION)
+ wxWindowID id,
+ wxString title,
+ const wxPoint& pos,
+ const wxSize& size)
+ : wxPanel( parent,
+ id,
+ pos,
+ size)
{
- GimmickDebugMessage(1,"WxViewer::WxViewer"
+ wxMutexLocker lock(mMutex);
+ GimmickDebugMessage(6,"WxViewer::WxViewer"
<<std::endl);
+
+ mNeedRefresh = false;
+ mLastImageShown = NULL;
+
wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
- // previewer
+ // previewer
- mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
+ mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
mInteractor->UseCaptureMouseOn();
mViewer = vtkImageViewer2::New();
mViewer->SetupInteractor ( mInteractor );
-
- mMovie=new ThreadedMovie(images, mViewer, mInteractor, this);
-
+
+ mCurrent = 0;
+ mPlayer = 0;
+
topsizer-> Add( mInteractor ,1,wxGROW ,0);
SetSizer( topsizer );
Layout();
}
+ //=====================================================================
+ //=====================================================================
/// Destructor
WxViewer::~WxViewer()
{
- GimmickDebugMessage(1,"WxViewer::~WxViewer"
+ wxMutexLocker lock(mMutex);
+ GimmickDebugMessage(6,"WxViewer::~WxViewer"
<<std::endl);
+ // TO DO : desallocate cleanly
+ // delete mPlayer;
+ // delete mInteractor;
+ }
+ //=====================================================================
+
+ //================================================================
+ void WxViewer::SetImageVector(std::vector<ImagePointerHolder*>& pointers)
+ {
+ wxMutexLocker lock(mMutex);
+ GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
+ imagePointers=pointers;
}
+ //================================================================
+ void WxViewer::ShowNextImage()
+ {
+ wxMutexLocker lock(mMutex);
+
+
+ GimmickDebugMessage(10,"WxViewer::ShowNextImage() "
+ <<mCurrent+1<<"/"
+ <<imagePointers.size()<<std::endl);
+
+ if(imagePointers.size()>0)
+ {
+ if (mCurrent<imagePointers.size())
+ {
+ 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];
+ vtkImageData* currIm=iph->Get();
+ ShowImage(currIm);
+ if ( currIm != mLastImageShown )
+ {
+ mNeedRefresh = true;
+ mLastImageShown = currIm;
+ }
+ mCurrent++;
+ }
+ }
+ }
+ //================================================================
+
+ //=====================================================================
void WxViewer::ShowImage(vtkImageData* im)
{
- mViewer->SetInput(im);
- mViewer->SetSlice( 0 );
+
+ GimmickDebugMessage(6,"WxViewer::ShowImage"
+ <<std::endl);
+ if (im==0) return;
- int x1,x2,y1,y2,z1,z2;
- double spx,spy,spz;
+ mViewer->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);
- /*
- std::cout << "-----------------------------"<<std::endl;
- std::cout << x1 << "-"<<x2<<std::endl;
- std::cout << y1 << "-"<<y2<<std::endl;
- std::cout << z1 << "-"<<z2<<std::endl;
- std::cout << spx << "-"<<spy<<"-"<<spz<<std::endl;
- */
-
+
if ((x1!=mx1) ||
(x2!=mx2) ||
(y1!=my1) ||
mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
- /*
- std::cout <<"bounds : "<<bounds[0]<<","
-<<bounds[1]<<","
-<<bounds[2]<<","
-<<bounds[3]<<","
-<<bounds[4]<<","
- <<bounds[5]<<std::endl;
- */
mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
- /*
- vtkCamera *camera = mViewer->GetRenderer()->GetActiveCamera();
-
- camera->SetViewUp ( spx*0, -spy*1, spz*0);
- camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*10000000);
- camera->SetFocalPoint ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0);
-
- camera->ComputeViewPlaneNormal();
- camera->SetParallelScale( spx*(x2-x1)/2.0 );
-
- camera->Roll ( 180 );
- */
+
- }
-
-
-
- }
+ }
+ }
//================================================================
- //================================================================
-
- void WxViewer::AddImage(vtkImageData* im)
+ //================================================================
+ bool WxViewer::RefreshIfNecessary()
{
- images.push_back(im);
- }
+ if (mNeedRefresh)
+ {
+ GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
- //================================================================
-
+ mInteractor->Render();
+ mNeedRefresh = false;
+ return true;
+ }
+ return false;
+ }
//================================================================
- void WxViewer::ShowImages()
+ //==================================================
+ void WxViewer::StopPlayer()
{
- if(!(mMovie->IsAlive()))
- {
- mMovie->SetImagesToPlay(images);
- mMovie->StartIterator();
- mMovie->Create();
- mMovie->Run();
- }
- else
- {
- if(!images.empty())
- {
- mMovie->Pause();
- mMovie->SetImagesToPlay(images);
- mMovie->StartIterator();
- mMovie->Resume();
- }
- else
- {
- GimmickMessage(1,"I'm empty!!!!! "<<std::endl);
- }
- }
-
-
+ wxMutexLocker lock(mMutex);
+ if (mPlayer==0 ) return;
+ mPlayer->Delete();
+ mPlayer=0;
}
-
- //================================================================
-
//================================================================
-
- void WxViewer::ClearImages()
- {
- images.clear();
- }
-
- //================================================================
- //================================================================
+ //==================================================
+ void WxViewer::StartPlayer()
+ {
+ // wxMutexLocker lock(mMutex);
+ if (mPlayer != 0) return;
+ mPlayer = new WxViewerPlayer(this);
+ mPlayer->Create();
+ mPlayer->Run();
+ }
+
- bool WxViewer::ImagesEmpty()
- {
- return images.empty();
- }
- //================================================================
// BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
// END_EVENT_TABLE()
//================================================================
//========================================================================
//========================================================================
- void* ThreadedMovie::Entry()
+ void* WxViewerPlayer::Entry()
{
+ GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
+
+ while(!TestDestroy())
+ {
- while(true)
- {
+ mWxViewer->ShowNextImage();
+ ::wxWakeUpIdle();
clock_t endwait;
- for(i=mImagesToPlay.begin();i!=mImagesToPlay.end();++i)
- {
- if(i!=mImagesToPlay.end())
- {
- ShowImage(*i);
- mParent->Refresh();
- endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
- while (clock() < endwait) {}
- }
-
- }
-
- }
- return 0;
+ endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
+ while (clock() < endwait ) {}
+
+ }
+ return 0;
}
//=====================================================================
//=====================================================================
- void ThreadedMovie::OnExit()
+ void WxViewerPlayer::OnExit()
{
- GimmickMessage(1,"Hello WORLD IM OUT!!!!!!!! "<<std::endl);
+ GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
}
- //=====================================================================
-
- //=====================================================================
- void ThreadedMovie::SetImagesToPlay(std::vector<vtkImageData*> im)
- {
- mImagesToPlay=im;
- }
-
- //=====================================================================
-
- //=====================================================================
- void ThreadedMovie::StartIterator()
- {
- i=mImagesToPlay.begin();
- }
-
- //=====================================================================
-
- //=====================================================================
- void ThreadedMovie::ShowImage(vtkImageData* im)
- {
- mViewer->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);
- /*
- std::cout << "-----------------------------"<<std::endl;
- std::cout << x1 << "-"<<x2<<std::endl;
- std::cout << y1 << "-"<<y2<<std::endl;
- std::cout << z1 << "-"<<z2<<std::endl;
- std::cout << spx << "-"<<spy<<"-"<<spz<<std::endl;
- */
-
- 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);
-
- /*
- std::cout <<"bounds : "<<bounds[0]<<","
-<<bounds[1]<<","
-<<bounds[2]<<","
-<<bounds[3]<<","
-<<bounds[4]<<","
- <<bounds[5]<<std::endl;
- */
-
- mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
- /*
- vtkCamera *camera = mViewer->GetRenderer()->GetActiveCamera();
-
- camera->SetViewUp ( spx*0, -spy*1, spz*0);
- camera->SetPosition( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*10000000);
- camera->SetFocalPoint ( spx*(x1+x2)/2 , spy*(y1+y2)/2 , spz*0);
-
- camera->ComputeViewPlaneNormal();
- camera->SetParallelScale( spx*(x2-x1)/2.0 );
-
- camera->Roll ( 180 );
- */
-
- }
-
- //mInteractor->Render();
- }
-
} // EO namespace creaImageIO