]> Creatis software - creaImageIO.git/blobdiff - src2/creaImageIOWxViewer.cpp
bug linux correction.
[creaImageIO.git] / src2 / creaImageIOWxViewer.cpp
index f8ae7b917f26ea326f15948c1afc39dedcb7dad7..46ba59aa60c773179e0230047085bb3c39af9a80 100644 (file)
@@ -5,7 +5,7 @@
 #include <vtkCamera.h>
 #include <vtkRenderer.h>
 #include <vtkImageData.h>
-
+#include <creawxVTKRenderWindowInteractor.h>
 #include <creaMessageManager.h>
 #include <stdio.h>
 #include <time.h>
@@ -15,96 +15,196 @@ 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);
-    wxBoxSizer *topsizer = new wxBoxSizer(wxVERTICAL);
 
+    mNeedRefresh = false;
+    mLastImageShown = NULL;
        
-        // previewer
-       
-       mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
+       // previewer    
+    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;
+
+       // 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"
                        <<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()
+  {
+        
+       #if WIN32       
+       wxMutexLocker lock(mMutex);
+       #endif
+           
+    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)
   {
-       mViewer->SetInput(im);
-       mViewer->SetSlice( 0 );
+    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;
+    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) ||
@@ -125,104 +225,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 : "<<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);  
       }
-    
-    
-       
   } 
-
   //================================================================
   
   //================================================================
-
-  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()
+       {
+               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()
   //================================================================
@@ -236,135 +329,33 @@ namespace creaImageIO
 //========================================================================
 //========================================================================
 
-  void*  ThreadedMovie::Entry()
+  void*  WxViewerPlayer::Entry()
   {
          
+    GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
+       
+       while(!TestDestroy())
+           { 
                        
-       while(true)
-       {               
+                       mWxViewer->ShowNextImage();
+                       mWxViewer->SetValue();
+                       ::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;
-  }
-
-  //=====================================================================
-
-  //=====================================================================
-  void ThreadedMovie::OnExit()
-  {
-    GimmickMessage(1,"Hello WORLD IM OUT!!!!!!!! "<<std::endl);
+                       endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
+                       while (clock() < endwait ) {}
+                       
+      }
+    return 0;
   }
 
-   //=====================================================================
-
   //=====================================================================
-  void ThreadedMovie::SetImagesToPlay(std::vector<vtkImageData*> im)
-  {
-               mImagesToPlay=im;
-  }
-
-    //=====================================================================
 
   //=====================================================================
-  void ThreadedMovie::StartIterator()
+  void WxViewerPlayer::OnExit()
   {
-               i=mImagesToPlay.begin();
+    GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
   }
-                       
-  //=====================================================================
 
-  //=====================================================================
  
-  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