From 0e7bd9055ccd5c3ea96afd9d36e2f0e2ba41f2df Mon Sep 17 00:00:00 2001 From: mkr Date: Wed, 18 Nov 2015 17:49:03 +0300 Subject: [PATCH] refs #709, #710, #711: bugs fixes, synchronization between selection in Polyline/Face combo-box and Object Browser, preview for Polyline/Face selected in the combo-box within Add and Split land cover operations. --- src/HYDROGUI/HYDROGUI_LandCoverMapDlg.cxx | 15 +- src/HYDROGUI/HYDROGUI_LandCoverMapDlg.h | 3 +- src/HYDROGUI/HYDROGUI_LandCoverMapOp.cxx | 199 +++++++++++++++++----- src/HYDROGUI/HYDROGUI_LandCoverMapOp.h | 2 + src/HYDROGUI/HYDROGUI_Shape.cxx | 5 +- src/HYDROGUI/HYDROGUI_Shape.h | 3 +- 6 files changed, 174 insertions(+), 53 deletions(-) diff --git a/src/HYDROGUI/HYDROGUI_LandCoverMapDlg.cxx b/src/HYDROGUI/HYDROGUI_LandCoverMapDlg.cxx index 565b678f..c0b687a5 100644 --- a/src/HYDROGUI/HYDROGUI_LandCoverMapDlg.cxx +++ b/src/HYDROGUI/HYDROGUI_LandCoverMapDlg.cxx @@ -24,6 +24,14 @@ #include #include +#include + +#include +#include +#include + +#include + #include #include #include @@ -82,7 +90,7 @@ HYDROGUI_LandCoverMapDlg::HYDROGUI_LandCoverMapDlg( HYDROGUI_Module* theModule, // Connect signals and slots connect( myObjectNameEdit, SIGNAL( currentIndexChanged( int ) ), this, SLOT( onLandCoverMapChanged() ) ); - connect( myPolylinesFaces, SIGNAL( objectSelected( const QString& ) ), this, SLOT( onPolylineFaceChanged( const QString& ) ) ); + connect( myPolylinesFaces, SIGNAL( objectSelected( const QString& ) ), this, SLOT( onPolylineFaceChanged() ) ); updateState( true ); @@ -174,10 +182,11 @@ void HYDROGUI_LandCoverMapDlg::onLandCoverMapChanged() emit landCoverMapChanged( getObjectName() ); } -void HYDROGUI_LandCoverMapDlg::onPolylineFaceChanged( const QString& ) +void HYDROGUI_LandCoverMapDlg::onPolylineFaceChanged() { updateState(); - // TODO: select chosen polyline/face in the 3D viewer, if it is not selected yet (i.e. object was chosen not in the viewer, but in combo-box) + + emit polylineFaceChanged(); } void HYDROGUI_LandCoverMapDlg::updateState( bool theInitialConfigure ) diff --git a/src/HYDROGUI/HYDROGUI_LandCoverMapDlg.h b/src/HYDROGUI/HYDROGUI_LandCoverMapDlg.h index 101c1f85..3547feb8 100644 --- a/src/HYDROGUI/HYDROGUI_LandCoverMapDlg.h +++ b/src/HYDROGUI/HYDROGUI_LandCoverMapDlg.h @@ -53,10 +53,11 @@ public: signals: void landCoverMapChanged( const QString& theName ); + void polylineFaceChanged(); private slots: void onLandCoverMapChanged(); - void onPolylineFaceChanged( const QString& ); + void onPolylineFaceChanged(); private: void updateState( bool theInitialConfigure = false ); diff --git a/src/HYDROGUI/HYDROGUI_LandCoverMapOp.cxx b/src/HYDROGUI/HYDROGUI_LandCoverMapOp.cxx index 5db4f16b..7aa4036b 100644 --- a/src/HYDROGUI/HYDROGUI_LandCoverMapOp.cxx +++ b/src/HYDROGUI/HYDROGUI_LandCoverMapOp.cxx @@ -38,9 +38,13 @@ #include #include +#include + #include #include +#include #include +#include #include #include @@ -54,7 +58,8 @@ HYDROGUI_LandCoverMapOp::HYDROGUI_LandCoverMapOp( HYDROGUI_Module* theModule, const int theOperationId ) : HYDROGUI_Operation( theModule ), myOperationId( theOperationId ), - myPreviewPrs( 0 ) + myPreviewPrs( 0 ), + myPolylineFacePreviewPrs( 0 ) { switch( myOperationId ) { @@ -168,6 +173,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; } @@ -382,6 +389,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 +491,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 +648,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 +667,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() ) ); + } } } } diff --git a/src/HYDROGUI/HYDROGUI_LandCoverMapOp.h b/src/HYDROGUI/HYDROGUI_LandCoverMapOp.h index d5c7e640..b34d2f42 100644 --- a/src/HYDROGUI/HYDROGUI_LandCoverMapOp.h +++ b/src/HYDROGUI/HYDROGUI_LandCoverMapOp.h @@ -54,6 +54,7 @@ signals: protected slots: void onLandCoverMapChanged( const QString& theName ); + void onPolylineFaceChanged(); void onCreatePreview(); void onViewerSelectionChanged(); void onMousePress(SUIT_ViewWindow*, QMouseEvent*); @@ -72,6 +73,7 @@ private: Handle(HYDROData_LandCoverMap) myEditedObject; HYDROGUI_Shape* myPreviewPrs; + HYDROGUI_Shape* myPolylineFacePreviewPrs; QPoint myStartPnt, myEndPnt; }; diff --git a/src/HYDROGUI/HYDROGUI_Shape.cxx b/src/HYDROGUI/HYDROGUI_Shape.cxx index ba8a9d8f..5b73a7ad 100644 --- a/src/HYDROGUI/HYDROGUI_Shape.cxx +++ b/src/HYDROGUI/HYDROGUI_Shape.cxx @@ -424,10 +424,11 @@ void HYDROGUI_Shape::setFace( const TopoDS_Face& theFace, void HYDROGUI_Shape::setShape( const TopoDS_Shape& theShape, const bool theToDisplay, - const bool theIsUpdateViewer ) + const bool theIsUpdateViewer, + const int theDisplayMode ) { myTopoShape = theShape; - myDisplayMode = AIS_Shaded; + myDisplayMode = theDisplayMode; buildShape(); updateShape( theToDisplay, theIsUpdateViewer ); diff --git a/src/HYDROGUI/HYDROGUI_Shape.h b/src/HYDROGUI/HYDROGUI_Shape.h index 69531058..5447abb0 100644 --- a/src/HYDROGUI/HYDROGUI_Shape.h +++ b/src/HYDROGUI/HYDROGUI_Shape.h @@ -79,7 +79,8 @@ public: virtual void setShape( const TopoDS_Shape& theShape, const bool theToDisplay = true, - const bool theIsUpdateViewer = true ); + const bool theIsUpdateViewer = true, + const int theDisplayMode = AIS_Shaded ); virtual void setFillingColor( const QColor& theColor, const bool theToDisplay = true, -- 2.39.2