X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_OCCDisplayer.cxx;h=6f5081110ab3a624f5d3235d7536a798ce976768;hb=58bb6b7459bebeeb089c9ed486c4683a8bae7288;hp=1034b656a03825d95029a5a2e83d942c0e922239;hpb=439579ec24edd8b147cab07f688d446d59029a1e;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx b/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx index 1034b656..6f508111 100644 --- a/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx +++ b/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx @@ -20,19 +20,23 @@ #include "HYDROGUI_DataModel.h" #include "HYDROGUI_Module.h" -#include "HYDROGUI_Tool.h" +#include "HYDROGUI_Tool2.h" #include #include +#include #include "HYDROGUI_Operation.h" #include "HYDROGUI_DataObject.h" #include "HYDROGUI_ZLayers.h" + #include +#include +#include +#include #include #include #include - -#include +#include #include @@ -141,7 +145,9 @@ void HYDROGUI_OCCDisplayer::Erase( const HYDROData_SequenceOfObjects& theObjs, module()->removeObjectShape( (size_t)aViewer, anObj ); } aViewer->update(); - UpdateColorScale( aViewer ); + if ( !module()->isLandCoversScalarMapModeOn( (size_t)aViewer ) ) { + UpdateColorScale( aViewer ); + } } HYDROGUI_Shape* HYDROGUI_OCCDisplayer::createShape( const int theViewerId, @@ -156,9 +162,13 @@ HYDROGUI_Shape* HYDROGUI_OCCDisplayer::createShape( const int return aResShape; if( theObject->IsKind( STANDARD_TYPE( HYDROData_Image ) ) ) - aResShape = new HYDROGUI_ShapeImage( theContext, Handle_HYDROData_Image::DownCast( theObject ) ); + aResShape = new HYDROGUI_ShapeImage( theContext, Handle(HYDROData_Image)::DownCast( theObject ) ); else if( theObject->IsKind( STANDARD_TYPE( HYDROData_Bathymetry ) ) ) - aResShape = new HYDROGUI_ShapeBathymetry( this, theContext, Handle_HYDROData_Bathymetry::DownCast( theObject ) ); + aResShape = new HYDROGUI_ShapeBathymetry( this, theContext, Handle(HYDROData_Bathymetry)::DownCast( theObject ) ); + else if( theObject->IsKind( STANDARD_TYPE( HYDROData_LandCoverMap ) ) ) { + bool isScalarMode = module()->isLandCoversScalarMapModeOn( theViewerId ); + aResShape = new HYDROGUI_ShapeLandCoverMap( this, theContext, Handle(HYDROData_LandCoverMap)::DownCast( theObject ), -1, isScalarMode ); + } else aResShape = new HYDROGUI_Shape( theContext, theObject ); @@ -371,7 +381,7 @@ void HYDROGUI_OCCDisplayer::SetZLayer( const OCCViewer_Viewer* theViewer, const Handle(HYDROData_Entity)& theObject, const int theZLayerId ) { - if ( !theViewer || ( theZLayerId < 0 ) ) { + if ( !theViewer /*|| ( theZLayerId < 0 )*/ ) { return; } @@ -400,16 +410,19 @@ void HYDROGUI_OCCDisplayer::SetToUpdateColorScale() void HYDROGUI_OCCDisplayer::UpdateColorScale( const OCCViewer_Viewer* theViewer ) { - if( !myToUpdateColorScale ) + if( !myToUpdateColorScale || !theViewer ) return; - + OCCViewer_ViewWindow* aWnd = dynamic_cast( theViewer->getViewManager()->getActiveView() ); Handle(V3d_View) aView = aWnd->getViewPort()->getView(); - + int aViewerId = (size_t)theViewer;//TODO: check if viewer id is correct - QList aShapes = module()->getObjectShapes( aViewerId, KIND_BATHYMETRY ); + bool isLandCoverColoringOn = module()->isLandCoversScalarMapModeOn( aViewerId ); + + QList aLandCoverMapShapes = module()->getObjectShapes( aViewerId, KIND_LAND_COVER_MAP ); + QList aBathShapes = module()->getObjectShapes( aViewerId, KIND_BATHYMETRY ); - bool isDisplayColorScale = !aShapes.empty(); + bool isDisplayColorScale = !aBathShapes.empty() || isLandCoverColoringOn; Standard_Real anXPos = 0.05; //TODO Standard_Real anYPos = 0.1; //TODO Standard_Real aWidth = 0.2; //TODO @@ -418,27 +431,43 @@ void HYDROGUI_OCCDisplayer::UpdateColorScale( const OCCViewer_Viewer* theViewer Standard_Integer aNbIntervals = 20; //TODO TCollection_ExtendedString aColorScaleTitle = "";//TODO - Standard_Real aColorScaleMin = 0, aColorScaleMax = 1, aMin, aMax; - bool isFirst = true; - foreach( HYDROGUI_Shape* aShape, aShapes ) - { - HYDROGUI_ShapeBathymetry* aBathShape = dynamic_cast( aShape ); - if( !aBathShape || !aBathShape->isVisible() ) - continue; + Standard_Real aColorScaleMin = 0, aColorScaleMax = 1; + + // Get range + Handle(HYDROData_StricklerTable) aTable; + QStringList aTableTypes; + if ( isLandCoverColoringOn ) { + aTable = module()->getLandCoverColoringTable( aViewerId ); + if ( !aTable.IsNull() ) { + // TODO: non-empty title leads to buggy behaviour + // aColorScaleTitle = TCollection_ExtendedString( aTable->GetName().toLatin1().constData() ); + aTable->GetCoefficientRange( aColorScaleMin, aColorScaleMax ); + aTableTypes = aTable->GetTypes(); + } + } else { + Standard_Real aMin, aMax; + bool isFirst = true; + foreach( HYDROGUI_Shape* aShape, aBathShapes ) + { + HYDROGUI_ShapeBathymetry* aBathShape = dynamic_cast( aShape ); + if( !aBathShape || !aBathShape->isVisible() ) + continue; - aBathShape->GetRange( aMin, aMax ); + aBathShape->GetRange( aMin, aMax ); - if( isFirst || aMin < aColorScaleMin ) - aColorScaleMin = aMin; - if( isFirst || aMax > aColorScaleMax ) - aColorScaleMax = aMax; + if( isFirst || aMin < aColorScaleMin ) + aColorScaleMin = aMin; + if( isFirst || aMax > aColorScaleMax ) + aColorScaleMax = aMax; - isFirst = false; + isFirst = false; + } } + Handle(AIS_ColorScale) aColorScale = GetColorScale( aViewerId ); + Handle(AIS_InteractiveContext) aCtx = theViewer->getAISContext(); if( isDisplayColorScale ) { - Handle(Aspect_ColorScale) aColorScale = aView->ColorScale(); if( !aColorScale.IsNull() ) { aColorScale->SetXPosition( anXPos ); @@ -451,24 +480,66 @@ void HYDROGUI_OCCDisplayer::UpdateColorScale( const OCCViewer_Viewer* theViewer aColorScale->SetTitle( aColorScaleTitle ); aColorScale->SetRange( aColorScaleMin, aColorScaleMax ); + + aColorScale->SetToUpdate(); - foreach( HYDROGUI_Shape* aShape, aShapes ) - { - HYDROGUI_ShapeBathymetry* aBathShape = dynamic_cast( aShape ); - if( !aBathShape || !aBathShape->isVisible() ) - continue; + if ( !isLandCoverColoringOn ) { + foreach( HYDROGUI_Shape* aShape, aBathShapes ) { + HYDROGUI_ShapeBathymetry* aBathShape = dynamic_cast( aShape ); + if( !aBathShape || !aBathShape->isVisible() ) + continue; - aBathShape->UpdateWithColorScale( aColorScale ); + aBathShape->UpdateWithColorScale( aColorScale ); + } + } + + if ( !aCtx.IsNull() && !aCtx->IsDisplayed( aColorScale ) ) { + aCtx->Display( aColorScale ); } } - if( !aView->ColorScaleIsDisplayed() ) - aView->ColorScaleDisplay(); } else { - if( aView->ColorScaleIsDisplayed() ) - aView->ColorScaleErase(); + if ( !aCtx.IsNull() && aCtx->IsDisplayed( aColorScale ) ) { + aCtx->Erase( aColorScale ); + } } + foreach( HYDROGUI_Shape* aShape, aLandCoverMapShapes ) { + HYDROGUI_ShapeLandCoverMap* aLandCoverMapShape = + dynamic_cast( aShape ); + + if ( !aLandCoverMapShape || !aLandCoverMapShape->isVisible() ) { + continue; + } + + Handle(HYDROData_LandCoverMap) aLandCoverMap = + Handle(HYDROData_LandCoverMap)::DownCast( aLandCoverMapShape->getObject() ); + + if ( aLandCoverMap.IsNull() ) { + continue; + } + + bool isScalarMode = aLandCoverMapShape->isScalarMapModeEnabled(); + if( isScalarMode != isLandCoverColoringOn ) + { + aLandCoverMapShape->setScalarMapModeEnabled( isLandCoverColoringOn ); + theViewer->getAISContext()->Redisplay( aLandCoverMapShape->getAISObject() ); + } + } + myToUpdateColorScale = false; } + +Handle(AIS_ColorScale) HYDROGUI_OCCDisplayer::GetColorScale( const int theViewerId ) +{ + Handle(AIS_ColorScale) aColorScale; + + aColorScale = myColorScales.value( theViewerId, aColorScale ); + if ( aColorScale.IsNull() ) { + aColorScale = new AIS_ColorScale(); + myColorScales.insert( theViewerId, aColorScale ); + } + + return aColorScale; +}