X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Module.cxx;h=2e32038f9b523cd00cde71c8f52e68f213105d05;hb=a558c58ccc19713db2b13ada4d0f32dff61d0deb;hp=0733dcdc5917ab3dd56e088c349e1bb65578c9fa;hpb=7e825ec456c9331ef0df1cb59865cc55f0d8516a;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index 0733dcdc..2e32038f 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.cxx @@ -35,9 +35,14 @@ #include "HYDROGUI_Tool.h" #include "HYDROGUI_UpdateFlags.h" #include "HYDROGUI_Shape.h" +#include "HYDROGUI_VTKPrs.h" +#include "HYDROGUI_VTKPrsDisplayer.h" +#include "HYDROGUI_AbstractDisplayer.h" +#include "HYDROGUI_PolylineOp.h" #include #include +#include #include @@ -67,6 +72,10 @@ #include #include +#include +#include +#include + #include #include #include @@ -117,6 +126,7 @@ void HYDROGUI_Module::initialize( CAM_Application* theApp ) myDisplayer = new HYDROGUI_Displayer( this ); myOCCDisplayer = new HYDROGUI_OCCDisplayer( this ); + myVTKDisplayer = new HYDROGUI_VTKPrsDisplayer( this ); } bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy ) @@ -195,7 +205,8 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, bool anIsObjectBrowser = theClient == getApp()->objectBrowser()->popupClientType(); bool anIsGraphicsView = theClient == GraphicsView_Viewer::Type(); bool anIsOCCView = theClient == OCCViewer_Viewer::Type(); - if( !anIsObjectBrowser && !anIsGraphicsView && !anIsOCCView ) + bool anIsVTKView = theClient == SVTK_Viewer::Type(); + if( !anIsObjectBrowser && !anIsGraphicsView && !anIsOCCView && !anIsVTKView ) return; size_t anActiveViewId = HYDROGUI_Tool::GetActiveViewId( this ); @@ -212,12 +223,14 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, bool anIsSplittedImage = false; bool anIsMustBeUpdatedImage = false; bool anIsPolyline = false; + bool anIsBathymetry = false; bool anIsCalculation = false; bool anIsImmersibleZone = false; bool anIsVisualState = false; bool anIsRegion = false; bool anIsZone = false; bool anIsObstacle = false; + bool anIsGeomObject = false; // check the selected GEOM objects if ( !HYDROGUI_Tool::GetSelectedGeomObjects( this ).isEmpty() ) { @@ -277,9 +290,13 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, anIsRegion = true; else if( anObject->GetKind() == KIND_ZONE ) anIsZone = true; + else if( anObject->GetKind() == KIND_BATHYMETRY ) + anIsBathymetry = true; else if( anObject->GetKind() == KIND_OBSTACLE ) anIsObstacle = true; } + + anIsGeomObject = HYDROData_Tool::IsGeometryObject( anObject ); } // check the selected partitions @@ -379,12 +396,19 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( LoadVisualStateId ) ); theMenu->addSeparator(); } + + // Add set color action for geometrical objects + if ( anIsGeomObject ) + { + theMenu->addAction( action( SetColorId ) ); + theMenu->addSeparator(); + } } theMenu->addAction( action( DeleteId ) ); theMenu->addSeparator(); - if( anIsImage || anIsPolyline || anIsImmersibleZone || anIsZone || anIsRegion || anIsObstacle ) + if( anIsImage || anIsPolyline || anIsImmersibleZone || anIsZone || anIsRegion || anIsBathymetry || anIsObstacle ) { if( anIsHiddenInSelection ) theMenu->addAction( action( ShowId ) ); @@ -395,7 +419,15 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, } } - if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView ) + if ( anIsOCCView ) + { + SUIT_Operation* anOp = application()->activeStudy()->activeOperation(); + HYDROGUI_PolylineOp* aPolylineOp = dynamic_cast( anOp ); + if ( aPolylineOp && aPolylineOp->deleteEnabled() ) + theMenu->addAction( action( DeleteId ) ); + } + + if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView || anIsVTKView ) { theMenu->addAction( action( ShowAllId ) ); theMenu->addAction( action( HideAllId ) ); @@ -417,15 +449,15 @@ void HYDROGUI_Module::update( const int flags ) // store selected objects QStringList aSelectedEntries = storeSelection(); + bool aDoFitAll = flags & UF_FitAll; if( ( flags & UF_Viewer ) ) - updateGV( flags & UF_GV_Init, - flags & UF_GV_Forced, - flags & UF_FitAll ); + updateViewer( getDisplayer(), flags & UF_GV_Init, flags & UF_GV_Forced, aDoFitAll ); if( ( flags & UF_OCCViewer ) ) - updateOCCViewer( flags & UF_OCC_Init, - flags & UF_OCC_Forced, - flags & UF_FitAll ); + updateViewer( getOCCDisplayer(), flags & UF_OCC_Init, flags & UF_OCC_Forced, aDoFitAll ); + + if( ( flags & UF_VTKViewer ) ) + updateViewer( getVTKDisplayer(), flags & UF_VTK_Init, flags & UF_VTK_Forced, aDoFitAll ); if( ( flags & UF_Model ) && getDataModel() && getApp() ) { @@ -485,6 +517,20 @@ HYDROGUI_OCCDisplayer* HYDROGUI_Module::getOCCDisplayer() const return myOCCDisplayer; } +HYDROGUI_VTKPrsDisplayer* HYDROGUI_Module::getVTKDisplayer() const +{ + return myVTKDisplayer; +} + +SUIT_ViewManager* HYDROGUI_Module::getViewManager( const int theId ) const +{ + if( myViewManagerMap.contains( theId ) ) + { + return myViewManagerMap[ theId ].first; + } + return NULL; +} + GraphicsView_Viewer* HYDROGUI_Module::getViewer( const int theId ) const { if( myViewManagerMap.contains( theId ) ) @@ -511,6 +557,19 @@ OCCViewer_Viewer* HYDROGUI_Module::getOCCViewer( const int theId ) const return NULL; } +SVTK_Viewer* HYDROGUI_Module::getVTKViewer( const int theId ) const +{ + if( myViewManagerMap.contains( theId ) ) + { + ViewManagerInfo anInfo = myViewManagerMap[ theId ]; + SVTK_ViewManager* aViewManager = + ::qobject_cast( anInfo.first ); + if( aViewManager ) + return dynamic_cast( aViewManager->getViewModel() ); + } + return NULL; +} + int HYDROGUI_Module::getViewManagerId( SUIT_ViewManager* theViewManager ) { ViewManagerMapIterator anIter( myViewManagerMap ); @@ -578,6 +637,7 @@ void HYDROGUI_Module::setObjectVisible( const int theViewId, } } +/////////////////// OCC SHAPES PROCESSING HYDROGUI_Shape* HYDROGUI_Module::getObjectShape( const int theViewId, const Handle(HYDROData_Entity)& theObject ) const { @@ -650,6 +710,126 @@ void HYDROGUI_Module::removeViewShapes( const int theViewId ) myShapesMap.remove( theViewId ); } +/////////////////// END OF OCC SHAPES PROCESSING + +/////////////////// VTKPrs PROCESSING +HYDROGUI_VTKPrs* HYDROGUI_Module::getObjectVTKPrs( const int theViewId, + const Handle(HYDROData_Entity)& theObject ) const +{ + HYDROGUI_VTKPrs* aResShape = NULL; + if( theObject.IsNull() ) + return aResShape; + + if ( myVTKPrsMap.contains( theViewId ) ) + { + const ListOfVTKPrs& aViewShapes = myVTKPrsMap.value( theViewId ); + foreach ( HYDROGUI_VTKPrs* aShape, aViewShapes ) + { + if ( !aShape || !IsEqual( aShape->getObject(), theObject ) ) + continue; + + aResShape = aShape; + break; + } + } + + return aResShape; +} + +void HYDROGUI_Module::setObjectVTKPrs( const int theViewId, + const Handle(HYDROData_Entity)& theObject, + HYDROGUI_VTKPrs* theShape ) +{ + if( theObject.IsNull() ) + return; + + // Compute the new global Z range from the added presentation and the old global Z range. + double* aGlobalRange = getVTKDisplayer()->GetZRange( theViewId ); + double* aRange = theShape->getInternalZRange(); + bool anIsUpdate = false; + if ( aRange[0] < aGlobalRange[0] ) + { + aGlobalRange[0] = aRange[0]; + anIsUpdate = true; + } + if ( aRange[1] > aGlobalRange[1] ) + { + aGlobalRange[1] = aRange[1]; + anIsUpdate = true; + } + + //if ( anIsUpdate ) + //{ + updateVTKZRange( theViewId, aGlobalRange ); + //} + + ListOfVTKPrs& aViewShapes = myVTKPrsMap[ theViewId ]; + aViewShapes.append( theShape ); +} + +void HYDROGUI_Module::removeObjectVTKPrs( const int theViewId, + const Handle(HYDROData_Entity)& theObject ) +{ + if ( !myVTKPrsMap.contains( theViewId ) ) + return; + + ListOfVTKPrs& aViewShapes = myVTKPrsMap[ theViewId ]; + Handle(HYDROData_Entity) anObject; + for ( int i = 0; i < aViewShapes.length(); ) + { + HYDROGUI_VTKPrs* aShape = aViewShapes.at( i ); + anObject = aShape->getObject(); + if ( aShape && (!anObject.IsNull()) && IsEqual( anObject, theObject ) ) + { + delete aShape; + aViewShapes.removeAt( i ); + continue; + } + + ++i; + } + + // Invalidate global Z range + double anInvalidRange[2] = { HYDROGUI_VTKPrs::InvalidZValue(), HYDROGUI_VTKPrs::InvalidZValue() }; + getVTKDisplayer()->SetZRange( theViewId, anInvalidRange ); +} + +void HYDROGUI_Module::removeViewVTKPrs( const int theViewId ) +{ + if ( !myVTKPrsMap.contains( theViewId ) ) + return; + + const ListOfVTKPrs& aViewShapes = myVTKPrsMap.value( theViewId ); + for ( int i = 0, n = aViewShapes.length(); i < n; ++i ) + { + HYDROGUI_VTKPrs* aShape = aViewShapes.at( i ); + if ( aShape ) + delete aShape; + } + + myVTKPrsMap.remove( theViewId ); +} + +void HYDROGUI_Module::updateVTKZRange( const int theViewId, double theRange[] ) +{ + if ( myVTKPrsMap.contains( theViewId ) ) + { + // For the given viewer id update all VTK presentations ... + const ListOfVTKPrs& aViewShapes = myVTKPrsMap.value( theViewId ); + HYDROGUI_VTKPrs* aShape; + for ( int i = 0, n = aViewShapes.length(); i < n; ++i ) + { + aShape = aViewShapes.at( i ); + if ( aShape ) + { + aShape->setZRange( theRange ); + } + } + } + // ... and update the global color legend scalar bar. + getVTKDisplayer()->SetZRange( theViewId, theRange ); +} +/////////////////// END OF VTKPrs PROCESSING CAM_DataModel* HYDROGUI_Module::createDataModel() { @@ -746,6 +926,16 @@ void HYDROGUI_Module::onViewManagerRemoved( SUIT_ViewManager* theViewManager ) removeViewShapes( (size_t)anOCCViewer ); } + if ( getVTKDisplayer()->IsApplicable( theViewManager ) ) + { + SVTK_Viewer* aVTKViewer = getVTKViewer( anId ); + if ( aVTKViewer ) + { + getVTKDisplayer()->DeleteScalarBar( anId ); + removeViewShapes( (size_t)aVTKViewer ); + } + } + myViewManagerMap.remove( anId ); } } @@ -820,59 +1010,31 @@ void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent ) */ } -void HYDROGUI_Module::updateGV( const bool theIsInit, - const bool theIsForced, - const bool theDoFitAll ) +void HYDROGUI_Module::updateViewer( HYDROGUI_AbstractDisplayer* theDisplayer, + const bool theIsInit, + const bool theIsForced, + const bool theDoFitAll ) { - if( !getDisplayer() ) - return; - QList aViewManagerIdList; // currently, all views are updated ViewManagerMapIterator anIter( myViewManagerMap ); while( anIter.hasNext() ) { - GraphicsView_ViewManager* aViewManager = - dynamic_cast( anIter.next().value().first ); - if ( !aViewManager ) - continue; + SUIT_ViewManager* aViewManager = anIter.next().value().first; - int anId = anIter.key(); - aViewManagerIdList.append( anId ); + if ( theDisplayer->IsApplicable( aViewManager ) ) + { + int anId = anIter.key(); + aViewManagerIdList.append( anId ); + } } QListIterator anIdIter( aViewManagerIdList ); while( anIdIter.hasNext() ) - getDisplayer()->UpdateAll( anIdIter.next(), theIsInit, theIsForced, theDoFitAll ); -} - -void HYDROGUI_Module::updateOCCViewer( const bool theIsInit, - const bool theIsForced, - const bool theDoFitAll ) -{ - HYDROGUI_OCCDisplayer* anOCCDisplayer = getOCCDisplayer(); - if( !anOCCDisplayer ) - return; - - QList aViewManagerIdList; - - // currently, all views are updated - ViewManagerMapIterator anIter( myViewManagerMap ); - while( anIter.hasNext() ) - { - OCCViewer_ViewManager* aViewManager = - ::qobject_cast( anIter.next().value().first ); - if ( !aViewManager ) - continue; - - int anId = anIter.key(); - aViewManagerIdList.append( anId ); + { + theDisplayer->UpdateAll( anIdIter.next(), theIsInit, theIsForced, theDoFitAll ); } - - QListIterator anIdIter( aViewManagerIdList ); - while( anIdIter.hasNext() ) - anOCCDisplayer->UpdateAll( anIdIter.next(), theIsInit, theIsForced, theDoFitAll ); } void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager ) @@ -898,6 +1060,7 @@ void HYDROGUI_Module::createSelector( SUIT_ViewManager* theViewManager ) { SUIT_Selector* aSelector = *anIter; if( aSelector && ( !dynamic_cast( aSelector ) && + !dynamic_cast( aSelector ) && !dynamic_cast( aSelector ) ) ) aSelector->setEnabled( false ); }