#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
{
-
+
//=====================================================================
//=====================================================================
{}
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* mWxViewer;
-
- // int mx1,mx2,my1,my2,mz1,mz2;
- // double mspx,mspy,mspz;
};
//=====================================================================
size)
{
wxMutexLocker lock(mMutex);
- GimmickDebugMessage(1,"WxViewer::WxViewer"
+ GimmickDebugMessage(6,"WxViewer::WxViewer"
<<std::endl);
mNeedRefresh = false;
mLastImageShown = NULL;
-
- wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
-
-
- // previewer
+ // previewer
mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
mInteractor->UseCaptureMouseOn();
mViewer->SetupInteractor ( mInteractor );
mCurrent = 0;
-
- mPlayer = new WxViewerPlayer(this); //images, mViewer, mInteractor, this);
+ mPlayer = 0;
+
+ // Grid to place checkbox and slider
+ mflexSizer = new wxFlexGridSizer(1,2,1,1);
+ //Slider
+ mslide = new wxSlider(this,-1,0,0,1, wxDefaultPosition, wxSize(400,40), wxSL_HORIZONTAL | wxSL_LABELS);
+ Connect( mslide->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WxViewer::OnSlide );
+ //CheckBox
+ mcheck = new wxCheckBox(this,5123,crea::std2wx("Cine Loop"));
+ Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &WxViewer::OnCineLoop );
+ mcheck->SetValue(false);
+ mflexSizer->Add(mcheck,0, wxFIXED_MINSIZE);
+ mflexSizer-> Add( mslide,1,wxALIGN_CENTER | wxFIXED_MINSIZE );
+
+ // Sizer for Previewer and GridSizer
+ mtopSizer = new wxBoxSizer(wxVERTICAL);
+ mtopSizer->Add(mflexSizer,0);
+ mtopSizer-> Add( mInteractor ,1,wxGROW,0);
+ SetSizer(mtopSizer,true);
- mPlayer->Create();
- mPlayer->Run();
-
- topsizer-> Add( mInteractor ,1,wxGROW ,0);
- SetSizer( topsizer );
+ Update();
Layout();
}
//=====================================================================
WxViewer::~WxViewer()
{
wxMutexLocker lock(mMutex);
- GimmickDebugMessage(1,"WxViewer::~WxViewer"
+ GimmickDebugMessage(6,"WxViewer::~WxViewer"
<<std::endl);
- SetMovieSize(0);
// TO DO : desallocate cleanly
- // delete mPlayer;
- // delete mInteractor;
- }
- //=====================================================================
-
-
- //================================================================
-
- void WxViewer::SetImage(int i, vtkImageData* im)
- {
- wxMutexLocker lock(mMutex);
- if(images.size()>0)
+ if(mPlayer)
{
- GimmickDebugMessage(5,"WxViewer::SetImage "<<i+1<<"/"<<images.size()
- <<std::endl);
- if (i<images.size())
- {
- // if (images[i]!=0) images[i]->UnRegister(NULL);
- images[i] = im;
- // if (im!=0) im->Register(NULL);
- }
-
+ mPlayer->Pause();
+ mPlayer->Delete();
+ mPlayer = 0;
}
-
- }
-
- //================================================================
-
-
-
- //================================================================
-
- bool WxViewer::ImagesEmpty()
- {
- wxMutexLocker lock(mMutex);
- return images.empty();
+ delete mInteractor;
+ //delete mslide;
+ //delete mflexSizer;
}
- //================================================================
+ //=====================================================================
//================================================================
-
- void WxViewer::SetMovieSize(unsigned int si)
+ void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
{
- wxMutexLocker lock(mMutex);
- GimmickDebugMessage(5,"WxViewer::SetMovieSize("<<(int)si<<")"
- <<std::endl);
- for (unsigned int i=0;i<images.size();++i)
- {
- if (images[i]!=0)
- {
- // images[i]->UnRegister(NULL);
- }
- }
- images.clear();
- for (unsigned int i=0;i<si;++i) images.push_back(0);
- mCurrent = 0;
+ wxMutexLocker lock(mMutex);
+ GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
+ imagePointers=pointers;
+
+ mslide->SetMax(pointers.size());
+ // Refresh don't work, TO MODIFY
+ mslide->Refresh();
+ mslide->ClearTicks();
+ mslide->Hide();
+ mslide->Show();
+ StartPlayer();
}
- //================================================================
//================================================================
void WxViewer::ShowNextImage()
{
- wxMutexLocker lock(mMutex);
+ wxMutexLocker lock(mMutex);
- /*
- GimmickMessage(1,"WxViewer::ShowNextImage() "
+
+ GimmickDebugMessage(10,"WxViewer::ShowNextImage() "
<<mCurrent+1<<"/"
- <<images.size()<<std::endl);
- */
+ <<imagePointers.size()<<std::endl);
- if (mCurrent<images.size())
- {
- ShowImage(images[mCurrent]);
- if ( images[mCurrent] != mLastImageShown ) mNeedRefresh = true;
- mLastImageShown = images[mCurrent];
- }
- mCurrent++;
- if (mCurrent >= images.size()) mCurrent = 0;
+ if(imagePointers.size()>0)
+ {
+ if (mCurrent<imagePointers.size())
+ {
+ boost::shared_ptr<ImagePointerHolder> 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<ImagePointerHolder> iph = imagePointers[mCurrent];
+ vtkImageData* currIm=iph->Get();
+ ShowImage(currIm);
+ if ( currIm != mLastImageShown )
+ {
+ mNeedRefresh = true;
+ mLastImageShown = currIm;
+ }
+ mCurrent++;
+ }
+ }
}
//================================================================
-
-
-
//=====================================================================
void WxViewer::ShowImage(vtkImageData* im)
{
- GimmickDebugMessage(5,"WxViewer::ShowImage"
+ GimmickDebugMessage(6,"WxViewer::ShowImage"
<<std::endl);
if (im==0) return;
mViewer->SetInput(im);
-
+
mViewer->SetSlice( 0 );
-
+
int x1,x2,y1,y2,z1,z2;
double spx,spy,spz;
im->Update();
-
+
+//std::cout << "in WxViewer::ShowImage PrintSelf() =";
+//im->PrintSelf(std::cout, vtkIndent(2));
+
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;
- */
-
+ //im->GetExtent (x1,x2,y1,y2,z1,z2); // JPR
+ im->GetWholeExtent (x1,x2,y1,y2,z1,z2);
+/*
+std::cout << "in WxViewer::ShowImage GetWholeExtent ext =";
+ std::cout << " [x1]=" << x1;
+ std::cout << " [x2]=" << x2;
+ std::cout << " [y1]=" << y1;
+ std::cout << " [y2]=" << y2;
+ std::cout << " [z1]=" << z1;
+ std::cout << " [z2]=" << z2;
+std::cout << std::endl;
+*/
if ((x1!=mx1) ||
(x2!=mx2) ||
(y1!=my1) ||
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->SetColorWindow(range[1] - range[0]);
+ mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
- mViewer->GetRenderer()->ResetCamera();
+ mViewer->GetRenderer()->ResetCamera();
double bounds[6];
+ mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
- 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 );
- */
-
+ mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
+ mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);
}
-
- // mInteractor->Refresh();
- //mInteractor->Render();
- // mViewer->Render();
-
- //::wxWakeUpIdle();
}
//================================================================
- //==================================================
- void WxViewer::OnInternalIdle()
- {
- // mInteractor->Refresh();
- if(images.size()>0)
- {
-// mInteractor->Render();
- }
- //mViewer->Render();
- }
-
- //================================================================
+ //================================================================
bool WxViewer::RefreshIfNecessary()
{
if (mNeedRefresh)
{
- GimmickMessage(1,"WxViewer : Refreshing"<<std::endl);
+ GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
mInteractor->Render();
mNeedRefresh = false;
}
return false;
}
+ //================================================================
+
//==================================================
void WxViewer::StopPlayer()
{
- mPlayer->Delete();
+ wxMutexLocker lock(mMutex);
+ if (mPlayer==0 ) return;
+ mPlayer->Delete();
+ mPlayer=0;
}
+ //================================================================
-
+ //==================================================
+ void WxViewer::StartPlayer()
+ {
+ if(mcheck->IsChecked())
+ {
+ // wxMutexLocker lock(mMutex);
+ if (mPlayer != 0) return;
+ mPlayer = new WxViewerPlayer(this);
+ mPlayer->Create();
+ mPlayer->Run();
+ }
+ else
+ {
+ ShowNextImage();
+ }
+ }
+
+ //================================================================
+
+ //==================================================
+
+ void WxViewer::OnCineLoop(wxCommandEvent &Event)
+ {
+ if(!mcheck->IsChecked())
+ {
+ mPlayer->Pause();
+ mPlayer->Delete();
+ mPlayer = 0;
+ }
+ StartPlayer();
+ }
+
+ //================================================================
+
+ //==================================================
+
+ void WxViewer::OnSlide(wxCommandEvent &Event)
+ {
+ mCurrent = mslide->GetValue();
+ StartPlayer();
+ }
+ //================================================================
+
+ //==================================================
+
+ void WxViewer::SetValue()
+ {
+ mslide->SetValue(mCurrent);
+ }
// BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
// END_EVENT_TABLE()
void* WxViewerPlayer::Entry()
{
- GimmickMessage(1,"WxViewerPlayer::Entry()"<<std::endl);
-
- while(true)
- {
- if(!TestDestroy())
+ GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
+
+ while(!TestDestroy())
{
+
mWxViewer->ShowNextImage();
- // mWxViewer->Refresh();
+ mWxViewer->SetValue();
::wxWakeUpIdle();
clock_t endwait;
endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
- while (clock() < endwait) {}
- }
- else
- {
- break;
- }
- /*
- for(i=mImagesToPlay.begin();i!=mImagesToPlay.end();++i)
- {
- if(i!=mImagesToPlay.end())
- {
-
- GimmickMessage(1,"ThreadedMovie next image"<<std::endl);
-
- ShowImage(*i);
- mParent->Refresh();
- endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
- while (clock() < endwait) {}
-
-
- }
- */
+ while (clock() < endwait ) {}
+
}
return 0;
}
//=====================================================================
void WxViewerPlayer::OnExit()
{
- GimmickMessage(1,"WxViewerPlayer::OnExit() "<<std::endl);
+ GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
}