X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=lib%2FmaracasVisuLib%2Fsrc%2Finterface%2FwxWindows%2Fwidgets%2FThresholdImageView%2FLayerImageBase.cxx;h=5fd366cd9ce03bc4f4bf3c44684e1707702fd12b;hb=HEAD;hp=beb17eadd2e087b32286cc0c074bf8137f403d0d;hpb=54bb3fba5f59ca71cb82d87043e21354dd85e7aa;p=creaMaracasVisu.git diff --git a/lib/maracasVisuLib/src/interface/wxWindows/widgets/ThresholdImageView/LayerImageBase.cxx b/lib/maracasVisuLib/src/interface/wxWindows/widgets/ThresholdImageView/LayerImageBase.cxx index beb17ea..5fd366c 100644 --- a/lib/maracasVisuLib/src/interface/wxWindows/widgets/ThresholdImageView/LayerImageBase.cxx +++ b/lib/maracasVisuLib/src/interface/wxWindows/widgets/ThresholdImageView/LayerImageBase.cxx @@ -1,3 +1,27 @@ +/*# --------------------------------------------------------------------- +# +# 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. +# ------------------------------------------------------------------------ */ /** * \file @@ -6,23 +30,100 @@ #include "LayerImageBase.h" +#include "wxMPRBaseData.h" +#include "wxVtk2DBaseView.h" +#include "wxVTKRenderWindowInteractor.h" +#include "vtkTextProperty.h" + + +//--------------------------------------------------------------------------------------------- +//--------------------------------------------------------------------------------------------- +//--------------------------------------------------------------------------------------------- + +// Callback for the interaction +class ColorLayerObserver : public vtkCommand{ + public: + virtual char const *GetClassName() const { return "ColorLayerObserver";} + + static ColorLayerObserver *New() { return new ColorLayerObserver; } + + ColorLayerObserver() + { + _layerimagebase = NULL; + } + + virtual void Execute(vtkObject *wdg, unsigned long event, void* calldata) + { + if (_layerimagebase!= NULL) + { + + wxVtkBaseView *wxvtkbaseview = _layerimagebase->GetwxVtkBaseView(); + if (wxvtkbaseview!=NULL) + { + + vtkMPRBaseData *vtkmprbasedata = (vtkMPRBaseData*)wxvtkbaseview->GetVtkBaseData(); + if (vtkmprbasedata!=NULL) + { + _layerimagebase->SetX( vtkmprbasedata->GetX() ); + _layerimagebase->SetY( vtkmprbasedata->GetY() ); + _layerimagebase->SetZ( vtkmprbasedata->GetZ() ); + _layerimagebase->onThresholdChange(); + } // if basedata + + } // if wxvtkbaseview + } //if layerimagebase + } + + void SetLayerImageBase(LayerImageBase* layerimagebase) + { + _layerimagebase = layerimagebase; + } + +private: + LayerImageBase* _layerimagebase; +}; + + + +//--------------------------------------------------------------------------------------------- +//--------------------------------------------------------------------------------------------- +//--------------------------------------------------------------------------------------------- + + + LayerImageBase::LayerImageBase() { _actorPresent = false; - _Z = 0; + _X = -1; + _Y = -1; + _Z = -1; + _opacity = 1; _thresholdTable = NULL; _thresholdMapper = NULL; + _scalarbarActor = NULL; _thresholdActor = NULL; _image = NULL; - _baseView = NULL; + _baseView = NULL; _imageReslicer = vtkImageReslice::New(); + _imageChangeInformation = vtkImageChangeInformation::New(); +} + +//---------------------------------------------------------------------------- +LayerImageBase::~LayerImageBase() +{ +} +//---------------------------------------------------------------------------- +void LayerImageBase::SetX(int x) +{ + _X = x; } //---------------------------------------------------------------------------- - LayerImageBase::~LayerImageBase() - { - } +void LayerImageBase::SetY(int y) +{ + _Y = y; +} //---------------------------------------------------------------------------- void LayerImageBase::SetZ(int z) @@ -30,16 +131,36 @@ void LayerImageBase::SetZ(int z) _Z = z; } +//---------------------------------------------------------------------------- +int LayerImageBase::GetX() // virtual +{ + return _X; +} + +//---------------------------------------------------------------------------- +int LayerImageBase::GetY() // virtual +{ + return _Y; +} //---------------------------------------------------------------------------- int LayerImageBase::GetZ() // virtual { return _Z; } + //---------------------------------------------------------------------------- vtkImageData* LayerImageBase::GetImage() { - return _image; +// return _image; + vtkImageData *result; + if (_image==NULL) + { + result = NULL; + } else { + result = _imageChangeInformation->GetOutput(); + } + return result; } //---------------------------------------------------------------------------- @@ -49,17 +170,179 @@ bool LayerImageBase::GetActorPresent() } - //---------------------------------------------------------------------------- void LayerImageBase::SetImage(vtkImageData* image) { + int ext[6]; + double spcBase[3]; + int dimensionOriginalLayer[3]; + int dimBase[6]; + + ext[0]=0; + ext[1]=0; + ext[2]=0; + ext[3]=0; + ext[4]=0; + ext[5]=0; + spcBase[0]=0; + spcBase[1]=0; + spcBase[2]=0; + spcBase[3]=0; + spcBase[4]=0; + spcBase[5]=0; + _image = image; + _image->Update(); + _image->GetWholeExtent(ext); + dimensionOriginalLayer[0] = ext[1]-ext[0]+1; + dimensionOriginalLayer[1] = ext[3]-ext[2]+1; + dimensionOriginalLayer[2] = ext[5]-ext[4]+1; + SetDimensionOriginalLayer(dimensionOriginalLayer); + double spcOriginalLayer[3]; + _image->GetSpacing(spcOriginalLayer); + SetSpcOriginalLayer(spcOriginalLayer); + if (GetwxVtkBaseView()!=NULL) + { + vtkImageData *imagebase = GetwxVtkBaseView()->GetVtkBaseData()->GetImageData(); + if (imagebase!=NULL) + { + imagebase->GetWholeExtent(ext); + dimBase[0]=ext[1]-ext[0]+1; + dimBase[1]=ext[3]-ext[2]+1; + dimBase[2]=ext[5]-ext[4]+1; + SetDimensionBase(dimBase); + imagebase->GetSpacing(spcBase); + SetSpcBase(spcBase); + + if ((_X<0) || (_X>dimBase[0])) { SetX( dimBase[0]/2 ); } + if ((_Y<0) || (_Y>dimBase[1])) { SetY( dimBase[1]/2 ); } + if ((_Z<0) || (_Z>dimBase[2])) { SetZ( dimBase[2]/2 ); } + + + } // if imagebase + } // if wxvtkbaseview + _image->GetScalarRange( _range ); + _thresholdTable = vtkLookupTable::New(); + + _imageChangeInformation->SetInput(_image); } +//------------------------------------------------------------------------------ +void LayerImageBase::SetSpcOriginalLayer(double spc[3]) +{ + _spcOriginalLayer[0] = spc[0]; + _spcOriginalLayer[1] = spc[1]; + _spcOriginalLayer[2] = spc[2]; +} + +//------------------------------------------------------------------------------ +void LayerImageBase::SetNewSpacingLayer(double spc[3]) +{ + _newSpcLayer[0]=spc[0]; + _newSpcLayer[1]=spc[1]; + _newSpcLayer[2]=spc[2]; + _imageChangeInformation->SetOutputSpacing( _newSpcLayer ); + +} + + +//------------------------------------------------------------------------------ +void LayerImageBase::SetSpcBase(double spc[3]) +{ + _spcBase[0] = spc[0]; + _spcBase[1] = spc[1]; + _spcBase[2] = spc[2]; +} + +//------------------------------------------------------------------------------ +void LayerImageBase::SetDimensionOriginalLayer(int dim[3]) +{ + _dimOriginalLayer[0] = dim[0]; + _dimOriginalLayer[1] = dim[1]; + _dimOriginalLayer[2] = dim[2]; +} + +//------------------------------------------------------------------------------ +void LayerImageBase::SetDimensionBase(int dim[3]) +{ + _dimBase[0] = dim[0]; + _dimBase[1] = dim[1]; + _dimBase[2] = dim[2]; +} + + + +//------------------------------------------------------------------------------ +void LayerImageBase::GetSpcOriginalLayer(double *spc) +{ + spc[0] = _spcOriginalLayer[0]; + spc[1] = _spcOriginalLayer[1]; + spc[2] = _spcOriginalLayer[2]; +} + +//------------------------------------------------------------------------------ +void LayerImageBase::GetSpcBase(double *spc) +{ + spc[0] = _spcBase[0]; + spc[1] = _spcBase[1]; + spc[2] = _spcBase[2]; +} + +//------------------------------------------------------------------------------ +void LayerImageBase::GetDimensionOriginalLayer(int *dim) +{ + dim[0] = _dimOriginalLayer[0]; + dim[1] = _dimOriginalLayer[1]; + dim[2] = _dimOriginalLayer[2]; +} + +//------------------------------------------------------------------------------ +void LayerImageBase::GetDimensionBase(int *dim) +{ + dim[0] = _dimBase[0]; + dim[1] = _dimBase[1]; + dim[2] = _dimBase[2]; +} + + +//------------------------------------------------------------------------------ +void LayerImageBase::SetColorBarPosition(std::vector &colorbarposition) +{ + _colorBarPosition=colorbarposition; +} + +//------------------------------------------------------------------------------ +void LayerImageBase::SetRangeForColorBar(std::vector &range) +{ + _rangeForColorBar=range; +} + + +//------------------------------------------------------------------------------ +void LayerImageBase::GetRangeForColorBar(double &minRange, double &maxRange) +{ + if (_rangeForColorBar.size()==2) + { + minRange = _rangeForColorBar[0]; + maxRange = _rangeForColorBar[1]; + } else { + minRange = _range[0]; + maxRange = _range[1]; + } +} + + + //---------------------------------------------------------------------------- void LayerImageBase::SetwxVtkBaseView(wxVtkBaseView *baseview) { - _baseView = baseview; + if (_baseView==NULL) + { + _baseView = baseview; + ColorLayerObserver *colorlayerobserver = ColorLayerObserver::New(); + _baseView->GetVtkBaseData()->AddObserver( 1, colorlayerobserver ); + colorlayerobserver->SetLayerImageBase(this); + } // if _baseView } //---------------------------------------------------------------------------- @@ -85,31 +368,62 @@ vtkLookupTable* LayerImageBase::GetThresholdTable() } //---------------------------------------------------------------------------- -int LayerImageBase::CleanZ(int z) +void LayerImageBase::CleanXYZ(double &x, double &y, double &z) { - int ext[6]; - _image->GetWholeExtent(ext); - + if (x<0) + { + x=0; + } + if (y<0) + { + y=0; + } if (z<0) { z=0; } - - if ( z > (ext[5]-ext[4]) ) + double maxSize; + maxSize=_dimOriginalLayer[0]*_newSpcLayer[0]; + if ( x > maxSize ) { - z=ext[5]-ext[4]; + x=maxSize; } - - return z; + maxSize=_dimOriginalLayer[1]*_newSpcLayer[1]; + if ( y > maxSize ) + { + y = maxSize; + } + maxSize=_dimOriginalLayer[2]*_newSpcLayer[2]; + if ( z > maxSize ) + { + z = maxSize; + } + } //---------------------------------------------------------------------------- void LayerImageBase::onThreshold() { - if ((_image!=NULL) && (_baseView!=NULL)) { - int z=CleanZ( GetZ() ); + double x=GetX(); + double y=GetY(); + double z=GetZ(); + + x = x*_spcBase[0]; + y = y*_spcBase[1]; + z = z*_spcBase[2]; + + CleanXYZ(x,y,z); + + vtkCamera *camera = _baseView->GetRenderer()->GetActiveCamera(); + int directionViewer=0; + if (camera->GetParallelProjection()==1) + { + wxVtk2DBaseView *wxvtk2dbasevie = (wxVtk2DBaseView *)_baseView; + directionViewer = wxvtk2dbasevie->GetDirection(); + } // ParallelProjection + if (!GetActorPresent()) { @@ -127,29 +441,87 @@ void LayerImageBase::onThreshold() if (_thresholdActor==NULL) { _thresholdActor = vtkImageActor::New( ); - _thresholdActor->SetOpacity( 0.6 ); + _scalarbarActor = vtkScalarBarActor::New(); + if (_colorBarPosition.size()==2) + { + _scalarbarActor->SetDisplayPosition(_colorBarPosition[0],_colorBarPosition[1]); + } else { + _scalarbarActor->SetDisplayPosition(0,0); + } + _scalarbarActor->SetHeight(0.4); //default 0.8 + _scalarbarActor->SetWidth(0.08); //default 0.17 + + _thresholdActor->SetOpacity( 1 ); _thresholdActor->InterpolateOn( ); - _thresholdActor->SetPosition( 0,0, 900-1 ); + + if (directionViewer==0) + { + _thresholdActor->SetPosition( 900-1,0,0 ); + _thresholdActor->RotateY( -90 ); + } + if (directionViewer==1) + { + _thresholdActor->SetPosition( 0,-900-1, 0 ); + _thresholdActor->RotateX( 90 ); + } + if (directionViewer==2) + { + _thresholdActor->SetPosition( 0,0, -900-1 ); + } } // _thresholdActor _baseView->GetRenderer()->AddActor( _thresholdActor ); + _baseView->GetRenderer()->AddActor2D( _scalarbarActor ); _actorPresent = true; } // !GetActorPresent() ConfigLookupTable(); // virtual method _imageReslicer->SetInput( GetImage() ); _imageReslicer->SetInformationInput( GetImage() ); - _imageReslicer->SetResliceAxesDirectionCosines(1,0,0, 0,1,0 ,0,0,1); + + if (directionViewer==0) + { + _imageReslicer->SetResliceAxesDirectionCosines( 0,0,1, 0,1,0, -1,0,0 ); + _imageReslicer->SetResliceAxesOrigin(x,0,0); + } + + if (directionViewer==1) + { + _imageReslicer->SetResliceAxesDirectionCosines( 1,0,0 ,0,0,1, 0,-1,0 ); + _imageReslicer->SetResliceAxesOrigin(0,y,0); + } + + if (directionViewer==2) + { + _imageReslicer->SetResliceAxesDirectionCosines( 1,0,0, 0,1,0 ,0,0,1 ); + _imageReslicer->SetResliceAxesOrigin(0,0,z); + } + _imageReslicer->SetOutputDimensionality(2); - _imageReslicer->SetInterpolationModeToLinear(); - _imageReslicer->SetResliceAxesOrigin(0,0,z); +// _imageReslicer->SetInterpolationModeToLinear(); + _imageReslicer->SetInterpolationModeToNearestNeighbor(); + _imageReslicer->Modified(); + vtkImageData *img = _imageReslicer->GetOutput(); - img->Update(); - img->UpdateInformation(); +// img->Update(); +// img->UpdateInformation(); +// _thresholdTable->Update(); _thresholdMapper->SetInput( img ); _thresholdMapper->SetLookupTable( _thresholdTable ); _thresholdActor->SetInput( _thresholdMapper->GetOutput() ); + _thresholdActor->SetOpacity(_opacity); + + _scalarbarActor->SetLookupTable( _thresholdTable ); +// _scalarbarActor->SetLookupTable( _thresholdMapper->GetLookupTable() ); + _scalarbarActor->SetTitle("Value"); + _scalarbarActor->SetNumberOfLabels(4); + int fontsize = _scalarbarActor->GetLabelTextProperty()->GetFontSize(); + _scalarbarActor->GetLabelTextProperty()->SetFontSize(fontsize/2); + +// _scalarbarActor->SetTextPad(4); ?? + + } // _image } @@ -185,8 +557,10 @@ void LayerImageBase::onThresholdChangeOpacity (int opacity) { if (_actorPresent) { - _thresholdActor->SetOpacity(opacity*0.1); + _thresholdActor->SetOpacity(opacity/100.0); } +// EED 2017-12-17 + _opacity = (double)opacity/100.0; } //---------------------------------------------------------------------------- @@ -196,10 +570,39 @@ void LayerImageBase::onThresholdRemove() { wxVtkBaseView * baseView = _baseView; baseView->GetRenderer()->RemoveActor( _thresholdActor ); + baseView->GetRenderer()->RemoveActor( _scalarbarActor ); + _actorPresent = false; } } +//---------------------------------------------------------------------------- +vtkLookupTable *LayerImageBase::GetvtkLookupTable() +{ + return _thresholdTable; +} + +//---------------------------------------------------------------------------- +vtkImageReslice *LayerImageBase::GetvtkImageReslice() +{ + return _imageReslicer; +} + +//---------------------------------------------------------------------------- +void LayerImageBase::GetImageScalarRange() +{ + double min,max; + GetRangeForColorBar(min,max); +// _image->GetScalarRange(_range); + _range[0]=min; + _range[1]=max; +} + +vtkScalarsToColors* LayerImageBase::GetLookupTable() +{ + return _thresholdTable; +} +