X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_LandCoverMapOp.cxx;h=16162cfbc943f4302de60bbe10895303f2cf1ca0;hb=fce3f1240b6161d7cb837344078e5943b90eca65;hp=213256f6de8af9fe61ebff680711517cf5dc53fa;hpb=1bb7b3fb16a40077eaa8299a1e4be340b74f6db6;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_LandCoverMapOp.cxx b/src/HYDROGUI/HYDROGUI_LandCoverMapOp.cxx index 213256f6..16162cfb 100644 --- a/src/HYDROGUI/HYDROGUI_LandCoverMapOp.cxx +++ b/src/HYDROGUI/HYDROGUI_LandCoverMapOp.cxx @@ -22,7 +22,7 @@ #include "HYDROGUI_OCCDisplayer.h" #include "HYDROGUI_Operations.h" #include "HYDROGUI_LandCoverMapDlg.h" -#include "HYDROGUI_Tool.h" +#include "HYDROGUI_Tool2.h" #include "HYDROGUI_UpdateFlags.h" #include "HYDROGUI_DataObject.h" #include "HYDROGUI_ShapeLandCoverMap.h" @@ -38,9 +38,14 @@ #include #include +#include + +#include #include #include +#include #include +#include #include #include @@ -54,7 +59,8 @@ HYDROGUI_LandCoverMapOp::HYDROGUI_LandCoverMapOp( HYDROGUI_Module* theModule, const int theOperationId ) : HYDROGUI_Operation( theModule ), myOperationId( theOperationId ), - myPreviewPrs( 0 ) + myPreviewPrs( 0 ), + myPolylineFacePreviewPrs( 0 ) { switch( myOperationId ) { @@ -149,9 +155,13 @@ void HYDROGUI_LandCoverMapOp::abortOperation() { closePreview(); + bool aNoActiveOps = module()->getActiveOperations().isEmpty(); + HYDROGUI_Operation::abortOperation(); - module()->update( UF_OCCViewer | UF_FitAll ); + SalomeApp_Study* aStudy = dynamic_cast( module()->getApp()->activeStudy() ); + if ( aStudy && !aNoActiveOps ) + module()->update( UF_OCCViewer | UF_FitAll ); } void HYDROGUI_LandCoverMapOp::commitOperation() @@ -168,6 +178,8 @@ HYDROGUI_InputPanel* HYDROGUI_LandCoverMapOp::createInputPanel() const HYDROGUI_LandCoverMapDlg* aPanel = new HYDROGUI_LandCoverMapDlg( module(), getName(), myOperationId ); connect( aPanel, SIGNAL( landCoverMapChanged( const QString& ) ), this, SLOT( onLandCoverMapChanged( const QString& ) ) ); + connect( aPanel, SIGNAL( polylineFaceChanged() ), + this, SLOT( onPolylineFaceChanged() ) ); return aPanel; } @@ -285,9 +297,9 @@ bool HYDROGUI_LandCoverMapOp::processApply( int& theUpdateFlags, // Split land cover(s) inside edited land cover map if ( myOperationId == SplitLandCoverId ) { - bool aLandCoverSplitted = false; + bool aLandCoverSplit = false; if ( !aPolyline.IsNull() ) - aLandCoverSplitted = aLandCoverMapObj->Split( aPolyline ); + aLandCoverSplit = aLandCoverMapObj->Split( aPolyline ); else if ( !aFace.IsNull() ) { // Get the complete boundary of the object face as the splitting polyline @@ -302,12 +314,12 @@ bool HYDROGUI_LandCoverMapOp::processApply( int& theUpdateFlags, continue; bool aSplitResult = aLandCoverMapObj->Split( aShape ); - aLandCoverSplitted = ( i==0 ? aSplitResult : aLandCoverSplitted && aSplitResult ); + aLandCoverSplit = ( i==0 ? aSplitResult : aLandCoverSplit && aSplitResult ); } } - if ( !aLandCoverSplitted ) + if ( !aLandCoverSplit ) { - theErrorMsg = tr( "LAND_COVER_NOT_SPLITTED" ); + theErrorMsg = tr( "LAND_COVER_NOT_SPLIT" ); return false; } } @@ -364,6 +376,9 @@ bool HYDROGUI_LandCoverMapOp::processApply( int& theUpdateFlags, if ( myOperationId == CreateLandCoverMapId ) module()->enableLCMActions(); + if ( myOperationId == RemoveLandCoverId || myOperationId == MergeLandCoverId || myOperationId == ChangeLandCoverTypeId ) + aPanel->updateSelectedLandCoversLabel( getNbSelected() ); + return true; } @@ -382,6 +397,88 @@ void HYDROGUI_LandCoverMapOp::onLandCoverMapChanged( const QString& theName ) } } +void HYDROGUI_LandCoverMapOp::onPolylineFaceChanged() +{ + HYDROGUI_LandCoverMapDlg* aPanel = ::qobject_cast( inputPanel() ); + if ( !aPanel ) + return; + + LightApp_DataOwner* aPolylineFaceDataOwner = NULL; + Handle(HYDROData_Entity) aPolylineFace = aPanel->getPolylineFace(); + if ( !aPolylineFace.IsNull() ) + { + // Select chosen polyline/face in the Object Browser, if it is not selected yet + // (i.e. object was chosen not in the Object Browser or 3d Viewer, but in combo-box) + aPolylineFaceDataOwner = new LightApp_DataOwner( HYDROGUI_DataObject::dataObjectEntry( aPolylineFace ) ); + LightApp_SelectionMgr* aSelectionMgr = module()->getApp()->selectionMgr(); + if ( aSelectionMgr ) + { + bool bIsAlreadySelected = false; + SUIT_DataOwnerPtrList aSelectedOwners; + aSelectionMgr->selected( aSelectedOwners ); + foreach( SUIT_DataOwner* aSUITOwner, aSelectedOwners ) + { + if ( LightApp_DataOwner* anOwner = dynamic_cast( aSUITOwner ) ) + { + if ( anOwner->entry() == aPolylineFaceDataOwner->entry() ) + { + bIsAlreadySelected = true; + break; + } + } + } + if ( !bIsAlreadySelected ) + { + SUIT_DataOwnerPtrList aList( true ); + aList.append( SUIT_DataOwnerPtr( aPolylineFaceDataOwner ) ); + aSelectionMgr->setSelected( aList ); + } + } + + // Show Preview of selected polyline/face + Handle(HYDROData_PolylineXY) aPolyline = Handle(HYDROData_PolylineXY)::DownCast( aPolylineFace ); + Handle(HYDROData_Object) aFace = Handle(HYDROData_Object)::DownCast( aPolylineFace ); + if ( !aPolyline.IsNull() || !aFace.IsNull() ) + { + TopoDS_Shape aTopoDSShape; + if ( !aPolyline.IsNull() ) + aTopoDSShape = aPolyline->GetShape(); + else + aTopoDSShape = aFace->GetTopShape(); + + OCCViewer_ViewManager* aViewManager = ::qobject_cast( + module()->getApp()->getViewManager( OCCViewer_Viewer::Type(), true ) ); + if ( aViewManager ) + { + if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() ) + { + if ( myPolylineFacePreviewPrs ) + { + delete myPolylineFacePreviewPrs; + myPolylineFacePreviewPrs = 0; + } + + int aViewerId = (size_t)aViewer; + if ( !module()->isObjectVisible( aViewerId, aPolylineFace ) ) + { + Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext(); + if ( !aCtx.IsNull() ) + { + myPolylineFacePreviewPrs = new HYDROGUI_Shape( aCtx, NULL, getPreviewZLayer() ); + aCtx->ClearSelected(); + + myPolylineFacePreviewPrs->setBorderColor( Qt::white, false, false ); + myPolylineFacePreviewPrs->setShape( aTopoDSShape, true, true, !aPolyline.IsNull() ? AIS_WireFrame : AIS_Shaded ); + + module()->update( UF_OCCViewer | UF_FitAll ); + } + } + } + } + } + } +} + void HYDROGUI_LandCoverMapOp::onCreatePreview() { HYDROGUI_LandCoverMapDlg* aPanel = ::qobject_cast( inputPanel() ); @@ -402,34 +499,41 @@ void HYDROGUI_LandCoverMapOp::onCreatePreview() Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext(); if ( !aCtx.IsNull() ) { - disconnect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), - aViewer, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); - disconnect(aViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), - aViewer, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*))); - - connect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), - this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); - connect(aViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), - this, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*))); - - LightApp_SelectionMgr* aSelectionMgr = module()->getApp()->selectionMgr(); - if( aSelectionMgr ) + if ( myOperationId == RemoveLandCoverId || + myOperationId == MergeLandCoverId || + myOperationId == ChangeLandCoverTypeId ) { - QList aSelectorList; - aSelectionMgr->selectors( aViewManager->getType(), aSelectorList ); - QList::iterator anIter, anIterEnd = aSelectorList.end(); - for( anIter = aSelectorList.begin(); anIter != anIterEnd; anIter++ ) + disconnect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), + aViewer, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); + disconnect(aViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), + aViewer, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*))); + + connect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), + this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); + connect(aViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), + this, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*))); + + LightApp_SelectionMgr* aSelectionMgr = module()->getApp()->selectionMgr(); + if ( aSelectionMgr ) { - HYDROGUI_OCCSelector* aHydroSelector = dynamic_cast( *anIter ); - if ( aHydroSelector ) + QList aSelectorList; + aSelectionMgr->selectors( aViewManager->getType(), aSelectorList ); + QList::iterator anIter, anIterEnd = aSelectorList.end(); + for( anIter = aSelectorList.begin(); anIter != anIterEnd; anIter++ ) { - disconnect( aHydroSelector->viewer(), SIGNAL( deselection() ), aHydroSelector, SLOT( onDeselection() ) ); - connect( this, SIGNAL( deselection() ), aHydroSelector, SLOT( onDeselection() ) ); + HYDROGUI_OCCSelector* aHydroSelector = dynamic_cast( *anIter ); + if ( aHydroSelector ) + { + disconnect( aHydroSelector->viewer(), SIGNAL( deselection() ), aHydroSelector, SLOT( onDeselection() ) ); + connect( this, SIGNAL( deselection() ), aHydroSelector, SLOT( onDeselection() ) ); + } } } - } - connect( this, SIGNAL( selectionChanged() ), this, SLOT( onViewerSelectionChanged() ) ); + connect( this, SIGNAL( selectionChanged() ), this, SLOT( onViewerSelectionChanged() ) ); + } + else + connect( aViewer, SIGNAL( selectionChanged() ), this, SLOT( onViewerSelectionChanged() ) ); myPreviewPrs = new HYDROGUI_ShapeLandCoverMap( module()->getOCCDisplayer(), aCtx, myEditedObject, getPreviewZLayer()/*, theIsScalarMapMode*/ ); } } @@ -552,12 +656,18 @@ void HYDROGUI_LandCoverMapOp::onMouseRelease(SUIT_ViewWindow* theWindow, QMouseE void HYDROGUI_LandCoverMapOp::closePreview() { - if( myPreviewPrs ) + if ( myPreviewPrs ) { delete myPreviewPrs; myPreviewPrs = 0; } + if ( myPolylineFacePreviewPrs ) + { + delete myPolylineFacePreviewPrs; + myPolylineFacePreviewPrs = 0; + } + HYDROGUI_LandCoverMapDlg* aPanel = ::qobject_cast( inputPanel() ); if ( !aPanel ) return; @@ -565,33 +675,38 @@ void HYDROGUI_LandCoverMapOp::closePreview() if ( myOperationId == RemoveLandCoverId || myOperationId == MergeLandCoverId || myOperationId == ChangeLandCoverTypeId ) aPanel->setApplyEnabled( false ); - OCCViewer_ViewManager* aViewManager = getPreviewManager(); - if ( aViewManager ) + if ( myOperationId == RemoveLandCoverId || + myOperationId == MergeLandCoverId || + myOperationId == ChangeLandCoverTypeId ) { - if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() ) + OCCViewer_ViewManager* aViewManager = getPreviewManager(); + if ( aViewManager ) { - disconnect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), - this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); - disconnect(aViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), - this, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*))); - connect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), - aViewer, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); - connect(aViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), - aViewer, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*))); - - LightApp_SelectionMgr* aSelectionMgr = module()->getApp()->selectionMgr(); - if( aSelectionMgr ) + if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() ) { - QList aSelectorList; - aSelectionMgr->selectors( aViewManager->getType(), aSelectorList ); - QList::iterator anIter, anIterEnd = aSelectorList.end(); - for( anIter = aSelectorList.begin(); anIter != anIterEnd; anIter++ ) + disconnect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), + this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); + disconnect(aViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), + this, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*))); + connect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), + aViewer, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); + connect(aViewManager, SIGNAL(mouseRelease(SUIT_ViewWindow*, QMouseEvent*)), + aViewer, SLOT(onMouseRelease(SUIT_ViewWindow*, QMouseEvent*))); + + LightApp_SelectionMgr* aSelectionMgr = module()->getApp()->selectionMgr(); + if ( aSelectionMgr ) { - HYDROGUI_OCCSelector* aHydroSelector = dynamic_cast( *anIter ); - if ( aHydroSelector ) + QList aSelectorList; + aSelectionMgr->selectors( aViewManager->getType(), aSelectorList ); + QList::iterator anIter, anIterEnd = aSelectorList.end(); + for( anIter = aSelectorList.begin(); anIter != anIterEnd; anIter++ ) { - disconnect( this, SIGNAL( deselection() ), aHydroSelector, SLOT( onDeselection() ) ); - connect( aHydroSelector->viewer(), SIGNAL( deselection() ), aHydroSelector, SLOT( onDeselection() ) ); + HYDROGUI_OCCSelector* aHydroSelector = dynamic_cast( *anIter ); + if ( aHydroSelector ) + { + disconnect( this, SIGNAL( deselection() ), aHydroSelector, SLOT( onDeselection() ) ); + connect( aHydroSelector->viewer(), SIGNAL( deselection() ), aHydroSelector, SLOT( onDeselection() ) ); + } } } }