X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_OCCDisplayer.cxx;h=40256a51b2e6b54640a4812ff8cd00e5e8df8d62;hb=d6e19029f8b41f295db878e9aecf451c2edda4af;hp=310e84de0cdb63dd854393fc4a98ff9c9342eee5;hpb=a5961fd772bf86c3153bbc2388b8fc98974537de;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx b/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx index 310e84de..40256a51 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 @@ -25,15 +21,19 @@ #include "HYDROGUI_DataModel.h" #include "HYDROGUI_Module.h" #include "HYDROGUI_Tool.h" -#include "HYDROGUI_Shape.h" +#include +#include #include "HYDROGUI_Operation.h" #include "HYDROGUI_DataObject.h" #include "HYDROGUI_ZLayers.h" +#include #include #include #include +#include + #include #include @@ -42,10 +42,12 @@ #include #include #include +#include HYDROGUI_OCCDisplayer::HYDROGUI_OCCDisplayer( HYDROGUI_Module* theModule ) : HYDROGUI_AbstractDisplayer( theModule ) { + myToUpdateColorScale = false; } HYDROGUI_OCCDisplayer::~HYDROGUI_OCCDisplayer() @@ -120,6 +122,7 @@ void HYDROGUI_OCCDisplayer::EraseAll( const int theViewerId ) return; module()->removeViewShapes( (size_t)aViewer ); + UpdateColorScale( aViewer ); } void HYDROGUI_OCCDisplayer::Erase( const HYDROData_SequenceOfObjects& theObjs, @@ -138,6 +141,7 @@ void HYDROGUI_OCCDisplayer::Erase( const HYDROData_SequenceOfObjects& theObjs, module()->removeObjectShape( (size_t)aViewer, anObj ); } aViewer->update(); + UpdateColorScale( aViewer ); } HYDROGUI_Shape* HYDROGUI_OCCDisplayer::createShape( const int theViewerId, @@ -151,7 +155,13 @@ 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 + aResShape = new HYDROGUI_Shape( theContext, theObject ); + module()->setObjectShape( theViewerId, theObject, aResShape ); return aResShape; @@ -275,6 +285,8 @@ void HYDROGUI_OCCDisplayer::Display( const HYDROData_SequenceOfObjects& theObjs, 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 ) @@ -342,7 +354,7 @@ 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 @@ -359,7 +371,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; } @@ -377,6 +389,86 @@ void HYDROGUI_OCCDisplayer::SetZLayer( const OCCViewer_Viewer* theViewer, // Set Z layer if ( anObjShape ) { - aCtx->SetZLayer( anObjShape->getAISShape(), theZLayerId ); + aCtx->SetZLayer( anObjShape->getAISObject(), theZLayerId ); } -} \ No newline at end of file +} + +void HYDROGUI_OCCDisplayer::SetToUpdateColorScale() +{ + myToUpdateColorScale = true; +} + +void HYDROGUI_OCCDisplayer::UpdateColorScale( const OCCViewer_Viewer* theViewer ) +{ + if( !myToUpdateColorScale ) + 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 isDisplayColorScale = !aShapes.empty(); + 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, aMin, aMax; + bool isFirst = true; + foreach( HYDROGUI_Shape* aShape, aShapes ) + { + 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; + } + + if( isDisplayColorScale ) + { + Handle(Aspect_ColorScale) aColorScale = aView->ColorScale(); + 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 ); + + foreach( HYDROGUI_Shape* aShape, aShapes ) + { + HYDROGUI_ShapeBathymetry* aBathShape = dynamic_cast( aShape ); + if( !aBathShape || !aBathShape->isVisible() ) + continue; + + aBathShape->UpdateWithColorScale( aColorScale ); + } + } + if( !aView->ColorScaleIsDisplayed() ) + aView->ColorScaleDisplay(); + } + else + { + if( aView->ColorScaleIsDisplayed() ) + aView->ColorScaleErase(); + } + + myToUpdateColorScale = false; +}