X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_Module.cxx;h=9b1d8f3d5334eead598b93f2ca9c9249ea2b0296;hb=fcf6bb94aa4bb389b1e4b2150d631048ef89e1ad;hp=e46e0cd97f70df8f1570080c20b706df2bcf1cf1;hpb=aba4698b8c55b90a7121060f99ecf7b27b5e1c9b;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_Module.cxx b/src/HYDROGUI/HYDROGUI_Module.cxx index e46e0cd9..9b1d8f3d 100644 --- a/src/HYDROGUI/HYDROGUI_Module.cxx +++ b/src/HYDROGUI/HYDROGUI_Module.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 @@ -34,6 +30,7 @@ #include "HYDROGUI_Operations.h" #include "HYDROGUI_PrsImage.h" #include "HYDROGUI_Tool.h" +#include "HYDROGUI_Tool2.h" #include "HYDROGUI_UpdateFlags.h" #include "HYDROGUI_Shape.h" #include "HYDROGUI_VTKPrs.h" @@ -44,10 +41,13 @@ #include "HYDROGUI_ImportGeomObjectOp.h" #include "HYDROGUI_ShowHideOp.h" +#include #include +#include #include #include -#include +#include +#include #include @@ -77,10 +77,12 @@ #include #include -#include -#include +#include #include #include +#include +#include +#include #include #include @@ -233,6 +235,10 @@ bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy ) } } +// SUIT_DataBrowser* ob = getApp()->objectBrowser(); +// SUIT_AbstractModel* treeModel = dynamic_cast( ob->model() ); +// treeModel->setAppropriate( SUIT_DataObject::VisibilityId, Qtx::Toggled ); + return aRes; } @@ -318,7 +324,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, bool anIsImageHasRefs = false; bool anIsFusedImage = false; bool anIsCutImage = false; - bool anIsSplittedImage = false; + bool anIsSplitImage = false; bool anIsMustObjectBeUpdated = false; bool anIsPolyline = false; bool anIsPolyline3D = false; @@ -332,6 +338,8 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, bool anIsRegion = false; bool anIsZone = false; bool anIsObstacle = false; + bool anIsStricklerTable = false; + bool anIsLandCoverMap = false; bool anIsStream = false; bool anIsChannel = false; bool anIsDigue = false; @@ -339,6 +347,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, bool anIsGroup = false; bool anIsObjectCanBeColored = false; bool isRoot = false; + bool isStreamHasBottom = false; SUIT_SelectionMgr* aSelectionMgr = getApp()->selectionMgr(); SUIT_DataOwnerPtrList anOwners; @@ -391,7 +400,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, anIsVisibleInSelection |= aVisibility; anIsHiddenInSelection |= !aVisibility; - if ( anObject->CanBeUpdated() && anObject->IsMustBeUpdated() ) + if ( anObject->CanBeUpdated() && anObject->IsMustBeUpdated( HYDROData_Entity::Geom_All ) ) { anIsMustObjectBeUpdated = true; } @@ -415,7 +424,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, else if( anOperatorName == ImageComposer_CutOperator::Type() ) anIsCutImage = true; else if( anOperatorName == ImageComposer_CropOperator::Type() ) - anIsSplittedImage = true; + anIsSplitImage = true; } } } @@ -449,20 +458,30 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, anIsBathymetry = true; else if( anObjectKind == KIND_OBSTACLE ) anIsObstacle = true; + else if( anObjectKind == KIND_STRICKLER_TABLE ) + anIsStricklerTable = true; + else if( anObjectKind == KIND_LAND_COVER_MAP ) + anIsLandCoverMap = true; else if( anObjectKind == KIND_STREAM ) + { anIsStream = true; + Handle(HYDROData_Stream) aStream = + Handle(HYDROData_Stream)::DownCast( anObject ); + if ( !aStream.IsNull() ) + isStreamHasBottom = !aStream->GetBottomPolyline().IsNull(); + } else if( anObjectKind == KIND_CHANNEL ) anIsChannel = true; else if( anObjectKind == KIND_DIGUE ) anIsDigue = true; else if( anObjectKind == KIND_DUMMY_3D ) anIsDummyObject3D = true; - else if( anObjectKind == KIND_SHAPES_GROUP || anObjectKind == KIND_SPLITTED_GROUP ) + else if( anObjectKind == KIND_SHAPES_GROUP || anObjectKind == KIND_SPLIT_GROUP ) anIsGroup = true; } if ( !anIsObjectCanBeColored ) - anIsObjectCanBeColored = HYDROGUI_SetColorOp::CanObjectBeColored( anObject ); + anIsObjectCanBeColored = HYDROGUI_SetColorOp::CanObjectBeColored( anObject, this ); } // Check if all selected objects are profiles @@ -496,10 +515,18 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( CreateBoxId ) ); theMenu->addAction( action( CreateCylinderId ) ); break; + case KIND_STRICKLER_TABLE: + theMenu->addAction( action( ImportStricklerTableFromFileId ) ); + break; + case KIND_LAND_COVER_MAP: + theMenu->addAction( action( CreateLandCoverMapId ) ); + theMenu->addAction( action( ImportLandCoverMapId ) ); + break; case KIND_CALCULATION: theMenu->addAction( action( CreateCalculationId ) ); break; case KIND_POLYLINEXY: + theMenu->addAction( action( ImportPolylineId ) ); theMenu->addAction( action( CreatePolylineId ) ); break; case KIND_POLYLINE: @@ -544,8 +571,8 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( EditFusedImageId ) ); else if( anIsCutImage ) theMenu->addAction( action( EditCutImageId ) ); - else if( anIsSplittedImage ) - theMenu->addAction( action( EditSplittedImageId ) ); + else if( anIsSplitImage ) + theMenu->addAction( action( EditSplitImageId ) ); } //RKV: BUG#98: theMenu->addAction( action( ObserveImageId ) ); @@ -562,6 +589,8 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( CutImagesId ) ); theMenu->addAction( action( SplitImageId ) ); theMenu->addSeparator(); + theMenu->addAction( action( RecognizeContoursId ) ); + theMenu->addSeparator(); } else if( anIsBathymetry ) { @@ -573,6 +602,9 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, { theMenu->addAction( action( EditPolylineId ) ); theMenu->addSeparator(); + theMenu->addAction( action( SplitPolylinesId ) ); + theMenu->addAction( action( MergePolylinesId ) ); + theMenu->addSeparator(); } else if( anIsPolyline3D ) { @@ -599,6 +631,12 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, else if( anIsStream ) { theMenu->addAction( action( EditStreamId ) ); + if ( action( RiverBottomContextId ) ) + { + theMenu->addAction( action( RiverBottomContextId ) ); + action( RiverBottomContextId )->setEnabled( !isStreamHasBottom ); + } + theMenu->addAction( action( ProfileInterpolateId ) ); theMenu->addSeparator(); } else if( anIsChannel ) @@ -616,6 +654,37 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addAction( action( TranslateObstacleId ) ); theMenu->addSeparator(); } + else if( anIsStricklerTable ) + { + theMenu->addAction( action( EditStricklerTableId ) ); + theMenu->addAction( action( ExportStricklerTableFromFileId ) ); + theMenu->addAction( action( DuplicateStricklerTableId ) ); + theMenu->addSeparator(); + + Handle(HYDROData_StricklerTable) aTable = + Handle(HYDROData_StricklerTable)::DownCast( aSeq.First() ); + QString aCurrentTable = + HYDROGUI_DataObject::dataObjectEntry( getLandCoverColoringTable( anActiveViewId ) ); + bool isUsed = aCurrentTable == HYDROGUI_DataObject::dataObjectEntry( aTable ); + + if ( !isUsed && !getObjectShapes( anActiveViewId, KIND_LAND_COVER_MAP ).isEmpty() ) { + theMenu->addAction( action( LandCoverScalarMapModeOnId ) ); + theMenu->addSeparator(); + } + } + else if( anIsLandCoverMap ) + { + theMenu->addAction( action( AddLandCoverId ) ); + theMenu->addAction( action( RemoveLandCoverId ) ); + theMenu->addSeparator(); + theMenu->addAction( action( SplitLandCoverId ) ); + theMenu->addAction( action( MergeLandCoverId ) ); + theMenu->addAction( action( ChangeLandCoverTypeId ) ); + theMenu->addSeparator(); + // + theMenu->addAction( action( ExportToShapeFileID ) ); + theMenu->addSeparator(); + } else if( anIsVisualState && anIsObjectBrowser ) { theMenu->addAction( action( SaveVisualStateId ) ); @@ -623,17 +692,34 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addSeparator(); } + if ( anIsStream || anIsChannel || anIsDigue || anIsObstacle ) + { + theMenu->addAction( action( PolylineExtractionId ) ); + theMenu->addSeparator(); + } + // Add set color action for geometrical objects if ( anIsObjectCanBeColored ) { theMenu->addAction( action( SetColorId ) ); theMenu->addSeparator(); } + + // Add transparency action for land cover map objects + if ( anIsLandCoverMap ) + { + theMenu->addAction( action( SetTransparencyId ) ); + theMenu->addSeparator(); + } } else if ( anAllAreProfiles ) { theMenu->addAction( action( SelectedGeoreferencementId ) ); theMenu->addSeparator(); } + bool anIsPoly = anIsPolyline || anIsPolyline3D; + if (anIsPoly && !anIsLandCoverMap) + theMenu->addAction( action( ExportToShapeFileID ) ); + // Add copy action QAction* aCopyAction = action( CopyId ); if( aCopyAction && aCopyAction->isEnabled() ) { @@ -651,7 +737,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, anIsImmersibleZone || anIsZone || anIsRegion || anIsBathymetry || anIsObstacle || anIsStream || anIsChannel || anIsDigue || anIsDummyObject3D || - anIsValidProfile || anIsGroup ) + anIsValidProfile || anIsGroup || anIsLandCoverMap ) { if( anIsHiddenInSelection ) theMenu->addAction( action( ShowId ) ); @@ -672,6 +758,11 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, theMenu->addSeparator(); theMenu->addAction( action( SetZLevelId ) ); theMenu->addSeparator(); + + if ( isLandCoversScalarMapModeOn( anActiveViewId ) ) { + theMenu->addAction( action( LandCoverScalarMapModeOffId ) ); + theMenu->addSeparator(); + } } if( anIsObjectBrowser || anIsGraphicsView || anIsOCCView || anIsVTKView ) @@ -689,11 +780,84 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient, if( isRoot ) theMenu->addAction( action( EditLocalCSId ) ); + + if( anIsObjectBrowser && anOwners.size()==1 ) + { + if( aSeq.Size() > 0 ) + { + Handle( HYDROData_Object ) anObject = Handle( HYDROData_Object )::DownCast( aSeq.First() ); + if( !anObject.IsNull() ) + { + theMenu->addSeparator(); + theMenu->addAction( action( SubmersibleId ) ); + action( SubmersibleId )->setCheckable( true ); + action( SubmersibleId )->setChecked( anObject->IsSubmersible() ); + } + } + } +} + +void HYDROGUI_Module::createPreferences() +{ + int genTab = addPreference( tr( "PREF_TAB_GENERAL" ) ); + int CursorGroup = addPreference( tr( "PREF_GROUP_CURSOR" ), genTab ); + + int typeOfCursor = addPreference( tr( "PREF_TYPE_OF_CURSOR" ), CursorGroup, + LightApp_Preferences::Selector, "preferences", "type_of_cursor" ); + + // Set property cursor type + QList aCursorTypeIndicesList; + QList aCursorTypeIconsList; + + SUIT_ResourceMgr* resMgr = SUIT_Session::session()->resourceMgr(); + for ( int i = CT_ArrowCursor; i < CT_User; i++ ) { + QString icoFile = QString( "ICON_CURSOR_%1" ).arg( i+1 ); + QPixmap pixmap = resMgr->loadPixmap( "HYDRO", tr( qPrintable( icoFile ) ) ); + aCursorTypeIndicesList << i; + aCursorTypeIconsList << pixmap; + } + + setPreferenceProperty( typeOfCursor, "indexes", aCursorTypeIndicesList ); + setPreferenceProperty( typeOfCursor, "icons", aCursorTypeIconsList ); + + int viewerGroup = addPreference( tr( "PREF_GROUP_VIEWER" ), genTab ); + addPreference( tr( "PREF_VIEWER_AUTO_FITALL" ), viewerGroup, + LightApp_Preferences::Bool, "HYDRO", "auto_fit_all" ); + + int StricklerTableGroup = addPreference( tr( "PREF_GROUP_STRICKLER_TABLE" ), genTab ); + int defaultStricklerCoef = addPreference( tr( "PREF_DEFAULT_STRICKLER_COEFFICIENT" ), StricklerTableGroup, + LightApp_Preferences::DblSpin, "preferences", "default_strickler_coefficient" ); + setPreferenceProperty( defaultStricklerCoef, "precision", 2 ); + setPreferenceProperty( defaultStricklerCoef, "min", 0.00 ); + setPreferenceProperty( defaultStricklerCoef, "max", 1000000.00 ); + setPreferenceProperty( defaultStricklerCoef, "step", 0.01 ); +} + +void HYDROGUI_Module::preferencesChanged( const QString& theSection, const QString& thePref ) +{ + if ( theSection == "preferences" && thePref == "default_strickler_coefficient" ) + { + SUIT_ResourceMgr* resMgr = application()->resourceMgr(); + Handle(HYDROData_Document) aDoc = HYDROData_Document::Document( application()->activeStudy()->id() ); + if ( resMgr && !aDoc.IsNull() ) + aDoc->SetDefaultStricklerCoefficient( resMgr->doubleValue( theSection, thePref, 0 ) ); + } + else + LightApp_Module::preferencesChanged( theSection, thePref ); +} + +QCursor HYDROGUI_Module::getPrefEditCursor() const +{ + int aCursorType = SUIT_Session::session()->resourceMgr()->integerValue("preferences", "type_of_cursor", (int)CT_CrossCursor ); + if ( aCursorType >= Qt::BlankCursor) + aCursorType++; + QCursor aCursor = QCursor( Qt::CursorShape(aCursorType) ); + return aCursor; } void HYDROGUI_Module::update( const int flags ) { - if( !isUpdateEnabled() ) + if ( !isUpdateEnabled() ) return; QApplication::setOverrideCursor( Qt::WaitCursor ); @@ -706,6 +870,12 @@ void HYDROGUI_Module::update( const int flags ) QStringList aSelectedEntries = storeSelection(); bool aDoFitAll = flags & UF_FitAll; + if ( aDoFitAll ) + { + SUIT_ResourceMgr* aResMgr = getApp()->resourceMgr(); + aDoFitAll = aResMgr->booleanValue( "HYDRO", "auto_fit_all", false ); + } + if( ( flags & UF_Viewer ) ) updateViewer( getDisplayer(), flags & UF_GV_Init, flags & UF_GV_Forced, aDoFitAll ); @@ -876,6 +1046,17 @@ bool HYDROGUI_Module::isObjectVisible( const int theViewId, if( theObject.IsNull() ) return false; + if( theViewId < 0 ) + { + //search in all + foreach( int aViewId, myObjectStateMap.keys() ) + { + if( isObjectVisible( aViewId, theObject ) ) + return true; + } + return false; + } + ViewId2Entry2ObjectStateMap::const_iterator anIter1 = myObjectStateMap.find( theViewId ); if( anIter1 != myObjectStateMap.end() ) { @@ -903,6 +1084,22 @@ void HYDROGUI_Module::setObjectVisible( const int theViewId, ObjectState& anObjectState = aEntry2ObjectStateMap[ anEntry ]; anObjectState.Visibility = theState; + + HYDROGUI_DataObject* hydroObject = getDataModel()->getDataObject( theObject ); + if ( hydroObject ) + { + SUIT_AbstractModel* treeModel = dynamic_cast( getApp()->objectBrowser()->model() ); + QString id = hydroObject->text( hydroObject->customData( Qtx::IdType ).toInt() ); + Qtx::VisibilityState visState = treeModel->visibilityState( id ); + if ( visState != Qtx::UnpresentableState ) + treeModel->setVisibilityState( id, theState ? Qtx::ShownState : Qtx::HiddenState ); + } + + if ( theObject->GetKind() == KIND_BATHYMETRY && theState ) { + setLandCoversScalarMapModeOff( theViewId ); + } else if ( theObject->GetKind() == KIND_LAND_COVER_MAP && theState ) { + getOCCDisplayer()->SetToUpdateColorScale(); + } } } @@ -1185,6 +1382,11 @@ void HYDROGUI_Module::updateVTKZRange( const int theViewId, double theRange[] ) } /////////////////// END OF VTKPrs PROCESSING +void HYDROGUI_Module::clearCache() +{ + myObjectStateMap.clear(); +} + CAM_DataModel* HYDROGUI_Module::createDataModel() { return new HYDROGUI_DataModel( this ); @@ -1306,8 +1508,11 @@ void HYDROGUI_Module::onViewManagerRemoved( SUIT_ViewManager* theViewManager ) if ( anOCCViewManager ) { OCCViewer_Viewer* anOCCViewer = anOCCViewManager->getOCCViewer(); - if ( anOCCViewer ) - removeViewShapes( (size_t)anOCCViewer ); + if ( anOCCViewer ) { + int aViewerId = (size_t)anOCCViewer; + removeViewShapes( aViewerId ); + setLandCoversScalarMapModeOff( aViewerId ); + } } if ( getVTKDisplayer()->IsApplicable( theViewManager ) ) @@ -1579,3 +1784,88 @@ HYDROGUI_Operation* HYDROGUI_Module::activeOperation() return anOp; } + +/*! + * \brief Virtual public slot + * + * This method is called after the object inserted into data view to update their visibility state + * This is default implementation + */ +void HYDROGUI_Module::onObjectClicked( SUIT_DataObject* theObject, int theColumn ) +{ + if ( !isActiveModule() ) + return; + + HYDROGUI_DataObject* hydroObject = dynamic_cast( theObject ); + + // change visibility of object + if ( !hydroObject || theColumn != SUIT_DataObject::VisibilityId ) + return; + + SUIT_AbstractModel* treeModel = dynamic_cast( getApp()->objectBrowser()->model() ); + + QString id = theObject->text( theObject->customData( Qtx::IdType ).toInt() ); + Qtx::VisibilityState visState = treeModel->visibilityState( id ); + if ( visState == Qtx::UnpresentableState ) + return; + + visState = visState == Qtx::ShownState ? Qtx::HiddenState : Qtx::ShownState; + treeModel->setVisibilityState( id, visState ); + + bool vis = visState == Qtx::ShownState; + if ( vis == isObjectVisible( HYDROGUI_Tool::GetActiveViewId( this ), hydroObject->modelObject() ) ) + return; + + setObjectVisible( HYDROGUI_Tool::GetActiveViewId( this ), hydroObject->modelObject(), vis ); + + update( UF_OCCViewer | ( visState == Qtx::ShownState ? UF_FitAll : 0 ) ); +} + +Handle(HYDROData_StricklerTable) HYDROGUI_Module::getLandCoverColoringTable( const int theViewId ) const +{ + Handle(HYDROData_StricklerTable) aTable; + + if ( myLandCoverColoringMap.contains( theViewId ) ) { + aTable = myLandCoverColoringMap.value( theViewId ); + } + + return aTable; +} + +void HYDROGUI_Module::setLandCoverColoringTable( const int theViewId, + const Handle(HYDROData_StricklerTable)& theTable ) +{ + if ( !theTable.IsNull() ) { + myLandCoverColoringMap.insert( theViewId, theTable ); + } +} + +void HYDROGUI_Module::setLandCoversScalarMapModeOff( const int theViewId ) +{ + myLandCoverColoringMap.remove( theViewId ); +} + +bool HYDROGUI_Module::isLandCoversScalarMapModeOn( const int theViewId ) const +{ + return myLandCoverColoringMap.contains( theViewId ); +} + +void HYDROGUI_Module::setObjectRemoved( const Handle(HYDROData_Entity)& theObject ) +{ + if ( theObject.IsNull() || !theObject->IsRemoved() ) { + return; + } + + if ( theObject->GetKind() == KIND_STRICKLER_TABLE ) { + Handle(HYDROData_StricklerTable) aTable = + Handle(HYDROData_StricklerTable)::DownCast( theObject ); + QList aViewIds; + QMutableMapIterator anIter( myLandCoverColoringMap ); + while ( anIter.hasNext() ) { + if ( HYDROGUI_DataObject::dataObjectEntry( anIter.next().value() ) == + HYDROGUI_DataObject::dataObjectEntry( aTable ) ) { + anIter.remove(); + } + } + } +}