/*========================================================================= Program: bbtk Module: $RCSfile: bbwxvtkViewer2D.cxx,v $ Language: C++ Date: $Date: 2008/10/14 11:47:30 $ Version: $Revision: 1.17 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or http://www.creatis.insa-lyon.fr/Public/bbtk/License.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =========================================================================*/ /** * \file * \brief */ #ifdef _USE_WXWIDGETS_ #include "bbwxvtkViewer2D.h" #include "bbwxvtkPackage.h" //#include #include "vtkInteractorStyleImage.h" #include "vtkCamera.h" #include "vtkRenderer.h" #include #include namespace bbwxvtk { BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D); Viewer2DWidget::Viewer2DWidget(Viewer2D* box, wxWindow *parent) : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL), mBox(box) { wxPanel *panel = this; wxvtkrenderwindowinteractor = new wxVTKRenderWindowInteractor(panel,-1); wxvtkrenderwindowinteractor->UseCaptureMouseOn(); imageViewer = vtkImageViewer2::New(); imageViewer->SetSlice( 1 ); imageViewer->SetupInteractor ( wxvtkrenderwindowinteractor ); mDefaultImage = vtkImageData::New(); int dim[3]; dim[0] = dim[1] = 32 ; dim[2] = 2; mDefaultImage->SetDimensions ( dim ); mDefaultImage->SetSpacing(1,1,1); mDefaultImage->SetExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1); mDefaultImage->SetWholeExtent(0,dim[0]-1,0,dim[1]-1,0,dim[2]-1); mDefaultImage->SetScalarTypeToUnsignedChar(); mDefaultImage->AllocateScalars(); for (int i=0;iSetScalarComponentFromFloat(i,j,k,0,0); for (int i=0;iSetScalarComponentFromFloat(dim[0]-i-1,i,0,0,255); mDefaultImage->SetScalarComponentFromFloat(i,i,1,0,255); } backImageData = mDefaultImage; imageViewer->SetInput( backImageData ); mUpdateCamera = true; wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); sizer-> Add( wxvtkrenderwindowinteractor , 1, wxEXPAND, 0); panel-> SetSizer(sizer); panel-> SetAutoLayout(true); panel-> Layout(); wxvtkrenderwindowinteractor->Refresh(); wxvtkrenderwindowinteractor->Render(); imageViewer->GetRenderer()->ResetCameraClippingRange(); } //------------------------------------------------------------------------- Viewer2DWidget::~Viewer2DWidget() { // delete wxvtkrenderwindowinteractor; // pourquoi pas wxvtkrenderwindowinteractor->Delete(); // JP // LG : because it has been allocated with operator new not method ::New // we want to force its destruction without taking care of vtk ref counting // on the contrary the following vtk objects are deleted with vtk Delete // std::cout << "Viewer2DWidget::~Viewer2DWidget()" << std::endl; mDefaultImage->Delete(); if (backImageData) { // backImageData->UnRegister(NULL); } if (imageViewer) { imageViewer->Delete(); } delete wxvtkrenderwindowinteractor; // std::cout << "Viewer2DWidget::~Viewer2DWidget() OK" << std::endl; } //------------------------------------------------------------------------- void Viewer2DWidget::UpdateView() { // std::cout << "Viewer2DWidget::UpdateView() "<bbGetFullName() << std::endl; // std::cout << "slice="<bbGetInputSlice()<bbGetInputIn() == NULL ) && ( backImageData != mDefaultImage ) ) { backImageData = mDefaultImage; mUpdateCamera = true; } else if ( ( mBox->bbGetInputIn() != NULL ) && (backImageData != mBox->bbGetInputIn()) ) { backImageData = mBox->bbGetInputIn(); backImageData->Update(); imageViewer->SetInput( backImageData ); mUpdateCamera = true; } if (mUpdateCamera) { int x1,x2,y1,y2,z1,z2; double spx,spy,spz; backImageData->GetSpacing(spx,spy,spz); backImageData->GetExtent (x1,x2,y1,y2,z1,z2); // bbtkMessage("Output",2,"Viewer2D '"<bbGetName()<<"' - Image :"<GetRenderer()->GetActiveCamera(); camera->SetViewUp ( spx*0, -spy*1, spz*0 ); camera->SetPosition ( spx*(x1+x2)/2, spy*(y1+y2)/2, -spz*10000000 ); camera->SetFocalPoint( spx*(x1+x2)/2, spy*(y1+y2)/2, spz*0 ); camera->ComputeViewPlaneNormal(); camera->SetParallelScale( spx*(x2-x1)/2.0 ); // // imageViewer->GetRenderer()->ResetCamera(x1,x2,y1,y2,z1,z2); mUpdateCamera = false; } // std::cout << "OW = "<< mBox->bbGetWindow() << std::endl; // std::cout << "CW = "<< mBox->bbGetContainingWindow() << std::endl; // std::cout << "Sh = "<< mBox->bbIsShown() << std::endl; int orientation = mBox->bbGetInputOrientation(); if (orientation<0 || orientation>2) orientation=2; // Why not? // mBox->bbIsShown() is necessary to be sure that the wxWindow is already // created and displayed. // Else when slice != 0 we get an X Window System error with wxGTK if ( (backImageData!=NULL)&& (mBox->bbIsShown())) { int z = mBox->bbGetInputSlice(); // std::cout << "slice = "<GetWholeExtent(ext); // std::cout << "ext = "<ext[1]) { z=ext[1]; } break; case 1: if (zext[3]) { z=ext[3]; } break; case 2: if (zext[5]) { z=ext[5]; } break; default: z = ext[5]; // Why not? } wxvtkrenderwindowinteractor->Update(); wxvtkrenderwindowinteractor->Render(); imageViewer->GetRenderer()->ResetCameraClippingRange(); /* #if (VTK_MAJOR_VERSION >= 5) imageViewer->SetSlice( z ); #else imageViewer->SetZSlice( z ); #endif */ imageViewer->SetSliceOrientation (orientation); imageViewer->SetSlice( z ); //imageViewer->UpdateDisplayExtent(); } } vtkRenderer * Viewer2DWidget::GetRenderer() { return imageViewer->GetRenderer(); } //-------------------------------------------------------------------------- //------------------------------------------------------------------------- //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- BBTK_BLACK_BOX_IMPLEMENTATION(Viewer2D,bbtk::WxBlackBox); void Viewer2D::Process() { // LG : Bug on Linux (wxGTK) when initial slice != 0 on first time // (see wxvtk/bbs/appli/ExampleSimpleSlicer) // I think there is a problem with rendering before window // has been reparented ... we have to check this ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView(); bbSetOutputOut( bbGetInputSlice() ); bbSetOutputRenderer( ((Viewer2DWidget*)bbGetOutputWidget())->GetRenderer() ); } void Viewer2D::bbUserConstructor() { bbSetInputIn(NULL); bbSetInputSlice(0); } /** * \brief Create wxWidget . * * */ void Viewer2D::CreateWidget() { bbtkDebugMessageInc("Core",9,"Viewer2D::CreateWidget()"<Refresh(); ((Viewer2DWidget*)bbGetOutputWidget())->Update(); ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView(); #endif /* // BUGS ON LINUX !! ((Viewer2DWidget*)bbGetOutputWidget())->Update(); ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView(); */ } }//namespace bbtk #endif