X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_OCCDisplayer.cxx;h=310e84de0cdb63dd854393fc4a98ff9c9342eee5;hb=81c9f5cdf82909d0aebd2c491c50fa7516cc80b7;hp=ee57bf971afb982d1fe9108d2e4ddba34c28b364;hpb=e0ab858db4d12245d472c02598a9b03960fe4535;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx b/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx index ee57bf97..310e84de 100644 --- a/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx +++ b/src/HYDROGUI/HYDROGUI_OCCDisplayer.cxx @@ -28,6 +28,7 @@ #include "HYDROGUI_Shape.h" #include "HYDROGUI_Operation.h" #include "HYDROGUI_DataObject.h" +#include "HYDROGUI_ZLayers.h" #include #include @@ -72,16 +73,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; } @@ -154,132 +162,117 @@ void HYDROGUI_OCCDisplayer::Display( const HYDROData_SequenceOfObjects& theObjs, const bool theIsForced, const bool theDoFitAll ) { + // Get OCC viewer by id OCCViewer_Viewer* aViewer = module()->getOCCViewer( theViewerId ); if( !aViewer ) return; + // Get interactive context Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext(); if( aCtx.IsNull() ) return; - + // Get the document Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( module()->getStudyId() ); if ( !aDoc ) return; - // Assign Z layer indexes + // Assign Z layer indexes to the objects aDoc->Show( theObjs ); - // TODO: to optimize // Sort objects by display order ( needed for Z layers assignment only ) - typedef QPair Object2ApplyZLayer; - QList anOrderedToDisplay; // list of (object, is_z_layer_applicable) - HYDROData_SequenceOfObjects anObjectsToDisplay = theObjs; - HYDROData_SequenceOfObjects anOrderedObjects = aDoc->GetObjectsLayerOrder(); - - HYDROData_SequenceOfObjects::Iterator anOrderedIter( anOrderedObjects ); - for ( ; anOrderedIter.More(); anOrderedIter.Next() ) { - QString anOrderedEntry = HYDROGUI_DataObject::dataObjectEntry( anOrderedIter.Value() ); + HYDROData_SequenceOfObjects anUnorderedToDisplay = theObjs; + HYDROData_SequenceOfObjects anOrderedToDisplay; + HYDROData_SequenceOfObjects anAllOrderedObjects = aDoc->GetObjectsLayerOrder(); + + HYDROData_SequenceOfObjects::Iterator anAllOrderedIter( anAllOrderedObjects ); + for ( ; anAllOrderedIter.More(); anAllOrderedIter.Next() ) { + QString anOrderedEntry = + HYDROGUI_DataObject::dataObjectEntry( anAllOrderedIter.Value() ); - HYDROData_SequenceOfObjects::Iterator aToDisplayIter( anObjectsToDisplay ); + HYDROData_SequenceOfObjects::Iterator aToDisplayIter( anUnorderedToDisplay ); for ( ; aToDisplayIter.More(); aToDisplayIter.Next() ) { Handle(HYDROData_Entity) anObjToDisplay = aToDisplayIter.Value(); QString anEntry = HYDROGUI_DataObject::dataObjectEntry( anObjToDisplay ); if ( anEntry == anOrderedEntry ) { - anObjectsToDisplay.Remove( aToDisplayIter ); - anOrderedToDisplay.prepend( Object2ApplyZLayer( anObjToDisplay, true ) ); + anOrderedToDisplay.Prepend( anObjToDisplay ); + anUnorderedToDisplay.Remove( aToDisplayIter ); break; } } } - // For the rest objects Z layer can't be applied - HYDROData_SequenceOfObjects::Iterator aRestObjsIter( anObjectsToDisplay ); - for ( ; aRestObjsIter.More(); aRestObjsIter.Next() ) { - anOrderedToDisplay.prepend( Object2ApplyZLayer( aRestObjsIter.Value(), false ) ); - } - - // Get existing Z layers - TColStd_SequenceOfInteger anExistingZLayers; - aViewer->getViewer3d()->GetAllZLayers( anExistingZLayers ); - int aNbLayers = anExistingZLayers.Length(); - - // Display - int aNextZLayerIndex = 2; // don't use the first default Z layer ( which index = 1 ) - foreach ( const Object2ApplyZLayer& aPair, anOrderedToDisplay ) { - Handle(HYDROData_Entity) anObj = aPair.first; - if ( anObj.IsNull() || anObj->IsRemoved() ) - continue; - - HYDROGUI_Shape* anObjShape = module()->getObjectShape( (size_t)aViewer, anObj ); + + // Get 3d viewer + Handle(V3d_Viewer) aViewer3d = aViewer->getViewer3d(); - if ( !anObjShape || anObjShape->getIsToUpdate() || theIsForced ) - { - if ( !anObjShape ) - anObjShape = createShape( (size_t)aViewer, aCtx, anObj ); + // Display objects: + HYDROGUI_ZLayersIterator aZLayersIt( aViewer->getViewer3d() ); + if ( !aZLayersIt.More() ) { + aZLayersIt.Next(); + } - if ( anObjShape ) - anObjShape->update( false ); + // 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 ) ) { + // set Z layer ( one Z layer for each ordered object ) + int aZLayerId = aZLayersIt.LayerId(); + SetZLayer( aViewer, anObj, aZLayerId ); + SetZLayerSettings( aViewer3d, aZLayerId, true ); + aZLayersIt.Next(); } + } - if ( anObjShape ) - { - bool anIsVisible = module()->isObjectVisible( (size_t)aViewer, anObj ); - anObjShape->setVisible( anIsVisible, false ); - - bool isZLayerApplicable = aPair.second; - - // set Z layer if applicable - if ( isZLayerApplicable ) { - Standard_Integer aLayerId = -1; - if ( aNextZLayerIndex <= aNbLayers ) { - aLayerId = anExistingZLayers.Value( aNextZLayerIndex ); - } else { - Standard_Integer aNewId = -1; - if ( aViewer->getViewer3d()->AddZLayer( aNewId ) ) { - aLayerId = aNewId; - } - } - if ( aLayerId >= 0 ) { - aCtx->SetZLayer( anObjShape->getAISShape(), aLayerId ); - } - aNextZLayerIndex++; + // 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) ) { + // 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 ) { + aZLayersIt.Next(); + } // Update Z layer of the active operation + 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() ) - { + } + else if ( !aCtx.IsNull() ) { // TODO: determine if this code is necessary (added as a fix for issue# 359) aCtx->UpdateSelected(); } } @@ -315,3 +308,75 @@ QString HYDROGUI_OCCDisplayer::GetType() const { return OCCViewer_Viewer::Type(); } + +bool HYDROGUI_OCCDisplayer::Display( const Handle(HYDROData_Entity)& theObject, + const OCCViewer_Viewer* theViewer, + const bool theIsForced ) +{ + bool aRes = false; + + if ( theObject.IsNull() || theObject->IsRemoved() || !theViewer ) { + return aRes; + } + + // Get interactive context + Handle(AIS_InteractiveContext) aCtx = theViewer->getAISContext(); + if( aCtx.IsNull() ) { + return aRes; + } + + // Viewer id + size_t aViewerId = (size_t)theViewer; + + // Object shape + HYDROGUI_Shape* anObjShape = module()->getObjectShape( aViewerId, theObject ); + // create if needed + if ( !anObjShape ) { + anObjShape = createShape( aViewerId, aCtx, theObject ); + if ( anObjShape ) { + anObjShape->setIsToUpdate( true ); + } + } + + // Process the shape + if ( anObjShape ) { + // update if needed + if ( anObjShape->getIsToUpdate() || theIsForced ) { + anObjShape->update( false ); + } + + // Set visibility + bool anIsVisible = module()->isObjectVisible( aViewerId, theObject ); + anObjShape->setVisible( anIsVisible, false ); + + 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->getAISShape(), theZLayerId ); + } +} \ No newline at end of file