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 //=====================================================================
49 void Delete() { printf("EED wxThreadEED3::Delete() \n"); }
50 int Run() { printf("EED wxThreadEED3::Run() \n"); return 0;}
51 void Pause() { printf("EED wxThreadEED3::Pause() \n"); }
52 void Create() { printf("EED wxThreadEED3::Create() \n"); }
53 bool IsAlive() { printf("EED wxThreadEED3::IsAlive() \n"); return false; }
54 bool TestDestroy() { printf("EED wxThreadEED3::TestDestroy() \n"); return false; }
55 int GetCurrentId() { printf("EED wxThreadEED3::GetCurrentId() \n"); return -999; }
59 //=====================================================================
61 // class WxViewerPlayer: public wxThreadEED3
62 class WxViewerPlayer: public wxThread
65 WxViewerPlayer(WxViewer* v) :
77 //=====================================================================
83 //=====================================================================
85 WxViewer::WxViewer(wxWindow *parent,
95 wxMutexLocker lock(mMutex);
96 GimmickDebugMessage(6,"WxViewer::WxViewer" <<std::endl);
99 mLastImageShown = NULL;
102 mInteractor = new crea::wxVTKRenderWindowInteractor(this,-1);
103 mInteractor->UseCaptureMouseOn();
105 mViewer = vtkImageViewer2::New();
106 mViewer->SetupInteractor ( mInteractor );
111 // Grid to place checkbox and slider
112 mflexSizer = new wxFlexGridSizer(1,2,1,1);
114 mslide = new wxSlider(this,-1,0,0,1, wxDefaultPosition, wxSize(400,40), wxSL_HORIZONTAL | wxSL_LABELS);
115 Connect( mslide->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WxViewer::OnSlide );
117 mcheck = new wxCheckBox(this,5123,crea::std2wx("Cine Loop"));
118 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &WxViewer::OnCineLoop );
119 mcheck->SetValue(false);
120 mflexSizer->Add(mcheck,0, wxFIXED_MINSIZE);
121 mflexSizer-> Add( mslide,1,wxALIGN_CENTER | wxFIXED_MINSIZE );
123 // Sizer for Previewer and GridSizer
124 mtopSizer = new wxBoxSizer(wxVERTICAL);
125 mtopSizer->Add(mflexSizer,0);
126 mtopSizer-> Add( mInteractor ,1,wxGROW,0);
127 SetSizer(mtopSizer,true);
132 //=====================================================================
134 //=====================================================================
136 WxViewer::~WxViewer()
138 wxMutexLocker lock(mMutex);
139 GimmickDebugMessage(6,"WxViewer::~WxViewer"<<std::endl);
140 // TO DO : desallocate cleanly
151 //=====================================================================
153 //================================================================
154 void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
156 wxMutexLocker lock(mMutex);
157 GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
158 imagePointers=pointers;
160 mslide->SetMax((int)pointers.size());
162 // Refresh don't work, TO MODIFY
164 mslide->ClearTicks();
170 //================================================================
172 void WxViewer::ShowNextImage()
175 wxMutexLocker lock(mMutex);
177 GimmickMessage(2,"WxViewer::ShowNextImage() "
179 <<imagePointers.size()<<std::endl);
181 if(imagePointers.size()>0)
183 if (mCurrent<imagePointers.size())
185 boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
186 //ImagePointerHolder* iph= imagePointers[mCurrent];
187 vtkImageData* currIm=iph->Get();
189 if ( currIm != mLastImageShown )
192 mLastImageShown = currIm;
197 //ImagePointerHolder* iph=imagePointers[mCurrent];
198 boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
199 vtkImageData* currIm=iph->Get();
201 if ( currIm != mLastImageShown )
204 mLastImageShown = currIm;
208 } // if imagePointers
210 //================================================================
212 //=====================================================================
213 void WxViewer::ShowImage(vtkImageData* im)
215 GimmickDebugMessage(6,"WxViewer::ShowImage"
219 //EED 2017-01-01 Migration VTK7
220 #if VTK_MAJOR_VERSION <= 5
221 mViewer->SetInput(im);
223 mViewer->SetInputData(im);
226 mViewer->SetSlice( 0 );
228 int x1,x2,y1,y2,z1,z2;
230 //EED 2017-01-01 Migration VTK7
231 #if VTK_MAJOR_VERSION <= 5
238 //std::cout << "in WxViewer::ShowImage PrintSelf() =";
239 //im->PrintSelf(std::cout, vtkIndent(2));
241 im->GetSpacing(spx,spy,spz);
242 //im->GetExtent (x1,x2,y1,y2,z1,z2); // JPR
245 //EED 2017-01-01 Migration VTK7
246 #if VTK_MAJOR_VERSION <= 5
247 im->GetWholeExtent (x1,x2,y1,y2,z1,z2);
249 im->GetExtent (x1,x2,y1,y2,z1,z2);
254 std::cout << "in WxViewer::ShowImage GetWholeExtent ext =";
255 std::cout << " [x1]=" << x1;
256 std::cout << " [x2]=" << x2;
257 std::cout << " [y1]=" << y1;
258 std::cout << " [y2]=" << y2;
259 std::cout << " [z1]=" << z1;
260 std::cout << " [z2]=" << z2;
261 std::cout << std::endl;
284 double *range = im->GetScalarRange();
285 mViewer->SetColorWindow(range[1] - range[0]);
286 mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
288 mViewer->GetRenderer()->ResetCamera();
290 //EED 21 mars 2012 FLIP problem ..PLOP..
291 vtkCamera *camera =mViewer->GetRenderer()->GetActiveCamera();
292 camera->SetViewUp ( 0 , -1 , 0 );
293 camera->SetPosition ((x1+x2)/2 , (y1+y2)/2 , -10000);
294 camera->SetFocalPoint ((x1+x2)/2 , (y1+y2)/2 , 0 );
295 camera->SetParallelScale( (x2-x1)/3.0 );
300 mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
302 mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
303 mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);
306 //================================================================
308 //================================================================
309 bool WxViewer::RefreshIfNecessary()
311 if (mNeedRefresh==true)
313 GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
314 mInteractor->Render();
315 mNeedRefresh = false;
320 //================================================================
322 //==================================================
323 void WxViewer::StopPlayer()
325 wxMutexLocker lock(mMutex);
326 if (mPlayer==NULL ) return;
331 //================================================================
333 //==================================================
334 void WxViewer::StartPlayer()
336 if(mcheck->IsChecked())
338 // wxMutexLocker lock(mMutex);
339 if (mPlayer != NULL) return;
340 mPlayer = new WxViewerPlayer(this);
348 //================================================================
350 //==================================================
352 void WxViewer::OnCineLoop(wxCommandEvent &Event)
354 if(!mcheck->IsChecked())
363 //================================================================
365 //==================================================
367 void WxViewer::OnSlide(wxCommandEvent &Event)
369 mCurrent = mslide->GetValue() -1;
372 //================================================================
374 //==================================================
376 void WxViewer::SetValue()
378 mslide->SetValue(mCurrent);
381 // BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
383 //================================================================
385 //========================================================================
386 //========================================================================
387 //========================================================================
388 //========================================================================
389 //========================================================================
390 //========================================================================
391 //========================================================================
392 //========================================================================
394 void* WxViewerPlayer::Entry()
397 GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
399 while(!TestDestroy())
402 mWxViewer->ShowNextImage();
403 mWxViewer->SetValue();
406 endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
407 while (clock() < endwait ) {}
413 //=====================================================================
415 //=====================================================================
416 void WxViewerPlayer::OnExit()
418 GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
422 } // EO namespace creaImageIO