X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Module.cxx;h=d08d53b5aaa3f980bf9f84d5def5df83aec0635d;hb=cd6ea20d9a76665a24a533d0340385a335961f05;hp=dfcc1921cd8442c5cde5a0503305d7cd17acc3ac;hpb=a83bc991366e4957deec730823a6d76b91e6b60d;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index dfcc1921..d08d53b5 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.cxx @@ -1,4 +1,4 @@ -// Copyright (C) 2007-2013 CEA/DEN, EDF R&D, OPEN CASCADE +// Copyright (C) 2007-2015 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 @@ -6,7 +6,7 @@ // 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,6 +24,7 @@ #include "HYDROGUI.h" #include "HYDROGUI_DataModel.h" +#include "HYDROGUI_DataObject.h" #include "HYDROGUI_Displayer.h" #include "HYDROGUI_GVSelector.h" #include "HYDROGUI_InputPanel.h" @@ -41,6 +42,7 @@ #include "HYDROGUI_PolylineOp.h" #include "HYDROGUI_SetColorOp.h" #include "HYDROGUI_ImportGeomObjectOp.h" +#include "HYDROGUI_ShowHideOp.h" #include #include @@ -49,6 +51,8 @@ #include +#include + #include #include #include @@ -76,9 +80,11 @@ #include #include #include +#include #include #include +#include #include #include @@ -94,6 +100,7 @@ #include #include #include +#include static int ViewManagerId = 0; @@ -252,6 +259,12 @@ bool HYDROGUI_Module::deactivateModule( SUIT_Study* theStudy ) myVTKPrsMap.clear(); */ + // clear the status bar + SUIT_Desktop* aDesktop = getApp()->desktop(); + if ( aDesktop && aDesktop->statusBar() ) { + aDesktop->statusBar()->clearMessage(); + } + // clear the data model's list of copying objects HYDROGUI_DataModel::changeCopyingObjects( HYDROData_SequenceOfObjects() ); @@ -262,6 +275,7 @@ bool HYDROGUI_Module::deactivateModule( SUIT_Study* theStudy ) HYDROGUI_Tool::setOCCActionShown( this, OCCViewer_ViewWindow::MaximizedId, true ); + myActiveOperationMap.clear(); return LightApp_Module::deactivateModule( theStudy ); } @@ -324,6 +338,18 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, bool anIsDummyObject3D = false; bool anIsGroup = false; bool anIsObjectCanBeColored = false; + bool isRoot = false; + + SUIT_SelectionMgr* aSelectionMgr = getApp()->selectionMgr(); + SUIT_DataOwnerPtrList anOwners; + aSelectionMgr->selected( anOwners ); + if( anIsObjectBrowser && anOwners.size()==1 ) + { + QString anEntry = anOwners[0]->keyString(); + LightApp_Study* aStudy = dynamic_cast( getApp()->activeStudy() ); + if( aStudy ) + isRoot = aStudy->isComponent( anEntry ); + } // Check the selected GEOM objects (take into account the Object Browser only) if ( anIsObjectBrowser ) { @@ -499,6 +525,12 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( UpdateObjectId ) ); theMenu->addSeparator(); } + else + { + theMenu->addAction( action( ForcedUpdateObjectId ) ); + theMenu->addSeparator(); + } + if( aSeq.Length() == 1 ) { @@ -579,6 +611,11 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( EditDigueId ) ); theMenu->addSeparator(); } + else if( anIsObstacle ) + { + theMenu->addAction( action( TranslateObstacleId ) ); + theMenu->addSeparator(); + } else if( anIsVisualState && anIsObjectBrowser ) { theMenu->addAction( action( SaveVisualStateId ) ); @@ -597,8 +634,17 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addSeparator(); } + // Add copy action + QAction* aCopyAction = action( CopyId ); + if( aCopyAction && aCopyAction->isEnabled() ) { + theMenu->addAction( action( CopyId ) ); + theMenu->addSeparator(); + } + + // Add delete action if( !anIsDummyObject3D ) theMenu->addAction( action( DeleteId ) ); + theMenu->addSeparator(); if( anIsImage || anIsPolyline || anIsPolyline3D || @@ -622,6 +668,10 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, HYDROGUI_PolylineOp* aPolylineOp = dynamic_cast( anOp ); if ( aPolylineOp && aPolylineOp->deleteEnabled() ) theMenu->addAction( action( DeleteId ) ); + + theMenu->addSeparator(); + theMenu->addAction( action( SetZLevelId ) ); + theMenu->addSeparator(); } if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView || anIsVTKView ) @@ -630,6 +680,15 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( HideAllId ) ); theMenu->addSeparator(); } + + if ( anIsOCCView || anIsVTKView ) + { + theMenu->addSeparator(); + theMenu->addAction( action( CopyViewerPositionId ) ); + } + + if( isRoot ) + theMenu->addAction( action( EditLocalCSId ) ); } void HYDROGUI_Module::update( const int flags ) @@ -664,8 +723,17 @@ void HYDROGUI_Module::update( const int flags ) // the selection in the object browser. // Note: processEvents() should be called after updateGV(), // otherwise the application crashes from time to time. - //RKV: qApp->processEvents(); + //RKV: qApp->processEvents(); + SUIT_ResourceMgr* aResMgr = getApp()->resourceMgr(); + bool isResizeOnExpandItem = aResMgr->booleanValue( "ObjectBrowser", "resize_on_expand_item", false ); + SUIT_DataBrowser* anObjectBrowser = getApp()->objectBrowser(); + if ( isResizeOnExpandItem && anObjectBrowser ) { + anObjectBrowser->setResizeOnExpandItem( false ); // MZN: ISSUE #280 + } getApp()->updateObjectBrowser( true ); + if ( isResizeOnExpandItem && anObjectBrowser ) { + anObjectBrowser->setResizeOnExpandItem( true ); // MZN: ISSUE #280 + } } // Object browser is currently updated by using UF_Model flag @@ -808,12 +876,14 @@ bool HYDROGUI_Module::isObjectVisible( const int theViewId, if( theObject.IsNull() ) return false; - ViewId2Name2ObjectStateMap::const_iterator anIter1 = myObjectStateMap.find( theViewId ); + ViewId2Entry2ObjectStateMap::const_iterator anIter1 = myObjectStateMap.find( theViewId ); if( anIter1 != myObjectStateMap.end() ) { - const Name2ObjectStateMap& aName2ObjectStateMap = anIter1.value(); - Name2ObjectStateMap::const_iterator anIter2 = aName2ObjectStateMap.find( theObject->GetName()); - if( anIter2 != aName2ObjectStateMap.end() ) + const Entry2ObjectStateMap& aEntry2ObjectStateMap = anIter1.value(); + QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theObject ); + + Entry2ObjectStateMap::const_iterator anIter2 = aEntry2ObjectStateMap.find( anEntry ); + if( anIter2 != aEntry2ObjectStateMap.end() ) { const ObjectState& anObjectState = anIter2.value(); return anObjectState.Visibility; @@ -828,13 +898,68 @@ void HYDROGUI_Module::setObjectVisible( const int theViewId, { if( !theObject.IsNull() ) { - Name2ObjectStateMap& aName2ObjectStateMap = myObjectStateMap[ theViewId ]; - ObjectState& anObjectState = aName2ObjectStateMap[ theObject->GetName() ]; + Entry2ObjectStateMap& aEntry2ObjectStateMap = myObjectStateMap[ theViewId ]; + QString anEntry = HYDROGUI_DataObject::dataObjectEntry( theObject ); + + ObjectState& anObjectState = aEntry2ObjectStateMap[ anEntry ]; anObjectState.Visibility = theState; } } +void HYDROGUI_Module::setIsToUpdate( const Handle(HYDROData_Entity)& theObject, + const bool theState ) +{ + if( !theObject.IsNull() ) + { + // Process OCC shapes + ViewId2ListOfShapes::const_iterator aShapesMapIter( myShapesMap.begin() ); + while( aShapesMapIter != myShapesMap.end() ) + { + const ListOfShapes& aShapesList = aShapesMapIter.value(); + foreach ( HYDROGUI_Shape* aShape, aShapesList ) + { + if ( aShape && IsEqual( aShape->getObject(), theObject ) ) + { + aShape->setIsToUpdate( theState ); + } + } + aShapesMapIter++; + } + // Process VTK shapes + ViewId2ListOfVTKPrs::const_iterator aVTKPrsMapIter( myVTKPrsMap.begin() ); + while( aVTKPrsMapIter != myVTKPrsMap.end() ) + { + const ListOfVTKPrs& aShapesList = aVTKPrsMapIter.value(); + foreach ( HYDROGUI_VTKPrs* aShape, aShapesList ) + { + if ( aShape && IsEqual( aShape->getObject(), theObject ) ) + { + aShape->setIsToUpdate( theState ); + } + } + aVTKPrsMapIter++; + } + } +} + /////////////////// OCC SHAPES PROCESSING +QList HYDROGUI_Module::getObjectShapes( const int theViewId, + ObjectKind theKind ) const +{ + QList aResult; + + if ( myShapesMap.contains( theViewId ) ) + { + const ListOfShapes& aViewShapes = myShapesMap.value( theViewId ); + foreach ( HYDROGUI_Shape* aShape, aViewShapes ) + { + if( aShape && aShape->getObject()->GetKind()==theKind ) + aResult.append( aShape ); + } + } + return aResult; +} + HYDROGUI_Shape* HYDROGUI_Module::getObjectShape( const int theViewId, const Handle(HYDROData_Entity)& theObject ) const { @@ -967,6 +1092,35 @@ void HYDROGUI_Module::setObjectVTKPrs( const int theViewId aViewShapes.append( theShape ); } +void HYDROGUI_Module::removeObjectVTKPrs( const int theViewId, + const QString& theEntry ) +{ + if ( !myVTKPrsMap.contains( theViewId ) ) + return; + + ListOfVTKPrs& aViewShapes = myVTKPrsMap[ theViewId ]; + Handle(HYDROData_Entity) anObject; + QString anEntryRef; + for ( int i = 0; i < aViewShapes.length(); ) + { + HYDROGUI_VTKPrs* aShape = aViewShapes.at( i ); + anObject = aShape->getObject(); + anEntryRef = HYDROGUI_DataObject::dataObjectEntry( anObject ); + if ( aShape && (!anObject.IsNull()) && ( anEntryRef == theEntry ) ) + { + 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::removeObjectVTKPrs( const int theViewId, const Handle(HYDROData_Entity)& theObject ) { @@ -1094,6 +1248,16 @@ bool HYDROGUI_Module::eventFilter( QObject* theObj, QEvent* theEvent ) } } } + else if ( theObj->inherits( "SVTK_ViewWindow" ) ) + { + if( aType == QEvent::Leave ) + { + SUIT_Desktop* aDesktop = getApp()->desktop(); + if ( aDesktop && aDesktop->statusBar() ) { + aDesktop->statusBar()->clearMessage(); + } + } + } return LightApp_Module::eventFilter( theObj, theEvent ); } @@ -1114,6 +1278,13 @@ void HYDROGUI_Module::onViewManagerAdded( SUIT_ViewManager* theViewManager ) connect( theViewManager, SIGNAL( mouseMove( SUIT_ViewWindow*, QMouseEvent* ) ), this, SLOT( onMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) ); } + else if( theViewManager->getType() == SVTK_Viewer::Type() ) + { + connect( theViewManager, SIGNAL( viewCreated( SUIT_ViewWindow* ) ), + this, SLOT( onViewCreated( SUIT_ViewWindow* ) ) ); + connect( theViewManager, SIGNAL( mouseMove( SUIT_ViewWindow*, QMouseEvent* ) ), + this, SLOT( onMouseMove( SUIT_ViewWindow*, QMouseEvent* ) ) ); + } createSelector( theViewManager ); // replace the default selector @@ -1181,6 +1352,13 @@ void HYDROGUI_Module::onViewCreated( SUIT_ViewWindow* theViewWindow ) } } } + else if( theViewWindow && theViewWindow->inherits( "SVTK_ViewWindow" ) ) + { + if( SVTK_ViewWindow* aViewFrame = dynamic_cast( theViewWindow ) ) + { + aViewFrame->installEventFilter( this ); + } + } } void HYDROGUI_Module::onViewPortMouseEvent( QGraphicsSceneMouseEvent* theEvent ) @@ -1344,28 +1522,60 @@ void HYDROGUI_Module::restoreSelection( const QStringList& theEntryList ) } } -void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* theEvent ) +void HYDROGUI_Module::onMouseMove( SUIT_ViewWindow* theViewWindow, QMouseEvent* ) { - OCCViewer_ViewWindow* anOCCViewWindow = - dynamic_cast(theViewWindow); - if ( !anOCCViewWindow ) { - return; + double X, Y, Z; + bool doShow = false; + HYDROGUI_Displayer* aDisplayer = getDisplayer(); + if ( aDisplayer ) + aDisplayer->SaveCursorViewPosition( theViewWindow ); + doShow = aDisplayer->GetCursorViewCoordinates( theViewWindow, X, Y, Z ); + + if ( doShow ) + { + // Show the coordinates in the status bar + SUIT_Desktop* aDesktop = getApp()->desktop(); + if ( aDesktop && aDesktop->statusBar() ) + { + gp_Pnt aWPnt( X, Y, Z ); + int aStudyId = application()->activeStudy()->id(); + HYDROData_Document::Document( aStudyId )->Transform( aWPnt, false ); + double WX = aWPnt.X(), WY = aWPnt.Y(); + + QString aXStr = HYDROGUI_Tool::GetCoordinateString( X, true ); + QString anYStr = HYDROGUI_Tool::GetCoordinateString( Y, true ); + QString aWXStr = HYDROGUI_Tool::GetCoordinateString( WX, true ); + QString aWYStr = HYDROGUI_Tool::GetCoordinateString( WY, true ); + QString aMsg = tr( "COORDINATES_INFO" ); + aMsg = aMsg.arg( aXStr ).arg( anYStr ).arg( aWXStr ).arg( aWYStr ); + aDesktop->statusBar()->showMessage( aMsg ); + } } +} - // Get the selected point coordinates - OCCViewer_ViewPort3d* aViewPort = anOCCViewWindow->getViewPort(); - if ( !aViewPort ) { - return; - } +/** + * Returns stack of active operations; + */ +QStack& HYDROGUI_Module::getActiveOperations() +{ + return myActiveOperationMap; +} - gp_Pnt aPnt = GEOMUtils::ConvertClickToPoint( theEvent->x(), theEvent->y(), - aViewPort->getView() ); +/** + * Returns the module active operation. If the active operation is show/hide, + * the method returns the previous operation if it is. + */ +HYDROGUI_Operation* HYDROGUI_Module::activeOperation() +{ + HYDROGUI_Operation* anOp = !myActiveOperationMap.empty() ? myActiveOperationMap.top() : 0; - // Show the coordinates in the status bar - SUIT_Desktop* aDesktop = getApp()->desktop(); - if ( aDesktop && aDesktop->statusBar() ) { - QString aX = HYDROGUI_Tool::GetCoordinateString( aPnt.X() ); - QString anY = HYDROGUI_Tool::GetCoordinateString( aPnt.Y() ); - aDesktop->statusBar()->showMessage( tr("COORDINATES_INFO").arg( aX ).arg( anY ) ); + if ( dynamic_cast( anOp ) ) + { + QVectorIterator aVIt( myActiveOperationMap ); + aVIt.toBack(); + aVIt.previous(); // skip the top show/hide operation + anOp = aVIt.hasPrevious() ? aVIt.previous() : 0; } -} \ No newline at end of file + + return anOp; +}