X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src2%2FcreaImageIOWxViewer.cpp;h=2ee0ad589d08d773c687233721e2c7b69eb930fe;hb=b0843014c5482f70050fab8036c6780172e3b6c9;hp=63b2c887b9c9d7cec35464d076ffc45b8aace0a7;hpb=7c5180e6b19690ba9a264f2a66c04bc0a03c53ef;p=creaImageIO.git diff --git a/src2/creaImageIOWxViewer.cpp b/src2/creaImageIOWxViewer.cpp index 63b2c88..2ee0ad5 100644 --- a/src2/creaImageIOWxViewer.cpp +++ b/src2/creaImageIOWxViewer.cpp @@ -5,43 +5,33 @@ #include #include #include - +#include #include #include #include using namespace crea; - +// Memory tracking allocation namespace creaImageIO { - + //===================================================================== //===================================================================== - class ThreadedMovie: public wxThread + class WxViewerPlayer: public wxThread { public: - ThreadedMovie(std::vector 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 im); - void ShowImage(vtkImageData* v); - void StartIterator(); void OnExit(); - + private: - std::vector mImagesToPlay; - vtkImageViewer2* mViewer; - /// Associated wxvtk interactor - crea::creawxVTKRenderWindowInteractor *mInteractor; - std::vector::iterator i; - WxViewer* mParent; - - int mx1,mx2,my1,my2,mz1,mz2; - double mspx,mspy,mspz; + + WxViewer* mWxViewer; }; //===================================================================== @@ -53,66 +43,167 @@ namespace creaImageIO //===================================================================== // 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" <UseCaptureMouseOn(); mViewer = vtkImageViewer2::New(); mViewer->SetupInteractor ( mInteractor ); - mMovie=new ThreadedMovie(images, mViewer, mInteractor, this); + mCurrent = 0; + 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); - topsizer-> Add( mInteractor ,1,wxGROW ,0); - SetSizer( topsizer ); + Update(); Layout(); } + //===================================================================== + //===================================================================== /// Destructor WxViewer::~WxViewer() { - GimmickDebugMessage(1,"WxViewer::~WxViewer" + wxMutexLocker lock(mMutex); + GimmickDebugMessage(6,"WxViewer::~WxViewer" <Pause(); + mPlayer->Delete(); + mPlayer = 0; + } + delete mInteractor; + //delete mslide; + //delete mflexSizer; + //delete mtopSizer; + } + //===================================================================== + + //================================================================ + void WxViewer::SetImageVector(std::vector >& pointers) + { + wxMutexLocker lock(mMutex); + GimmickDebugMessage(6,"WxViewer::SetImageVector"<SetMax(pointers.size()); + // Refresh don't work, TO MODIFY + mslide->Refresh(); + mslide->ClearTicks(); + mslide->Hide(); + mslide->Show(); + StartPlayer(); } + //================================================================ + + void WxViewer::ShowNextImage() + { + wxMutexLocker lock(mMutex); + + + GimmickDebugMessage(10,"WxViewer::ShowNextImage() " + <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(5,"WxViewer::ShowImage" + GimmickDebugMessage(6,"WxViewer::ShowImage" <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 << "-----------------------------"<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) || @@ -133,104 +224,97 @@ namespace creaImageIO 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 : "<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->Render(); - mViewer->Render(); } - //================================================================ //================================================================ - - void WxViewer::AddImage(vtkImageData* im) + bool WxViewer::RefreshIfNecessary() { - images.push_back(im); - } + if (mNeedRefresh) + { + GimmickDebugMessage(10,"WxViewer : Refreshing"<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!!!!! "<Delete(); + mPlayer=0; } - - //================================================================ - //================================================================ - - void WxViewer::ClearImages() - { - images.clear(); - } - - //================================================================ - //================================================================ + //================================================== + void WxViewer::StartPlayer() + { + if(mcheck->IsChecked()) + { + // wxMutexLocker lock(mMutex); + if (mPlayer != 0) return; + mPlayer = new WxViewerPlayer(this); + mPlayer->Create(); + mPlayer->Run(); + } + else + { + ShowNextImage(); + } + } - bool WxViewer::ImagesEmpty() - { - return images.empty(); - } //================================================================ + + //================================================== + + 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() //================================================================ @@ -244,29 +328,21 @@ namespace creaImageIO //======================================================================== //======================================================================== - void* ThreadedMovie::Entry() + void* WxViewerPlayer::Entry() { - GimmickMessage(1,"ThreadedMovie::Entry()"<Refresh(); - endwait = clock () + 0.2 * CLOCKS_PER_SEC ; - while (clock() < endwait) {} - } - - } + GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<ShowNextImage(); + mWxViewer->SetValue(); + ::wxWakeUpIdle(); + clock_t endwait; + endwait = clock () + 0.2 * CLOCKS_PER_SEC ; + while (clock() < endwait ) {} + } return 0; } @@ -274,109 +350,11 @@ namespace creaImageIO //===================================================================== //===================================================================== - void ThreadedMovie::OnExit() - { - GimmickMessage(1,"Hello WORLD IM OUT!!!!!!!! "< im) - { - mImagesToPlay=im; - } - - //===================================================================== - - //===================================================================== - void ThreadedMovie::StartIterator() + void WxViewerPlayer::OnExit() { - i=mImagesToPlay.begin(); + GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<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 << "-----------------------------"<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 : "<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