X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=packages%2Fwxvtk%2Fsrc%2FbbwxvtkViewer2D.cxx;h=7c5b5f4a28c9a0081bbe46e1fe740b7769c0f2f4;hb=c9290f68cfff1094e0548fae2beb996476e5a496;hp=a6ecfa24a8c843b6310cb655c39acd4cf2011718;hpb=4ad5b5ee44357ad873bc8c43230defb6d0a79879;p=bbtk.git diff --git a/packages/wxvtk/src/bbwxvtkViewer2D.cxx b/packages/wxvtk/src/bbwxvtkViewer2D.cxx index a6ecfa2..7c5b5f4 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: 2009/05/28 08:55:45 $ + Version: $Revision: 1.37 $ Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de l'Image). All rights reserved. See Doc/License.txt or @@ -21,8 +21,8 @@ */ -#ifdef _USE_WXWIDGETS_ - +#ifdef USE_WXWIDGETS +#ifdef USE_VTK #include "bbwxvtkViewer2D.h" #include "bbwxvtkPackage.h" @@ -31,172 +31,326 @@ #include "vtkInteractorStyleImage.h" #include "vtkCamera.h" #include "vtkRenderer.h" - - - +#include +#include namespace bbwxvtk { - - BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D); + //-------------------------------------------------------------------------- + class Viewer2DWidget : public wxPanel + { + public: + Viewer2DWidget(Viewer2D* box, wxWindow *parent); + ~Viewer2DWidget(); + void UpdateView(); + vtkRenderer *GetRenderer(); + + private: + bool mFirstTime; + Viewer2D *mBox; + wxvtkImageViewer2 *imageViewer; + vtkImageData *backImageData; + vtkImageData *mDefaultImage; + wxVTKRenderWindowInteractor *wxvtkrenderwindowinteractor; + bool mUpdateCamera; + + vtkImplicitPlaneWidget * maPlane1, * maPlane2, * mbPlane1, * mbPlane2; + }; - Viewer2DWidget::Viewer2DWidget(Viewer2D* box, wxWindow *parent) : wxPanel( parent, -1, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL), + mFirstTime(true), mBox(box) { wxPanel *panel = this; 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 = wxvtkImageViewer2::New(); + imageViewer->SetSlice( 1 ); + imageViewer->SetupInteractor ( wxvtkrenderwindowinteractor ); + mDefaultImage = vtkImageData::New(); + int dim[3]; + dim[0] = dim[1] = 256 ; + 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(i,0,0,0,255); + mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-1,0,0,255); + mDefaultImage->SetScalarComponentFromFloat(0,i,0,0,255); + mDefaultImage->SetScalarComponentFromFloat(dim[0]-1,i,0,0,255); + mDefaultImage->SetScalarComponentFromFloat(i,0,1,0,255); + mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-1,1,0,255); + mDefaultImage->SetScalarComponentFromFloat(0,i,1,0,255); + mDefaultImage->SetScalarComponentFromFloat(dim[0]-1,i,1,0,255); + */ + mDefaultImage->SetScalarComponentFromFloat(i,i,0,0,255); + mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-i-1,0,0,255); + mDefaultImage->SetScalarComponentFromFloat(i,i,1,0,255); + mDefaultImage->SetScalarComponentFromFloat(i,dim[1]-i-1,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(); + + imageViewer->GetRenderer()->SetBackground(0.1,0.1,0.2); + } //------------------------------------------------------------------------- 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; } - - //------------------------------------------------------------------------- - + //------------------------------------------------------------------------- void Viewer2DWidget::UpdateView() { + // std::cout << "Viewer2DWidget::UpdateView() " << std::endl; + // std::cout << "slice="<bbGetInputSlice()<bbGetInputIn() == NULL ) && + ( backImageData != mDefaultImage ) ) + { + // + // std::cout << "** Viewer2DWidget::UpdateView() : NULL Input (reset)" <bbGetInputIn() != NULL ) && + (( mBox->bbGetInputStatus("In") != bbtk::UPTODATE ) || + ( mFirstTime)) + ) + //(backImageData != mBox->bbGetInputIn()) ) + { + // std::cout << "** Viewer2DWidget::UpdateView() : Input changed" <bbGetInputIn()) // Don't update if just Slice changed + { + backImageData = mBox->bbGetInputIn(); + backImageData->Update(); + imageViewer->SetInput( backImageData ); + mUpdateCamera = true; + } + } - if (imageViewer==NULL){ - imageViewer = vtkImageViewer2::New(); - imageViewer->SetupInteractor ( wxvtkrenderwindowinteractor ); - } - - // Viewer2D* mbbtkViewer2D = (Viewer2D*)GetBlackBox(); - - - - // imageViewer->SetSliceOrientation(((Viewer2D*)GetBlackBox())->bbGetInputOrientation()); - - - if ( backImageData != mBox->bbGetInputIn() ) + if (mUpdateCamera) { - backImageData = mBox->bbGetInputIn(); - imageViewer->SetInput( backImageData ); - backImageData->Update(); + // std::cout << "** Viewer2DWidget::UpdateView() : Update Camera" + // <GetSpacing(spx,spy,spz); backImageData->GetExtent (x1,x2,y1,y2,z1,z2); - bbtkMessage("Output",2,"Viewer2D '"<bbGetName()<<"' - Image :"<GetScalarRange(); + imageViewer->SetColorWindow(range[1] - range[0]); + imageViewer->SetColorLevel(0.5 * (range[1] + range[0])); + + imageViewer->GetRenderer()->ResetCamera(); + double bounds[6]; + imageViewer->GetRenderer()->ComputeVisiblePropBounds(bounds); + imageViewer->GetRenderer()->ResetCameraClippingRange(bounds); + + // 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->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 << "Viewer2DWidget::UpdateView() passe par 3" << std::endl; + imageViewer->SetColorWindow(512); + imageViewer->SetColorLevel(256); + */ + /* + for (int i=0;i<10;i++) + for (int j=0;j<10;j++) + std::cout << mBox->bbGetInputIn()->GetScalarComponentAsFloat(i,j,0,0) + << std::endl; + */ + } - // std::cout << "update"<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[5]) { z=ext[5]-1; } - // LG : SetZSlice does not exist anymore in vtk 5 ! - -#if (VTK_MAJOR_VERSION >= 5) - imageViewer->SetSlice( z ); -#else - imageViewer->SetZSlice( z ); -#endif - + if ( + (backImageData!=NULL)&& + (mBox->bbIsShown())) + { + int z = mBox->bbGetInputSlice(); + int ext[6]; + backImageData->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: + bbtkMessage("Output", 2, "Viewer2D : Orientation was not 0< <2 (shouldn't arrive here!"<Refresh(); + wxvtkrenderwindowinteractor->Render(); + bbtkDebugMessage("Output",3,"Viewer2D : slice = "<SetSliceOrientation (orientation); + imageViewer->SetSlice( z ); + + } + } - } - - wxvtkrenderwindowinteractor->Render(); - // wxvtkrenderwindowinteractor->Refresh(); - - //Refresh(); + vtkRenderer * Viewer2DWidget::GetRenderer() + { + return imageViewer->GetRenderer(); } - //-------------------------------------------------------------------------- //------------------------------------------------------------------------- //-------------------------------------------------------------------------- //-------------------------------------------------------------------------- + BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D); BBTK_BLACK_BOX_IMPLEMENTATION(Viewer2D,bbtk::WxBlackBox); - + + //----------------------------------------------------------------- + void Viewer2D::bbUserSetDefaultValues() + { + bbSetInputIn(NULL); + bbSetInputSlice(0); + bbSetOutputWidget(0); + bbSetOutputRenderer(0); + bbSetInputOrientation(2); + } + + //----------------------------------------------------------------- + void Viewer2D::bbUserInitializeProcessing() + { + } + + //----------------------------------------------------------------- + void Viewer2D::bbUserFinalizeProcessing() + { + } + + //-------------------------------------------------------------------------- void Viewer2D::Process() { - ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView(); - bbSetOutputOut( bbGetInputSlice() ); + // std::cout << "Viewer2D::Process" << std::endl; + // std::cout << "In="<UpdateView(); + } + bbSetOutputOut( bbGetInputSlice() ); } - /** - * \brief Create wxWidget . - * - * - */ - void Viewer2D::CreateWidget() - { - bbtkDebugMessageInc("Core",9,"Viewer2D::CreateWidget()"<UpdateView(); + bbSetOutputWidget(w); + bbSetOutputRenderer( ((Viewer2DWidget*)bbGetOutputWidget())->GetRenderer() ); } - // This callback is necessary to get actual processing of the view - // when window is shown - void Viewer2D::bbUserOnShow() - { - ((Viewer2DWidget*)bbGetOutputWidget())->UpdateView(); - } - }//namespace bbtk #endif +#endif