creaImageIOWxViewer.cpp

Go to the documentation of this file.
00001 
00002 #include <creaImageIOWxViewer.h>
00003 #include <creaImageIOSystem.h>
00004 #include <fstream>
00005 #include <vtkCamera.h>
00006 #include <vtkRenderer.h>
00007 #include <vtkImageData.h>
00008 #include <creawxVTKRenderWindowInteractor.h>
00009 #include <creaMessageManager.h>
00010 #include <stdio.h>
00011 #include <time.h>
00012 
00013 
00014 using namespace crea;
00015 
00016 namespace creaImageIO
00017 {
00018   
00019   //=====================================================================
00020 
00021   //=====================================================================
00022   class WxViewerPlayer: public wxThread
00023   {
00024   public:
00025     WxViewerPlayer(WxViewer* v) :
00026       mWxViewer(v)
00027     {}
00028     
00029     void* Entry();
00030     void  OnExit();
00031         
00032   private:
00033 
00034     WxViewer* mWxViewer;
00035   };
00036   
00037   //=====================================================================
00038 
00039 
00040 
00041   
00042 
00043   //=====================================================================
00044   // CTor
00045   WxViewer::WxViewer(wxWindow *parent, 
00046                      wxWindowID id,
00047                      wxString title,
00048                      const wxPoint& pos,
00049                      const wxSize& size)
00050     :   wxPanel( parent, 
00051                  id, 
00052                  pos,
00053                  size)
00054   {
00055     wxMutexLocker lock(mMutex);
00056     GimmickDebugMessage(6,"WxViewer::WxViewer"
00057                         <<std::endl);
00058 
00059     mNeedRefresh = false;
00060     mLastImageShown = NULL;
00061         
00062         // previewer    
00063     mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
00064     mInteractor->UseCaptureMouseOn();   
00065  
00066     mViewer     = vtkImageViewer2::New();
00067     mViewer->SetupInteractor ( mInteractor );
00068     
00069     mCurrent = 0;
00070         mPlayer = 0;
00071 
00072         // Grid to place checkbox and slider 
00073         mflexSizer = new wxFlexGridSizer(1,2,1,1);
00074         //Slider
00075         mslide = new wxSlider(this,-1,0,0,1, wxDefaultPosition, wxSize(400,40), wxSL_HORIZONTAL | wxSL_LABELS);
00076         Connect( mslide->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WxViewer::OnSlide ); 
00077         //CheckBox
00078         mcheck = new wxCheckBox(this,5123,crea::std2wx("Cine Loop"));
00079         Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &WxViewer::OnCineLoop ); 
00080         mcheck->SetValue(false);
00081         mflexSizer->Add(mcheck,0, wxFIXED_MINSIZE);
00082         mflexSizer-> Add( mslide,1,wxALIGN_CENTER | wxFIXED_MINSIZE );
00083 
00084         // Sizer for Previewer and GridSizer
00085         mtopSizer = new wxBoxSizer(wxVERTICAL);
00086         mtopSizer->Add(mflexSizer,0);
00087     mtopSizer-> Add( mInteractor ,1,wxGROW,0);
00088         SetSizer(mtopSizer,true);
00089         
00090         Update();  
00091     Layout(); 
00092   }
00093   //=====================================================================
00094 
00095   //=====================================================================
00097   WxViewer::~WxViewer()
00098   {
00099     wxMutexLocker lock(mMutex);
00100     GimmickDebugMessage(6,"WxViewer::~WxViewer"
00101                         <<std::endl);
00102     // TO DO : desallocate cleanly
00103         if(mPlayer)
00104         {
00105                 mPlayer->Pause();
00106                 mPlayer->Delete();
00107                 mPlayer = 0;
00108         }
00109         delete mInteractor;
00110         //delete mslide;
00111         //delete mflexSizer;
00112   }
00113   //=====================================================================
00114 
00115   //================================================================
00116    void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
00117   {
00118         wxMutexLocker lock(mMutex);
00119         GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
00120         imagePointers=pointers;
00121         
00122         mslide->SetMax(pointers.size());
00123         mslide->SetMin(1);
00124         // Refresh don't work, TO MODIFY
00125         mslide->Refresh();
00126         mslide->ClearTicks();
00127         mslide->Hide();
00128         mslide->Show();
00129         StartPlayer();
00130   }
00131 
00132   //================================================================
00133 
00134   void WxViewer::ShowNextImage()
00135   {
00136          
00137         
00138           mMutex.Unlock();
00139         wxMutexLocker lock(mMutex);
00140             
00141     GimmickMessage(2,"WxViewer::ShowNextImage() "
00142                    <<mCurrent+1<<"/"
00143                    <<imagePointers.size()<<std::endl);
00144     
00145     if(imagePointers.size()>0)
00146         {
00147                 if (mCurrent<imagePointers.size()) 
00148                 {
00149                         boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
00150                         //ImagePointerHolder* iph= imagePointers[mCurrent];
00151                         vtkImageData* currIm=iph->Get();
00152                         ShowImage(currIm);
00153                         if ( currIm != mLastImageShown ) 
00154                         {
00155                                 mNeedRefresh = true;
00156                                 mLastImageShown = currIm;
00157                         }
00158                 mCurrent++;
00159             }
00160                 else
00161                 {
00162                         mCurrent = 0;
00163                         //ImagePointerHolder* iph=imagePointers[mCurrent];
00164                         boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
00165                         vtkImageData* currIm=iph->Get();
00166                         ShowImage(currIm);
00167                         if ( currIm != mLastImageShown ) 
00168                         {
00169                                 mNeedRefresh = true;
00170                                 mLastImageShown = currIm;
00171                         }
00172                         mCurrent++;
00173                 }
00174         }
00175   }
00176   //================================================================
00177 
00178   //=====================================================================
00179   void WxViewer::ShowImage(vtkImageData* im)
00180   {
00181     GimmickDebugMessage(6,"WxViewer::ShowImage"
00182                         <<std::endl);
00183     if (im==0) return;
00184 
00185     mViewer->SetInput(im);
00186 
00187     mViewer->SetSlice( 0 );
00188 
00189     int x1,x2,y1,y2,z1,z2;
00190     double spx,spy,spz;
00191     im->Update();
00192 
00193 //std::cout << "in WxViewer::ShowImage PrintSelf() =";
00194 //im->PrintSelf(std::cout, vtkIndent(2));
00195 
00196     im->GetSpacing(spx,spy,spz);
00197     //im->GetExtent (x1,x2,y1,y2,z1,z2);  // JPR
00198     im->GetWholeExtent (x1,x2,y1,y2,z1,z2); 
00199 /*       
00200 std::cout << "in WxViewer::ShowImage GetWholeExtent ext =";
00201         std::cout << "   [x1]=" << x1;
00202         std::cout << "   [x2]=" << x2;
00203         std::cout << "   [y1]=" << y1;
00204         std::cout << "   [y2]=" << y2;
00205         std::cout << "   [z1]=" << z1;
00206         std::cout << "   [z2]=" << z2;
00207 std::cout << std::endl; 
00208 */   
00209     if ((x1!=mx1) ||
00210         (x2!=mx2) ||
00211         (y1!=my1) ||
00212         (y2!=my2) ||
00213         (z1!=mz1) ||
00214         (z2!=mz2) ||
00215         (spx!=mspx) ||
00216         (spy!=mspy) ||
00217         (spz!=mspz) 
00218         )
00219       {
00220         mx1 = x1;
00221         mx2 = x2;
00222         my1 = y1;
00223         my2 = y2;
00224         mz1 = z1;
00225         mz2 = z2;
00226         mspx = spx;
00227         mspy = spy;
00228         mspz = spz;
00229 
00230         double *range = im->GetScalarRange();
00231         mViewer->SetColorWindow(range[1] - range[0]);
00232         mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
00233 
00234         mViewer->GetRenderer()->ResetCamera();
00235         double bounds[6];
00236 
00237         mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
00238 
00239         mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
00240         mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);  
00241       }
00242   } 
00243   //================================================================
00244   
00245   //================================================================
00246   bool WxViewer::RefreshIfNecessary()
00247   {
00248     if (mNeedRefresh)
00249       {
00250         GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
00251 
00252         mInteractor->Render();
00253         mNeedRefresh = false;
00254         return true;
00255       }
00256     return false;
00257   }
00258   //================================================================
00259   
00260   //==================================================
00261   void WxViewer::StopPlayer()
00262   {
00263           wxMutexLocker lock(mMutex);
00264           if (mPlayer==0 ) return;
00265           mPlayer->Delete();  
00266           mPlayer=0;
00267           mMutex.Unlock();
00268   }
00269   //================================================================
00270   
00271   //==================================================
00272   void WxViewer::StartPlayer()
00273         {
00274                 if(mcheck->IsChecked())
00275                 {
00276                         //      wxMutexLocker lock(mMutex);
00277                         if (mPlayer != 0) return;
00278                         mPlayer = new WxViewerPlayer(this);
00279                         mPlayer->Create();
00280                         mPlayer->Run();  
00281                 }
00282                 else
00283                 {
00284                         ShowNextImage();
00285                 }
00286         }
00287 
00288   //================================================================
00289   
00290   //==================================================
00291 
00292     void WxViewer::OnCineLoop(wxCommandEvent &Event)
00293         {
00294                 if(!mcheck->IsChecked())
00295                 {
00296                         mPlayer->Pause();
00297                         mPlayer->Delete();
00298                         mPlayer = 0;
00299                 }
00300                 StartPlayer();
00301         }
00302         
00303  //================================================================
00304   
00305   //==================================================
00306         
00307         void WxViewer::OnSlide(wxCommandEvent &Event)
00308          {
00309                  mCurrent = mslide->GetValue() -1;
00310                  StartPlayer();
00311          }
00312          //================================================================
00313   
00314   //==================================================
00315 
00316          void WxViewer::SetValue()
00317          {
00318                  mslide->SetValue(mCurrent);
00319          }
00320 
00321   //  BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
00322   //    END_EVENT_TABLE()
00323   //================================================================
00324 
00325 //========================================================================
00326 //========================================================================
00327 //========================================================================
00328 //========================================================================
00329 //========================================================================
00330 //========================================================================
00331 //========================================================================
00332 //========================================================================
00333 
00334   void*  WxViewerPlayer::Entry()
00335   {
00336           
00337     GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
00338         
00339         while(!TestDestroy())
00340             { 
00341                         
00342                         mWxViewer->ShowNextImage();
00343                         mWxViewer->SetValue();
00344                         ::wxWakeUpIdle();
00345                         clock_t endwait;
00346                         endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
00347                         while (clock() < endwait ) {}
00348                         
00349       }
00350     return 0;
00351   }
00352 
00353   //=====================================================================
00354 
00355   //=====================================================================
00356   void WxViewerPlayer::OnExit()
00357   {
00358     GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
00359   }
00360 
00361  
00362 } // EO namespace creaImageIO
00363