X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_OCCDisplayer.cxx;h=6f5081110ab3a624f5d3235d7536a798ce976768;hb=58bb6b7459bebeeb089c9ed486c4683a8bae7288;hp=719b6e46c90d6bed23559704a5c1260806d8a257;hpb=3e1c5d8083a5d3459b55e9a235257c6d55bf9c36;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx b/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx index 719b6e46..6f508111 100644 --- a/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx +++ b/src/HYDROGUI/HYDROGUI_OCCDisplayer.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 @@ -24,14 +20,23 @@ #include "HYDROGUI_DataModel.h" #include "HYDROGUI_Module.h" -#include "HYDROGUI_Tool.h" -#include "HYDROGUI_Shape.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 @@ -41,10 +46,12 @@ #include #include #include +#include HYDROGUI_OCCDisplayer::HYDROGUI_OCCDisplayer( HYDROGUI_Module* theModule ) : HYDROGUI_AbstractDisplayer( theModule ) { + myToUpdateColorScale = false; } HYDROGUI_OCCDisplayer::~HYDROGUI_OCCDisplayer() @@ -72,16 +79,23 @@ void HYDROGUI_OCCDisplayer::SetToUpdate( const HYDROData_SequenceOfObjects& theO } } -int HYDROGUI_OCCDisplayer::AddTopZLayer( OCCViewer_ViewManager* theMgr ) +int HYDROGUI_OCCDisplayer::AddPreviewZLayer( OCCViewer_ViewManager* theMgr ) { int aLayer = -1; OCCViewer_Viewer* aViewer = theMgr->getOCCViewer(); if ( !aViewer ) return aLayer; - Standard_Integer aNewId = -1; - if ( aViewer->getViewer3d()->AddZLayer( aNewId ) ) - aLayer = aNewId; + aLayer = CreateTopZLayer( aViewer->getViewer3d() ); + + // Hilight presentation should be on top + Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext(); + if( !aCtx.IsNull() ) { + int aTopLayer = CreateTopZLayer( aViewer->getViewer3d() ); + if ( aTopLayer > 0 ) { + UpdateZLayersOfHilightPresentationsOfDisplayedObjects( aCtx, aTopLayer ); + } + } return aLayer; } @@ -112,6 +126,7 @@ void HYDROGUI_OCCDisplayer::EraseAll( const int theViewerId ) return; module()->removeViewShapes( (size_t)aViewer ); + UpdateColorScale( aViewer ); } void HYDROGUI_OCCDisplayer::Erase( const HYDROData_SequenceOfObjects& theObjs, @@ -130,6 +145,9 @@ void HYDROGUI_OCCDisplayer::Erase( const HYDROData_SequenceOfObjects& theObjs, module()->removeObjectShape( (size_t)aViewer, anObj ); } aViewer->update(); + if ( !module()->isLandCoversScalarMapModeOn( (size_t)aViewer ) ) { + UpdateColorScale( aViewer ); + } } HYDROGUI_Shape* HYDROGUI_OCCDisplayer::createShape( const int theViewerId, @@ -143,7 +161,17 @@ HYDROGUI_Shape* HYDROGUI_OCCDisplayer::createShape( const int if ( !HYDROGUI_Tool::IsObjectHasPresentation( theObject, OCCViewer_Viewer::Type() ) ) return aResShape; - aResShape = new HYDROGUI_Shape( theContext, theObject ); + if( theObject->IsKind( STANDARD_TYPE( HYDROData_Image ) ) ) + 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 ) ); + 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 ); + module()->setObjectShape( theViewerId, theObject, aResShape ); return aResShape; @@ -197,75 +225,78 @@ void HYDROGUI_OCCDisplayer::Display( const HYDROData_SequenceOfObjects& theObjs, // Get 3d viewer Handle(V3d_Viewer) aViewer3d = aViewer->getViewer3d(); - // Get existing Z layers - TColStd_SequenceOfInteger anExistingZLayers; - aViewer3d->GetAllZLayers( anExistingZLayers ); - int aNbLayers = anExistingZLayers.Length(); - - // Display objects - int aNextZLayerIndex = 2; // don't use the first default Z layer ( which index = 1 ) + // Display objects: + HYDROGUI_ZLayersIterator aZLayersIt( aViewer->getViewer3d() ); + if ( !aZLayersIt.More() ) { + aZLayersIt.Next(); + } // 1. Display the ordered objects: HYDROData_SequenceOfObjects::Iterator anOrderedIter( anOrderedToDisplay ); for ( ; anOrderedIter.More(); anOrderedIter.Next() ) { Handle(HYDROData_Entity) anObj = anOrderedIter.Value(); - if ( Display( anObj, aViewer, theIsForced, aNextZLayerIndex, true ) ) { - aNextZLayerIndex++; + if ( Display( anObj, aViewer, theIsForced ) ) { + // set Z layer ( one Z layer for each ordered object ) + int aZLayerId = aZLayersIt.LayerId(); + SetZLayer( aViewer, anObj, aZLayerId ); + SetZLayerSettings( aViewer3d, aZLayerId, true ); + aZLayersIt.Next(); } } // 2. Display the unordered objects: bool isDisplayed = false; + int anUnorderedZLayerId = aZLayersIt.LayerId(); HYDROData_SequenceOfObjects::Iterator anUnorderedIter( anUnorderedToDisplay ); for ( ; anUnorderedIter.More(); anUnorderedIter.Next() ) { Handle(HYDROData_Entity) anObj = anUnorderedIter.Value(); - if ( Display( anObj, aViewer, theIsForced, aNextZLayerIndex, false ) ) { + if ( Display( anObj, aViewer, theIsForced) ) { + // set Z layer ( one Z layer for all unordered objects ) + SetZLayer( aViewer, anObj, anUnorderedZLayerId ); + if ( !isDisplayed ) { + SetZLayerSettings( aViewer3d, anUnorderedZLayerId, false ); + } isDisplayed = true; } } // 3. Update the top Z layer index if ( isDisplayed ) { - aNextZLayerIndex++; + aZLayersIt.Next(); } // Update Z layer of the active operation - aViewer3d->GetAllZLayers( anExistingZLayers ); + int aPreviewZLayerId = aZLayersIt.LayerId(); HYDROGUI_Module* aModule = module(); SUIT_Operation* anOp = aModule->activeOperation(); HYDROGUI_Operation* aHOp = anOp ? dynamic_cast( anOp ) : 0; if ( aHOp && aHOp->getPreviewZLayer() >= 0 ) { - Standard_Integer aLayerId = -1; - if ( aNextZLayerIndex <= aNbLayers ) - aLayerId = anExistingZLayers.Value( aNextZLayerIndex ); - else { - Standard_Integer aNewId = -1; - if ( aViewer->getViewer3d()->AddZLayer( aNewId ) ) { - aLayerId = aNewId; - } - } - aHOp->updatePreviewZLayer( aLayerId ); + aHOp->updatePreviewZLayer( aPreviewZLayerId ); + aZLayersIt.Next(); } - if ( theDoFitAll ) - { + // Update Z layer of hilight presentations + int aHilightLayer = aZLayersIt.TopLayer(); + UpdateZLayersOfHilightPresentationsOfDisplayedObjects( aCtx, aHilightLayer ); + + // Fit all / update selection + if ( theDoFitAll ) { OCCViewer_ViewManager* aViewManager = ::qobject_cast( aViewer->getViewManager() ); - if ( aViewManager ) - { + if ( aViewManager ) { OCCViewer_ViewWindow* aViewWindow = ::qobject_cast( aViewManager->getActiveView() ); - if ( aViewWindow ) - { + if ( aViewWindow ) { aViewWindow->onFitAll(); } } - } - else if ( !aCtx.IsNull() ) // TODO: determine if this code is necessary (added as a fix for issue# 359) - { + } + else if ( !aCtx.IsNull() ) { // TODO: determine if this code is necessary (added as a fix for issue# 359) aCtx->UpdateSelected(); } + + UpdateColorScale( aViewer ); } void HYDROGUI_OCCDisplayer::purgeObjects( const int theViewerId ) @@ -302,9 +333,7 @@ QString HYDROGUI_OCCDisplayer::GetType() const bool HYDROGUI_OCCDisplayer::Display( const Handle(HYDROData_Entity)& theObject, const OCCViewer_Viewer* theViewer, - const bool theIsForced, - const int theZLayerIndex, - const bool theIsOrdered ) + const bool theIsForced ) { bool aRes = false; @@ -335,62 +364,182 @@ bool HYDROGUI_OCCDisplayer::Display( const Handle(HYDROData_Entity)& theObject, if ( anObjShape ) { // update if needed if ( anObjShape->getIsToUpdate() || theIsForced ) { - anObjShape->update( false ); + anObjShape->update( false, false ); } // Set visibility bool anIsVisible = module()->isObjectVisible( aViewerId, theObject ); anObjShape->setVisible( anIsVisible, false ); - // Set Z layer - Handle(V3d_Viewer) aViewer3d = theViewer->getViewer3d(); - if ( !aViewer3d.IsNull() ) { - // Get existing layers - TColStd_SequenceOfInteger anExistingZLayers; - aViewer3d->GetAllZLayers( anExistingZLayers ); - int aNbLayers = anExistingZLayers.Length(); + aRes = true; + } + + return aRes; +} + +void HYDROGUI_OCCDisplayer::SetZLayer( const OCCViewer_Viewer* theViewer, + const Handle(HYDROData_Entity)& theObject, + const int theZLayerId ) +{ + if ( !theViewer /*|| ( theZLayerId < 0 )*/ ) { + return; + } + + // Get interactive context + Handle(AIS_InteractiveContext) aCtx = theViewer->getAISContext(); + if( aCtx.IsNull() ) { + return; + } + + // Get viewer id + size_t aViewerId = (size_t)theViewer; + + // Get object shape + HYDROGUI_Shape* anObjShape = module()->getObjectShape( aViewerId, theObject ); + + // Set Z layer + if ( anObjShape ) { + aCtx->SetZLayer( anObjShape->getAISObject(), theZLayerId ); + } +} + +void HYDROGUI_OCCDisplayer::SetToUpdateColorScale() +{ + myToUpdateColorScale = true; +} + +void HYDROGUI_OCCDisplayer::UpdateColorScale( const OCCViewer_Viewer* theViewer ) +{ + 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 + bool isLandCoverColoringOn = module()->isLandCoversScalarMapModeOn( aViewerId ); + + QList aLandCoverMapShapes = module()->getObjectShapes( aViewerId, KIND_LAND_COVER_MAP ); + QList aBathShapes = module()->getObjectShapes( aViewerId, KIND_BATHYMETRY ); + + bool isDisplayColorScale = !aBathShapes.empty() || isLandCoverColoringOn; + Standard_Real anXPos = 0.05; //TODO + Standard_Real anYPos = 0.1; //TODO + Standard_Real aWidth = 0.2; //TODO + Standard_Real aHeight = 0.5; //TODO + Standard_Integer aTextHeight = 14; //TODO + Standard_Integer aNbIntervals = 20; //TODO + TCollection_ExtendedString aColorScaleTitle = "";//TODO + + 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 ); + + if( isFirst || aMin < aColorScaleMin ) + aColorScaleMin = aMin; + if( isFirst || aMax > aColorScaleMax ) + aColorScaleMax = aMax; + + isFirst = false; + } + } + + Handle(AIS_ColorScale) aColorScale = GetColorScale( aViewerId ); + Handle(AIS_InteractiveContext) aCtx = theViewer->getAISContext(); + if( isDisplayColorScale ) + { + if( !aColorScale.IsNull() ) + { + aColorScale->SetXPosition( anXPos ); + aColorScale->SetYPosition( anYPos ); + aColorScale->SetWidth( aWidth ); + aColorScale->SetHeight( aHeight ); + + aColorScale->SetTextHeight( aTextHeight ); + aColorScale->SetNumberOfIntervals( aNbIntervals ); + + aColorScale->SetTitle( aColorScaleTitle ); + aColorScale->SetRange( aColorScaleMin, aColorScaleMax ); - // Get or create the appropriate layer - Standard_Integer aLayerId = -1; - if ( theZLayerIndex <= aNbLayers ) { - aLayerId = anExistingZLayers.Value( theZLayerIndex ); - } else { - Standard_Integer aNewId = -1; - if ( aViewer3d->AddZLayer( aNewId ) ) { - aLayerId = aNewId; + aColorScale->SetToUpdate(); + + if ( !isLandCoverColoringOn ) { + foreach( HYDROGUI_Shape* aShape, aBathShapes ) { + HYDROGUI_ShapeBathymetry* aBathShape = dynamic_cast( aShape ); + if( !aBathShape || !aBathShape->isVisible() ) + continue; + + aBathShape->UpdateWithColorScale( aColorScale ); } } + + if ( !aCtx.IsNull() && !aCtx->IsDisplayed( aColorScale ) ) { + aCtx->Display( aColorScale ); + } + } + } + else + { + if ( !aCtx.IsNull() && aCtx->IsDisplayed( aColorScale ) ) { + aCtx->Erase( aColorScale ); + } + } - if ( aLayerId >= 0 ) { - // set Z layer - aCtx->SetZLayer( anObjShape->getAISShape(), aLayerId ); - - // set Z layer settings for the 3d viewer: - // current settings - Graphic3d_ZLayerSettings aSettings = aViewer3d->ZLayerSettings( aLayerId ); - // enable depth write - aSettings.EnableSetting( Graphic3d_ZLayerDepthWrite ); - // disable depth clear - aSettings.DisableSetting( Graphic3d_ZLayerDepthClear ); - if ( theIsOrdered ) { - // disable depth test - aSettings.DisableSetting( Graphic3d_ZLayerDepthTest ); - // disable depth offset - aSettings.DisableSetting( Graphic3d_ZLayerDepthOffset ); - } else { - // enable depth test - aSettings.EnableSetting( Graphic3d_ZLayerDepthTest ); - // set depth offset - aSettings.SetDepthOffsetPositive(); - } + foreach( HYDROGUI_Shape* aShape, aLandCoverMapShapes ) { + HYDROGUI_ShapeLandCoverMap* aLandCoverMapShape = + dynamic_cast( aShape ); - // set new settings - aViewer3d->SetZLayerSettings( aLayerId, aSettings ); + if ( !aLandCoverMapShape || !aLandCoverMapShape->isVisible() ) { + continue; + } + + Handle(HYDROData_LandCoverMap) aLandCoverMap = + Handle(HYDROData_LandCoverMap)::DownCast( aLandCoverMapShape->getObject() ); - aRes = true; - } + if ( aLandCoverMap.IsNull() ) { + continue; + } + + bool isScalarMode = aLandCoverMapShape->isScalarMapModeEnabled(); + if( isScalarMode != isLandCoverColoringOn ) + { + aLandCoverMapShape->setScalarMapModeEnabled( isLandCoverColoringOn ); + theViewer->getAISContext()->Redisplay( aLandCoverMapShape->getAISObject() ); } } + + myToUpdateColorScale = false; +} - return aRes; -} \ No newline at end of file +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; +}