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>
31 #include <vtkCamera.h>
32 #include <vtkRenderer.h>
33 #include <vtkImageData.h>
34 #include <creaMessageManager.h>
44 //=====================================================================
46 //=====================================================================
47 class WxViewerPlayer: public wxThread
50 WxViewerPlayer(WxViewer* v) :
62 //=====================================================================
68 //=====================================================================
70 WxViewer::WxViewer(wxWindow *parent,
80 wxMutexLocker lock(mMutex);
81 GimmickDebugMessage(6,"WxViewer::WxViewer"
85 mLastImageShown = NULL;
88 mInteractor = new crea::wxVTKRenderWindowInteractor(this,-1);
89 mInteractor->UseCaptureMouseOn();
91 mViewer = vtkImageViewer2::New();
92 mViewer->SetupInteractor ( mInteractor );
97 // Grid to place checkbox and slider
98 mflexSizer = new wxFlexGridSizer(1,2,1,1);
100 mslide = new wxSlider(this,-1,0,0,1, wxDefaultPosition, wxSize(400,40), wxSL_HORIZONTAL | wxSL_LABELS);
101 Connect( mslide->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WxViewer::OnSlide );
103 mcheck = new wxCheckBox(this,5123,crea::std2wx("Cine Loop"));
104 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &WxViewer::OnCineLoop );
105 mcheck->SetValue(false);
106 mflexSizer->Add(mcheck,0, wxFIXED_MINSIZE);
107 mflexSizer-> Add( mslide,1,wxALIGN_CENTER | wxFIXED_MINSIZE );
109 // Sizer for Previewer and GridSizer
110 mtopSizer = new wxBoxSizer(wxVERTICAL);
111 mtopSizer->Add(mflexSizer,0);
112 mtopSizer-> Add( mInteractor ,1,wxGROW,0);
113 SetSizer(mtopSizer,true);
118 //=====================================================================
120 //=====================================================================
122 WxViewer::~WxViewer()
124 wxMutexLocker lock(mMutex);
125 GimmickDebugMessage(6,"WxViewer::~WxViewer"
127 // TO DO : desallocate cleanly
138 //=====================================================================
140 //================================================================
141 void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
143 wxMutexLocker lock(mMutex);
144 GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
145 imagePointers=pointers;
147 mslide->SetMax((int)pointers.size());
149 // Refresh don't work, TO MODIFY
151 mslide->ClearTicks();
157 //================================================================
159 void WxViewer::ShowNextImage()
164 wxMutexLocker lock(mMutex);
166 GimmickMessage(2,"WxViewer::ShowNextImage() "
168 <<imagePointers.size()<<std::endl);
170 if(imagePointers.size()>0)
172 if (mCurrent<imagePointers.size())
174 boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
175 //ImagePointerHolder* iph= imagePointers[mCurrent];
176 vtkImageData* currIm=iph->Get();
178 if ( currIm != mLastImageShown )
181 mLastImageShown = currIm;
188 //ImagePointerHolder* iph=imagePointers[mCurrent];
189 boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
190 vtkImageData* currIm=iph->Get();
192 if ( currIm != mLastImageShown )
195 mLastImageShown = currIm;
201 //================================================================
203 //=====================================================================
204 void WxViewer::ShowImage(vtkImageData* im)
206 GimmickDebugMessage(6,"WxViewer::ShowImage"
210 mViewer->SetInput(im);
212 mViewer->SetSlice( 0 );
214 int x1,x2,y1,y2,z1,z2;
218 //std::cout << "in WxViewer::ShowImage PrintSelf() =";
219 //im->PrintSelf(std::cout, vtkIndent(2));
221 im->GetSpacing(spx,spy,spz);
222 //im->GetExtent (x1,x2,y1,y2,z1,z2); // JPR
223 im->GetWholeExtent (x1,x2,y1,y2,z1,z2);
225 std::cout << "in WxViewer::ShowImage GetWholeExtent ext =";
226 std::cout << " [x1]=" << x1;
227 std::cout << " [x2]=" << x2;
228 std::cout << " [y1]=" << y1;
229 std::cout << " [y2]=" << y2;
230 std::cout << " [z1]=" << z1;
231 std::cout << " [z2]=" << z2;
232 std::cout << std::endl;
255 double *range = im->GetScalarRange();
256 mViewer->SetColorWindow(range[1] - range[0]);
257 mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
259 mViewer->GetRenderer()->ResetCamera();
261 //EED 21 mars 2012 FLIP problem ..PLOP..
262 vtkCamera *camera =mViewer->GetRenderer()->GetActiveCamera();
263 camera->SetViewUp ( 0 , -1 , 0 );
264 camera->SetPosition ((x1+x2)/2 , (y1+y2)/2 , -10000);
265 camera->SetFocalPoint ((x1+x2)/2 , (y1+y2)/2 , 0 );
266 camera->SetParallelScale( (x2-x1)/3.0 );
271 mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
273 mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
274 mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);
277 //================================================================
279 //================================================================
280 bool WxViewer::RefreshIfNecessary()
284 GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
286 mInteractor->Render();
287 mNeedRefresh = false;
292 //================================================================
294 //==================================================
295 void WxViewer::StopPlayer()
297 wxMutexLocker lock(mMutex);
298 if (mPlayer==0 ) return;
303 //================================================================
305 //==================================================
306 void WxViewer::StartPlayer()
308 if(mcheck->IsChecked())
310 // wxMutexLocker lock(mMutex);
311 if (mPlayer != 0) return;
312 mPlayer = new WxViewerPlayer(this);
322 //================================================================
324 //==================================================
326 void WxViewer::OnCineLoop(wxCommandEvent &Event)
328 if(!mcheck->IsChecked())
337 //================================================================
339 //==================================================
341 void WxViewer::OnSlide(wxCommandEvent &Event)
343 mCurrent = mslide->GetValue() -1;
346 //================================================================
348 //==================================================
350 void WxViewer::SetValue()
352 mslide->SetValue(mCurrent);
355 // BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
357 //================================================================
359 //========================================================================
360 //========================================================================
361 //========================================================================
362 //========================================================================
363 //========================================================================
364 //========================================================================
365 //========================================================================
366 //========================================================================
368 void* WxViewerPlayer::Entry()
371 GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
373 while(!TestDestroy())
376 mWxViewer->ShowNextImage();
377 mWxViewer->SetValue();
380 endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
381 while (clock() < endwait ) {}
387 //=====================================================================
389 //=====================================================================
390 void WxViewerPlayer::OnExit()
392 GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
396 } // EO namespace creaImageIO