2 #include <creaImageIOWxViewer.h>
3 #include <creaImageIOSystem.h>
6 #include <vtkRenderer.h>
7 #include <vtkImageData.h>
8 #include <creawxVTKRenderWindowInteractor.h>
9 #include <creaMessageManager.h>
15 // Memory tracking allocation
19 //=====================================================================
21 //=====================================================================
22 class WxViewerPlayer: public wxThread
25 WxViewerPlayer(WxViewer* v) :
37 //=====================================================================
43 //=====================================================================
45 WxViewer::WxViewer(wxWindow *parent,
55 wxMutexLocker lock(mMutex);
56 GimmickDebugMessage(6,"WxViewer::WxViewer"
60 mLastImageShown = NULL;
63 mInteractor = new crea::creawxVTKRenderWindowInteractor(this,-1);
64 mInteractor->UseCaptureMouseOn();
66 mViewer = vtkImageViewer2::New();
67 mViewer->SetupInteractor ( mInteractor );
72 // Grid to place checkbox and slider
73 mflexSizer = new wxFlexGridSizer(1,2,1,1);
75 mslide = new wxSlider(this,-1,0,0,1, wxDefaultPosition, wxSize(400,40), wxSL_HORIZONTAL | wxSL_LABELS);
76 Connect( mslide->GetId(), wxEVT_COMMAND_SLIDER_UPDATED , (wxObjectEventFunction) &WxViewer::OnSlide );
78 mcheck = new wxCheckBox(this,5123,crea::std2wx("Cine Loop"));
79 Connect( mcheck->GetId(), wxEVT_COMMAND_CHECKBOX_CLICKED , (wxObjectEventFunction) &WxViewer::OnCineLoop );
80 mcheck->SetValue(false);
81 mflexSizer->Add(mcheck,0, wxFIXED_MINSIZE);
82 mflexSizer-> Add( mslide,1,wxALIGN_CENTER | wxFIXED_MINSIZE );
84 // Sizer for Previewer and GridSizer
85 mtopSizer = new wxBoxSizer(wxVERTICAL);
86 mtopSizer->Add(mflexSizer,0);
87 mtopSizer-> Add( mInteractor ,1,wxGROW,0);
88 SetSizer(mtopSizer,true);
93 //=====================================================================
95 //=====================================================================
99 wxMutexLocker lock(mMutex);
100 GimmickDebugMessage(6,"WxViewer::~WxViewer"
102 // TO DO : desallocate cleanly
114 //=====================================================================
116 //================================================================
117 void WxViewer::SetImageVector(std::vector<boost::shared_ptr<ImagePointerHolder> >& pointers)
119 wxMutexLocker lock(mMutex);
120 GimmickDebugMessage(6,"WxViewer::SetImageVector"<<std::endl);
121 imagePointers=pointers;
123 mslide->SetMax(pointers.size());
124 // Refresh don't work, TO MODIFY
126 mslide->ClearTicks();
132 //================================================================
134 void WxViewer::ShowNextImage()
136 wxMutexLocker lock(mMutex);
139 GimmickDebugMessage(10,"WxViewer::ShowNextImage() "
141 <<imagePointers.size()<<std::endl);
143 if(imagePointers.size()>0)
145 if (mCurrent<imagePointers.size())
147 boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
148 //ImagePointerHolder* iph= imagePointers[mCurrent];
149 vtkImageData* currIm=iph->Get();
151 if ( currIm != mLastImageShown )
154 mLastImageShown = currIm;
161 //ImagePointerHolder* iph=imagePointers[mCurrent];
162 boost::shared_ptr<ImagePointerHolder> iph = imagePointers[mCurrent];
163 vtkImageData* currIm=iph->Get();
165 if ( currIm != mLastImageShown )
168 mLastImageShown = currIm;
174 //================================================================
176 //=====================================================================
177 void WxViewer::ShowImage(vtkImageData* im)
179 GimmickDebugMessage(6,"WxViewer::ShowImage"
183 mViewer->SetInput(im);
185 mViewer->SetSlice( 0 );
187 int x1,x2,y1,y2,z1,z2;
191 //std::cout << "in WxViewer::ShowImage PrintSelf() =";
192 //im->PrintSelf(std::cout, vtkIndent(2));
194 im->GetSpacing(spx,spy,spz);
195 //im->GetExtent (x1,x2,y1,y2,z1,z2); // JPR
196 im->GetWholeExtent (x1,x2,y1,y2,z1,z2);
198 std::cout << "in WxViewer::ShowImage GetWholeExtent ext =";
199 std::cout << " [x1]=" << x1;
200 std::cout << " [x2]=" << x2;
201 std::cout << " [y1]=" << y1;
202 std::cout << " [y2]=" << y2;
203 std::cout << " [z1]=" << z1;
204 std::cout << " [z2]=" << z2;
205 std::cout << std::endl;
228 double *range = im->GetScalarRange();
229 mViewer->SetColorWindow(range[1] - range[0]);
230 mViewer->SetColorLevel(0.5 * (range[1] + range[0]));
232 mViewer->GetRenderer()->ResetCamera();
235 mViewer->GetRenderer()->ComputeVisiblePropBounds(bounds);
237 mViewer->GetRenderer()->ResetCameraClippingRange(bounds);
238 mViewer->GetRenderer()->SetBackground(0.1,0.1,0.2);
241 //================================================================
243 //================================================================
244 bool WxViewer::RefreshIfNecessary()
248 GimmickDebugMessage(10,"WxViewer : Refreshing"<<std::endl);
250 mInteractor->Render();
251 mNeedRefresh = false;
256 //================================================================
258 //==================================================
259 void WxViewer::StopPlayer()
261 wxMutexLocker lock(mMutex);
262 if (mPlayer==0 ) return;
266 //================================================================
268 //==================================================
269 void WxViewer::StartPlayer()
271 if(mcheck->IsChecked())
273 // wxMutexLocker lock(mMutex);
274 if (mPlayer != 0) return;
275 mPlayer = new WxViewerPlayer(this);
285 //================================================================
287 //==================================================
289 void WxViewer::OnCineLoop(wxCommandEvent &Event)
291 if(!mcheck->IsChecked())
300 //================================================================
302 //==================================================
304 void WxViewer::OnSlide(wxCommandEvent &Event)
306 mCurrent = mslide->GetValue();
309 //================================================================
311 //==================================================
313 void WxViewer::SetValue()
315 mslide->SetValue(mCurrent);
318 // BEGIN_EVENT_TABLE(WxGimmickFrame, wxDialog)
320 //================================================================
322 //========================================================================
323 //========================================================================
324 //========================================================================
325 //========================================================================
326 //========================================================================
327 //========================================================================
328 //========================================================================
329 //========================================================================
331 void* WxViewerPlayer::Entry()
334 GimmickDebugMessage(6,"WxViewerPlayer::Entry()"<<std::endl);
336 while(!TestDestroy())
339 mWxViewer->ShowNextImage();
340 mWxViewer->SetValue();
343 endwait = clock () + 0.2 * CLOCKS_PER_SEC ;
344 while (clock() < endwait ) {}
350 //=====================================================================
352 //=====================================================================
353 void WxViewerPlayer::OnExit()
355 GimmickDebugMessage(6,"WxViewerPlayer::OnExit() "<<std::endl);
359 } // EO namespace creaImageIO