]> Creatis software - creaImageIO.git/blobdiff - src/creaImageIOWxViewer.cpp
move directory
[creaImageIO.git] / src / creaImageIOWxViewer.cpp
diff --git a/src/creaImageIOWxViewer.cpp b/src/creaImageIOWxViewer.cpp
new file mode 100644 (file)
index 0000000..c0180a0
--- /dev/null
@@ -0,0 +1,362 @@
+
+#include <creaImageIOWxViewer.h>
+#include <creaImageIOSystem.h>
+#include <fstream>
+#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 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"
+                       <<std::endl);
+
+    mNeedRefresh = false;
+    mLastImageShown = NULL;
+       
+       // previewer    
+    mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
+    mInteractor->UseCaptureMouseOn();  
+    mViewer    = vtkImageViewer2::New();
+    mViewer->SetupInteractor ( mInteractor );
+    
+    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);
+       
+       Update();  
+    Layout(); 
+  }
+  //=====================================================================
+
+  //=====================================================================
+  /// Destructor
+  WxViewer::~WxViewer()
+  {
+    wxMutexLocker lock(mMutex);
+    GimmickDebugMessage(6,"WxViewer::~WxViewer"
+                       <<std::endl);
+    // TO DO : desallocate cleanly
+       if(mPlayer)
+       {
+               mPlayer->Pause();
+               mPlayer->Delete();
+               mPlayer = 0;
+       }
+       delete mInteractor;
+       //delete mslide;
+       //delete mflexSizer;
+  }
+  //=====================================================================
+
+  //================================================================
+   void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
+  {
+       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()
+  {
+        
+       
+         mMutex.Unlock();
+       wxMutexLocker lock(mMutex);
+       
+           
+    GimmickMessage(2,"WxViewer::ShowNextImage() "
+                  <<mCurrent+1<<"/"
+                  <<imagePointers.size()<<std::endl);
+    
+    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(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);  // 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) ||
+       (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);
+       mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);  
+      }
+  } 
+  //================================================================
+  
+  //================================================================
+  bool WxViewer::RefreshIfNecessary()
+  {
+    if (mNeedRefresh)
+      {
+       GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
+
+       mInteractor->Render();
+       mNeedRefresh = false;
+       return true;
+      }
+    return false;
+  }
+  //================================================================
+  
+  //==================================================
+  void WxViewer::StopPlayer()
+  {
+         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()
+  {
+         
+    GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
+       
+       while(!TestDestroy())
+           { 
+                       
+                       mWxViewer->ShowNextImage();
+                       mWxViewer->SetValue();
+                       ::wxWakeUpIdle();
+                       clock_t endwait;
+                       endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
+                       while (clock() < endwait ) {}
+                       
+      }
+    return 0;
+  }
+
+  //=====================================================================
+
+  //=====================================================================
+  void WxViewerPlayer::OnExit()
+  {
+    GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
+  }
+
+} // EO namespace creaImageIO
+