X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=packages%2Fwxvtk%2Fsrc%2FbbwxvtkViewer2D.cxx;h=f9e1e1326f7c6c3f0b9a95bc3738f78e7ce2547b;hb=31e21c4bf4e9051ae07b5ca010d2e9b74c4dc06d;hp=a6ecfa24a8c843b6310cb655c39acd4cf2011718;hpb=4ad5b5ee44357ad873bc8c43230defb6d0a79879;p=bbtk.git diff --git a/packages/wxvtk/src/bbwxvtkViewer2D.cxx b/packages/wxvtk/src/bbwxvtkViewer2D.cxx index a6ecfa2..f9e1e13 100644 --- a/packages/wxvtk/src/bbwxvtkViewer2D.cxx +++ b/packages/wxvtk/src/bbwxvtkViewer2D.cxx @@ -3,8 +3,8 @@ Program: bbtk Module: $RCSfile: bbwxvtkViewer2D.cxx,v $ Language: C++ - Date: $Date: 2008/04/18 12:59:53 $ - Version: $Revision: 1.3 $ + Date: $Date: 2008/07/03 13:59:37 $ + Version: $Revision: 1.15 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -31,7 +31,8 @@ #include "vtkInteractorStyleImage.h" #include "vtkCamera.h" #include "vtkRenderer.h" - +#include +#include @@ -51,23 +52,72 @@ namespace bbwxvtk wxvtkrenderwindowinteractor = new wxVTKRenderWindowInteractor(panel,-1); wxvtkrenderwindowinteractor->UseCaptureMouseOn(); - wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); - sizer -> Add( wxvtkrenderwindowinteractor , 1, wxEXPAND, 0); - panel -> SetSizer(sizer); - panel -> SetAutoLayout(true); - panel -> Layout(); - - backImageData = NULL; - imageViewer = NULL; + 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; -// pourquoi pas wxvtkrenderwindowinteractor->Delete(); // JP + // std::cout << "Viewer2DWidget::~Viewer2DWidget() OK" << std::endl; } //------------------------------------------------------------------------- @@ -77,83 +127,95 @@ namespace bbwxvtk void Viewer2DWidget::UpdateView() { + // std::cout << "Viewer2DWidget::UpdateView() "<bbGetFullName() << std::endl; + // std::cout << "slice="<bbGetInputSlice()<SetupInteractor ( wxvtkrenderwindowinteractor ); - } - // Viewer2D* mbbtkViewer2D = (Viewer2D*)GetBlackBox(); - - - - // imageViewer->SetSliceOrientation(((Viewer2D*)GetBlackBox())->bbGetInputOrientation()); - - - if ( backImageData != mBox->bbGetInputIn() ) + if ( ( mBox->bbGetInputIn() == NULL ) && + ( backImageData != mDefaultImage ) ) + { + backImageData = mDefaultImage; + mUpdateCamera = true; + } + else if ( ( mBox->bbGetInputIn() != NULL ) && + (backImageData != mBox->bbGetInputIn()) ) { backImageData = mBox->bbGetInputIn(); - imageViewer->SetInput( backImageData ); 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 :"<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->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); + // + // imageViewer->GetRenderer()->ResetCamera(x1,x2,y1,y2,z1,z2); + mUpdateCamera = false; } - // std::cout << "update"<=ext[5]) { z=ext[5]-1; } - // LG : SetZSlice does not exist anymore in vtk 5 ! + if (zext[5]) { z=ext[5]; } -#if (VTK_MAJOR_VERSION >= 5) - imageViewer->SetSlice( z ); -#else - imageViewer->SetZSlice( z ); -#endif + wxvtkrenderwindowinteractor->Update(); + wxvtkrenderwindowinteractor->Render(); + imageViewer->GetRenderer()->ResetCameraClippingRange(); - } - - wxvtkrenderwindowinteractor->Render(); - // wxvtkrenderwindowinteractor->Refresh(); - + #if (VTK_MAJOR_VERSION >= 5) + imageViewer->SetSlice( z ); + #else + imageViewer->SetZSlice( z ); + #endif - //Refresh(); - } + //imageViewer->UpdateDisplayExtent(); + } + + +} + vtkRenderer * Viewer2DWidget::GetRenderer() + { + return imageViewer->GetRenderer(); + } + //-------------------------------------------------------------------------- @@ -162,16 +224,31 @@ namespace bbwxvtk //-------------------------------------------------------------------------- + + 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 . * @@ -192,7 +269,16 @@ namespace bbwxvtk // when window is shown void Viewer2D::bbUserOnShow() { + +#if defined(_WIN32) +// ((Viewer2DWidget*)bbGetOutputWidget())->Refresh(); + ((Viewer2DWidget*)bbGetOutputWidget())->Update(); + ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView(); +#endif + /* + ((Viewer2DWidget*)bbGetOutputWidget())->Update(); ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView(); + */ }