X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=packages%2Fwxvtk%2Fsrc%2FbbwxvtkViewer2D.cxx;h=23cd7d2dbec6325ecb4ac5c00f41952025a20bc0;hb=08ce916eba56a6111014712fc931a1cce7e8f877;hp=3f0e696306e056578933b6107110074441f5d6c1;hpb=6bbabb32cba07ce95376c2cdcb804ee97050d453;p=bbtk.git diff --git a/packages/wxvtk/src/bbwxvtkViewer2D.cxx b/packages/wxvtk/src/bbwxvtkViewer2D.cxx index 3f0e696..23cd7d2 100644 --- a/packages/wxvtk/src/bbwxvtkViewer2D.cxx +++ b/packages/wxvtk/src/bbwxvtkViewer2D.cxx @@ -1,18 +1,37 @@ +/* + # --------------------------------------------------------------------- + # + # Copyright (c) CREATIS (Centre de Recherche en Acquisition et Traitement de l'Image + # pour la SantÈ) + # Authors : Eduardo Davila, Frederic Cervenansky, Claire Mouton + # Previous Authors : Laurent Guigues, Jean-Pierre Roux + # CreaTools website : www.creatis.insa-lyon.fr/site/fr/creatools_accueil + # + # This software is governed by the CeCILL-B license under French law and + # abiding by the rules of distribution of free software. You can use, + # modify and/ or redistribute the software under the terms of the CeCILL-B + # license as circulated by CEA, CNRS and INRIA at the following URL + # http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html + # or in the file LICENSE.txt. + # + # As a counterpart to the access to the source code and rights to copy, + # modify and redistribute granted by the license, users are provided only + # with a limited warranty and the software's author, the holder of the + # economic rights, and the successive licensors have only limited + # liability. + # + # The fact that you are presently reading this means that you have had + # knowledge of the CeCILL-B license and that you accept its terms. + # ------------------------------------------------------------------------ */ + + /*========================================================================= Program: bbtk Module: $RCSfile: bbwxvtkViewer2D.cxx,v $ Language: C++ - Date: $Date: 2008/06/19 09:46:49 $ - Version: $Revision: 1.9 $ - - 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. + Date: $Date: 2012/11/16 08:52:36 $ + Version: $Revision: 1.39 $ =========================================================================*/ /** @@ -21,8 +40,8 @@ */ -#ifdef _USE_WXWIDGETS_ - +#ifdef USE_WXWIDGETS +#ifdef USE_VTK #include "bbwxvtkViewer2D.h" #include "bbwxvtkPackage.h" @@ -33,19 +52,53 @@ #include "vtkRenderer.h" #include #include +#include +#include + +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + #include "wxvtkImageViewer2.h" +#else + #include +#endif +#include "wxVTKRenderWindowInteractor.h" namespace bbwxvtk { + //-------------------------------------------------------------------------- + class Viewer2DWidget : public wxPanel + { + public: + Viewer2DWidget(Viewer2D* box, wxWindow *parent); + ~Viewer2DWidget(); + void UpdateView(); + vtkRenderer *GetRenderer(); + vtkImageActor *GetImageActor(); + private: + bool mFirstTime; + Viewer2D *mBox; + +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + wxvtkImageViewer2 *imageViewer; +#else + vtkImageViewer2 *imageViewer; +#endif - BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D); - + vtkImageData *backImageData; + vtkImageData *mDefaultImage; + wxVTKRenderWindowInteractor *wxvtkrenderwindowinteractor; + bool mUpdateCamera; - Viewer2DWidget::Viewer2DWidget(Viewer2D* box, - wxWindow *parent) + 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; @@ -53,42 +106,83 @@ namespace bbwxvtk wxvtkrenderwindowinteractor = new wxVTKRenderWindowInteractor(panel,-1); wxvtkrenderwindowinteractor->UseCaptureMouseOn(); +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + imageViewer = wxvtkImageViewer2::New(); +#else imageViewer = vtkImageViewer2::New(); - imageViewer->SetSlice( 1 ); +#endif + + imageViewer->SetSlice( 1 ); imageViewer->SetupInteractor ( wxvtkrenderwindowinteractor ); mDefaultImage = vtkImageData::New(); int dim[3]; - dim[0] = dim[1] = 32 ; - dim[2] = 2; + 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); +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + 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;iAllocateScalars(); +#else + mDefaultImage->AllocateScalars(VTK_UNSIGNED_CHAR,1); +#endif + + int i,j,k; + for (i=0;iSetScalarComponentFromFloat(dim[0]-i-1,i,0,0,255); - mDefaultImage->SetScalarComponentFromFloat(i,i,1,0,255); - } - + for (j=0;jSetScalarComponentFromFloat(i,j,k,0,0); + } // for k + }// for j + } // for i + + for (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); + } // for i + + mDefaultImage->Modified(); backImageData = mDefaultImage; + +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 imageViewer->SetInput( backImageData ); - mUpdateCamera = true; +#else + imageViewer->SetInputData( backImageData ); +#endif + mUpdateCamera = true; wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL); - sizer -> Add( wxvtkrenderwindowinteractor , 1, wxEXPAND, 0); - panel -> SetSizer(sizer); - panel -> SetAutoLayout(true); - panel -> Layout(); - + 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); } //------------------------------------------------------------------------- @@ -103,113 +197,181 @@ namespace bbwxvtk mDefaultImage->Delete(); if (backImageData) - { - // backImageData->UnRegister(NULL); - } + { +// backImageData->UnRegister(NULL); + } if (imageViewer) - { - imageViewer->Delete(); - } + { + 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; - } + // 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(); + //EED 2017-01-01 Migration VTK7 + #if VTK_MAJOR_VERSION <= 5 + backImageData->Update(); + imageViewer->SetInput( backImageData ); + #else + imageViewer->SetInputData( backImageData ); + #endif + mUpdateCamera = true; + } // if BackImageData + } // if BoxInputIn 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); + { + // 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); - vtkCamera *camera = imageViewer->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; - } - + // 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 << "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 << "OW = "<< mBox->bbGetWindow() << std::endl; - // std::cout << "CW = "<< mBox->bbGetContainingWindow() << std::endl; - // std::cout << "Sh = "<< mBox->bbIsShown() << std::endl; - + // std::cout << "CW = "<< mBox->bbGetContainingWindow() << std::endl; + // std::cout << "Sh = "<< mBox->bbIsShown() << std::endl; + bool interp = mBox->bbGetInputInterpolate(); + if ( interp ) + { + imageViewer->GetImageActor()->InterpolateOn(); + } else { + imageViewer->GetImageActor()->InterpolateOff(); + } + + int orientation = mBox->bbGetInputOrientation(); + if (orientation<0 || orientation>2) + { + bbtkMessage("Output", 2, "Viewer2D : Orientation was not 0< <2 "<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())) + if ( (backImageData!=NULL) && (mBox->bbIsShown()) ) { - int z = mBox->bbGetInputSlice(); - // std::cout << "slice = "<GetWholeExtent(ext); - - // std::cout << "ext = "<bbGetInputSlice(); + int ext[6]; - if (zext[5]) { z=ext[5]; } - - -#if (VTK_MAJOR_VERSION >= 5) - imageViewer->SetSlice( z ); +//EED 2017-01-01 Migration VTK7 +#if VTK_MAJOR_VERSION <= 5 + backImageData->GetWholeExtent(ext); #else - imageViewer->SetZSlice( z ); + backImageData->GetExtent(ext); #endif - //imageViewer->UpdateDisplayExtent(); - //wxvtkrenderwindowinteractor->Render(); - imageViewer->GetRenderer()->ResetCameraClippingRange(); - } + /* + 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(); +#else + //wxRect *rect=new wxRect(0, 0, 50, 50); + //wxvtkrenderwindowinteractor->Refresh(true, rect); + // .. +#endif + wxvtkrenderwindowinteractor->Render(); + bbtkDebugMessage("Output",3,"Viewer2D : slice = "<SetSliceOrientation (orientation); + imageViewer->SetSlice( z ); + } // if backImageData } - - vtkRenderer * Viewer2DWidget::GetRenderer() - { - return imageViewer->GetRenderer(); - } - - + //-------------------------------------------------------------------------- +vtkRenderer * Viewer2DWidget::GetRenderer() +{ + return imageViewer->GetRenderer(); +} //-------------------------------------------------------------------------- //------------------------------------------------------------------------- @@ -217,56 +379,61 @@ namespace bbwxvtk //-------------------------------------------------------------------------- - - + BBTK_ADD_BLACK_BOX_TO_PACKAGE(wxvtk,Viewer2D); BBTK_BLACK_BOX_IMPLEMENTATION(Viewer2D,bbtk::WxBlackBox); - + + //----------------------------------------------------------------- + void Viewer2D::bbUserSetDefaultValues() + { + bbSetInputIn(NULL); + bbSetInputInterpolate(true); // JP + bbSetInputSlice(0); + bbSetOutputWidget(0); + bbSetOutputRenderer(0); + bbSetInputOrientation(2); + } + + //----------------------------------------------------------------- + void Viewer2D::bbUserInitializeProcessing() + { + } + + //----------------------------------------------------------------- + void Viewer2D::bbUserFinalizeProcessing() + { + } + + //-------------------------------------------------------------------------- void Viewer2D::Process() { - // LG : Bug on Linux (wxGTK) when initial slice != 0 on first time - // (see wxvtk/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() ); - + // std::cout << "Viewer2D::Process" << std::endl; + // std::cout << "In="<UpdateView(); + } + bbSetOutputOut( bbGetInputSlice() ); } - void Viewer2D::bbUserConstructor() - { - bbSetInputIn(NULL); - bbSetInputSlice(0); - } - /** - * \brief Create wxWidget . - * - * - */ - void Viewer2D::CreateWidget() - { - bbtkDebugMessageInc("Core",9,"Viewer2D::CreateWidget()"<UpdateView(); bbSetOutputWidget(w); - - bbtkDebugDecTab("Core",9); + 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