X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_VTKPrsBathymetry.cxx;h=6833acec714a898feb6e226e969ab106b4f9303c;hb=58bb6b7459bebeeb089c9ed486c4683a8bae7288;hp=769879de2be344ac39acb438daf4f61eab2c1dbe;hpb=144bba28d8aad27eed721016473fee7f0d984b39;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_VTKPrsBathymetry.cxx b/src/HYDROGUI/HYDROGUI_VTKPrsBathymetry.cxx index 769879de..6833acec 100644 --- a/src/HYDROGUI/HYDROGUI_VTKPrsBathymetry.cxx +++ b/src/HYDROGUI/HYDROGUI_VTKPrsBathymetry.cxx @@ -1,12 +1,8 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE -// -// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, -// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS -// +// Copyright (C) 2014-2015 EDF-R&D // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; either -// version 2.1 of the License. +// version 2.1 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -26,24 +22,23 @@ #include #include -#include +#include #include #include #include #include #include #include -#include +#include #include -#define NB_COLORS 32 -#define Z_MIN -100 +/*! \def Z_MAX + \brief Maximum Z value used in bathymetry presentation. + + This value is used instead of invalid values. +*/ #define Z_MAX 1 -#define HUE_START 0.69 -#define HUE_END 0.41 -#define SATURATION_START 1.0 -#define SATURATION_END 0.4 //======================================================================= // name : HYDROGUI_VTKPrsBathymetry @@ -68,13 +63,15 @@ HYDROGUI_VTKPrsBathymetry::~HYDROGUI_VTKPrsBathymetry() //================================================================ void HYDROGUI_VTKPrsBathymetry::compute() { + HYDROGUI_VTKPrs::compute(); + if ( !getObject().IsNull() ) { Handle(HYDROData_Bathymetry) aBathymetry = Handle(HYDROData_Bathymetry)::DownCast( getObject() ); if ( !aBathymetry.IsNull() ) { HYDROData_Bathymetry::AltitudePoints anAltPoints = aBathymetry->GetAltitudePoints(); - int aNbPoints = anAltPoints.length(); + int aNbPoints = anAltPoints.size(); HYDROData_Bathymetry::AltitudePoint anAltPnt; vtkPoints* aPoints = vtkPoints::New(); @@ -88,22 +85,18 @@ void HYDROGUI_VTKPrsBathymetry::compute() vtkVertex* aVertex = vtkVertex::New(); - int aZ; - int anInvalidZ = aBathymetry->GetInvalidAltitude(); + double aZ; + int anInvalidZ = InvalidZValue(); for (int i = 0; i < aNbPoints; i++ ) { - anAltPnt = anAltPoints.at( i ); - aZ = anAltPnt.Z(); + anAltPnt = anAltPoints[i]; + aZ = anAltPnt.Z; if ( ValuesLessEquals( aZ, anInvalidZ ) ) { - aZ = Z_MAX; - } - else - { - aZ = -aZ; + aZ = Z_MAX; // If Z value is invalid then use Z_MAX } - aPoints->InsertPoint( i, anAltPnt.X(), anAltPnt.Y(), aZ ); - aVertex->GetPointIds()->SetId( 0, i ); + aPoints->InsertPoint( i - 1, anAltPnt.X, anAltPnt.Y, aZ ); + aVertex->GetPointIds()->SetId( 0, i - 1 ); aVertexGrid->InsertNextCell( aVertex->GetCellType(), aVertex->GetPointIds()); aZValues->InsertNextValue( aZ ); } @@ -113,26 +106,46 @@ void HYDROGUI_VTKPrsBathymetry::compute() aVertexGrid->SetPoints( aPoints ); aVertexGrid->GetPointData()->SetScalars( aZValues ); - vtkLookupTable* aLut = vtkLookupTable::New(); - aLut->SetHueRange( HUE_START, HUE_END ); - aLut->SetSaturationRange( SATURATION_START, SATURATION_END ); - aLut->SetTableRange( Z_MIN, Z_MAX ); - aLut->SetValueRange( 1.0, 1.0 ); - aLut->SetAlphaRange( 1.0, 1.0 ); - aLut->SetNumberOfColors( NB_COLORS ); - aLut->Build(); - - vtkPolyDataMapper* aMapper = vtkPolyDataMapper::New(); - aMapper->SetScalarRange( Z_MIN, Z_MAX ); - aMapper->ScalarVisibilityOn(); - aMapper->SetScalarModeToUsePointData(); - aMapper->SetLookupTable( aLut ); - aMapper->SetInputData( aVertexGrid ); + // Update the lookup table range if this bathymetry is out of it + if ( myLookupTable ) + { + aZValues->GetRange( myInternalZRange ); + double* aGlobalRange = myLookupTable->GetRange(); + // If the global range is not yet initialized or the current one is out of scope then update the global + bool anIsUpdated = false; + if ( ValuesEquals( aGlobalRange[0], anInvalidZ ) || ( aGlobalRange[0] > myInternalZRange[0] ) ) + { + aGlobalRange[0] = myInternalZRange[0]; + anIsUpdated = true; + } + + if ( ValuesEquals( aGlobalRange[1], anInvalidZ ) || ( aGlobalRange[1] < myInternalZRange[1] ) ) + { + aGlobalRange[1] = myInternalZRange[1]; + anIsUpdated = true; + } + + if ( anIsUpdated ) + { + myLookupTable->SetRange( aGlobalRange ); + myLookupTable->Build(); + } + + myMapper->SetScalarRange( aGlobalRange ); + myMapper->ScalarVisibilityOn(); + myMapper->SetScalarModeToUsePointData(); + myMapper->SetLookupTable( myLookupTable ); + } + + myMapper->SetInputData( aVertexGrid ); - SALOME_Actor* anActor = SALOME_Actor::New(); - anActor->SetMapper( aMapper ); + SALOME_Actor* anActor = getActor(this); + anActor->SetMapper( myMapper.GetPointer() ); anActor->setIO( getIO() ); AddObject( anActor ); + + aVertexGrid->Delete(); + aZValues->Delete(); } } }