X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_VTKPrsBathymetry.cxx;h=5b7a850be4cb5d9ede0d6660454d4bd3bea06979;hb=a1431f03eac1d1aed4203d0568d987c41ce939b3;hp=16983bf278d1978c61f3590d5ac8b5e6c1561aaf;hpb=d5288d46b0d85156f7666edf2cef050dc6655eae;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_VTKPrsBathymetry.cxx b/src/HYDROGUI/HYDROGUI_VTKPrsBathymetry.cxx index 16983bf2..5b7a850b 100644 --- a/src/HYDROGUI/HYDROGUI_VTKPrsBathymetry.cxx +++ b/src/HYDROGUI/HYDROGUI_VTKPrsBathymetry.cxx @@ -23,16 +23,27 @@ #include "HYDROGUI_VTKPrsBathymetry.h" #include +#include #include #include +#include #include #include +#include #include #include +#include #include +/*! \def Z_MAX + \brief Maximum Z value used in bathymetry presentation. + + This value is used instead of invalid values. +*/ +#define Z_MAX 1 + //======================================================================= // name : HYDROGUI_VTKPrsBathymetry // Purpose : Constructor @@ -56,6 +67,8 @@ HYDROGUI_VTKPrsBathymetry::~HYDROGUI_VTKPrsBathymetry() //================================================================ void HYDROGUI_VTKPrsBathymetry::compute() { + HYDROGUI_VTKPrs::compute(); + if ( !getObject().IsNull() ) { Handle(HYDROData_Bathymetry) aBathymetry = Handle(HYDROData_Bathymetry)::DownCast( getObject() ); @@ -71,28 +84,72 @@ void HYDROGUI_VTKPrsBathymetry::compute() vtkPolyData* aVertexGrid = vtkPolyData::New(); aVertexGrid->Allocate( aNbPoints ); + vtkDoubleArray* aZValues = vtkDoubleArray::New(); + aZValues->Allocate( aNbPoints ); + vtkVertex* aVertex = vtkVertex::New(); + double aZ; + int anInvalidZ = InvalidZValue(); for (int i = 0; i < aNbPoints; i++ ) { anAltPnt = anAltPoints.at( i ); - aPoints->InsertPoint( i, anAltPnt.X(), anAltPnt.Y(), anAltPnt.Z() ); + aZ = anAltPnt.Z(); + if ( ValuesLessEquals( aZ, anInvalidZ ) ) + { + 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 ); aVertexGrid->InsertNextCell( aVertex->GetCellType(), aVertex->GetPointIds()); + aZValues->InsertNextValue( aZ ); } aVertex->Delete(); aVertexGrid->SetPoints( aPoints ); - vtkPolyDataMapper* aMapper = vtkPolyDataMapper::New(); - aMapper->SetInputData( aVertexGrid ); - SALOME_Actor* anActor = SALOME_Actor::New(); - anActor->SetMapper( aMapper ); + aVertexGrid->GetPointData()->SetScalars( aZValues ); + + // 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 = getActor(this); + anActor->SetMapper( myMapper.GetPointer() ); anActor->setIO( getIO() ); - //anActor->setName( aBathymetry->GetName().toLatin1() ); AddObject( anActor ); - //anActor.AddPosition(0, 0, 6); - //anActor.GetProperty().SetDiffuseColor(1, 1, 1); + + aVertexGrid->Delete(); + aZValues->Delete(); } } }