2 # ---------------------------------------------------------------------
4 # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image
6 # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton
7 # Previous Authors : Laurent Guigues, Jean-Pierre Roux
8 # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil
10 # This software is governed by the CeCILL-B license under French law and
11 # abiding by the rules of distribution of free software. You can use,
12 # modify and/ or redistribute the software under the terms of the CeCILL-B
13 # license as circulated by CEA, CNRS and INRIA at the following URL
14 # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
15 # or in the file LICENSE.txt.
17 # As a counterpart to the access to the source code and rights to copy,
18 # modify and redistribute granted by the license, users are provided only
19 # with a limited warranty and the software's author, the holder of the
20 # economic rights, and the successive licensors have only limited
23 # The fact that you are presently reading this means that you have had
24 # knowledge of the CeCILL-B license and that you accept its terms.
25 # ------------------------------------------------------------------------
28 #include <creaImageIOWxViewer.h>
29 #include <creaImageIOSystem.h>
31 #include <vtkCamera.h>
32 #include <vtkRenderer.h>
33 #include <vtkImageData.h>
34 #include <creawxVTKRenderWindowInteractor.h>
35 #include <creaMessageManager.h>
45 //=====================================================================
47 //=====================================================================
48 class WxViewerPlayer: public wxThread
51 WxViewerPlayer(WxViewer* v) :
63 //=====================================================================
69 //=====================================================================
71 WxViewer::WxViewer(wxWindow *parent,
81 wxMutexLocker lock(mMutex);
82 GimmickDebugMessage(6,"WxViewer::WxViewer"
86 mLastImageShown = NULL;
89 mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
90 mInteractor->UseCaptureMouseOn();
92 mViewer = vtkImageViewer2::New();
93 mViewer->SetupInteractor ( mInteractor );
98 // Grid to place checkbox and slider
99 mflexSizer = new wxFlexGridSizer(1,2,1,1);
101 mslide = new wxSlider(this,-1,0,0,1, wxDefaultPosition, wxSize(400,40), wxSL_HORIZONTAL | wxSL_LABELS);
102 Connect( mslide->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WxViewer::OnSlide );
104 mcheck = new wxCheckBox(this,5123,crea::std2wx("Cine Loop"));
105 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &WxViewer::OnCineLoop );
106 mcheck->SetValue(false);
107 mflexSizer->Add(mcheck,0, wxFIXED_MINSIZE);
108 mflexSizer-> Add( mslide,1,wxALIGN_CENTER | wxFIXED_MINSIZE );
110 // Sizer for Previewer and GridSizer
111 mtopSizer = new wxBoxSizer(wxVERTICAL);
112 mtopSizer->Add(mflexSizer,0);
113 mtopSizer-> Add( mInteractor ,1,wxGROW,0);
114 SetSizer(mtopSizer,true);
119 //=====================================================================
121 //=====================================================================
123 WxViewer::~WxViewer()
125 wxMutexLocker lock(mMutex);
126 GimmickDebugMessage(6,"WxViewer::~WxViewer"
128 // TO DO : desallocate cleanly
139 //=====================================================================
141 //================================================================
142 void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
144 wxMutexLocker lock(mMutex);
145 GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
146 imagePointers=pointers;
148 mslide->SetMax(pointers.size());
150 // Refresh don't work, TO MODIFY
152 mslide->ClearTicks();
158 //================================================================
160 void WxViewer::ShowNextImage()
165 wxMutexLocker lock(mMutex);
167 GimmickMessage(2,"WxViewer::ShowNextImage() "
169 <<imagePointers.size()<<std::endl);
171 if(imagePointers.size()>0)
173 if (mCurrent<imagePointers.size())
175 boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
176 //ImagePointerHolder* iph= imagePointers[mCurrent];
177 vtkImageData* currIm=iph->Get();
179 if ( currIm != mLastImageShown )
182 mLastImageShown = currIm;
189 //ImagePointerHolder* iph=imagePointers[mCurrent];
190 boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
191 vtkImageData* currIm=iph->Get();
193 if ( currIm != mLastImageShown )
196 mLastImageShown = currIm;
202 //================================================================
204 //=====================================================================
205 void WxViewer::ShowImage(vtkImageData* im)
207 GimmickDebugMessage(6,"WxViewer::ShowImage"
211 mViewer->SetInput(im);
213 mViewer->SetSlice( 0 );
215 int x1,x2,y1,y2,z1,z2;
219 //std::cout << "in WxViewer::ShowImage PrintSelf() =";
220 //im->PrintSelf(std::cout, vtkIndent(2));
222 im->GetSpacing(spx,spy,spz);
223 //im->GetExtent (x1,x2,y1,y2,z1,z2); // JPR
224 im->GetWholeExtent (x1,x2,y1,y2,z1,z2);
226 std::cout << "in WxViewer::ShowImage GetWholeExtent ext =";
227 std::cout << " [x1]=" << x1;
228 std::cout << " [x2]=" << x2;
229 std::cout << " [y1]=" << y1;
230 std::cout << " [y2]=" << y2;
231 std::cout << " [z1]=" << z1;
232 std::cout << " [z2]=" << z2;
233 std::cout << std::endl;
256 double *range = im->GetScalarRange();
257 mViewer->SetColorWindow(range[1] - range[0]);
258 mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
260 mViewer->GetRenderer()->ResetCamera();
262 //EED 21 mars 2012 FLIP problem ..PLOP..
263 vtkCamera *camera =mViewer->GetRenderer()->GetActiveCamera();
264 camera->SetViewUp ( 0 , -1 , 0 );
265 camera->SetPosition ((x1+x2)/2 , (y1+y2)/2 , -10000);
266 camera->SetFocalPoint ((x1+x2)/2 , (y1+y2)/2 , 0 );
267 camera->SetParallelScale( (x2-x1)/3.0 );
272 mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
274 mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
275 mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);
278 //================================================================
280 //================================================================
281 bool WxViewer::RefreshIfNecessary()
285 GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
287 mInteractor->Render();
288 mNeedRefresh = false;
293 //================================================================
295 //==================================================
296 void WxViewer::StopPlayer()
298 wxMutexLocker lock(mMutex);
299 if (mPlayer==0 ) return;
304 //================================================================
306 //==================================================
307 void WxViewer::StartPlayer()
309 if(mcheck->IsChecked())
311 // wxMutexLocker lock(mMutex);
312 if (mPlayer != 0) return;
313 mPlayer = new WxViewerPlayer(this);
323 //================================================================
325 //==================================================
327 void WxViewer::OnCineLoop(wxCommandEvent &Event)
329 if(!mcheck->IsChecked())
338 //================================================================
340 //==================================================
342 void WxViewer::OnSlide(wxCommandEvent &Event)
344 mCurrent = mslide->GetValue() -1;
347 //================================================================
349 //==================================================
351 void WxViewer::SetValue()
353 mslide->SetValue(mCurrent);
356 // BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
358 //================================================================
360 //========================================================================
361 //========================================================================
362 //========================================================================
363 //========================================================================
364 //========================================================================
365 //========================================================================
366 //========================================================================
367 //========================================================================
369 void* WxViewerPlayer::Entry()
372 GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
374 while(!TestDestroy())
377 mWxViewer->ShowNextImage();
378 mWxViewer->SetValue();
381 endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
382 while (clock() < endwait ) {}
388 //=====================================================================
390 //=====================================================================
391 void WxViewerPlayer::OnExit()
393 GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
397 } // EO namespace creaImageIO