X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FHYDROGUI%2FHYDROGUI_SplitPolylinesOp.cxx;h=439af525d241b750406b745d50a5047f23d6d000;hb=60c1b803621af637e863bf91a54f59251a28552c;hp=cae14c9ebb4b4e86bc1029c960a88501dea7478f;hpb=a0964e8c4caecf35f149dbc669714901c5fd2336;p=modules%2Fhydro.git diff --git a/src/HYDROGUI/HYDROGUI_SplitPolylinesOp.cxx b/src/HYDROGUI/HYDROGUI_SplitPolylinesOp.cxx index cae14c9e..439af525 100644 --- a/src/HYDROGUI/HYDROGUI_SplitPolylinesOp.cxx +++ b/src/HYDROGUI/HYDROGUI_SplitPolylinesOp.cxx @@ -26,24 +26,32 @@ #include #include #include +#include +#include #include #include +#include #include #include #include +#include #include #include #include +#include + HYDROGUI_SplitPolylinesOp::HYDROGUI_SplitPolylinesOp( HYDROGUI_Module* theModule ) : HYDROGUI_Operation( theModule ), - myPreviewPrs( 0 ) + myPreviewPrs( 0 ), + mySplitPointPreview( 0 ) { setName( tr( "SPLIT_POLYLINES" ) ); } HYDROGUI_SplitPolylinesOp::~HYDROGUI_SplitPolylinesOp() { + erasePreview(); } void HYDROGUI_SplitPolylinesOp::startOperation() @@ -136,10 +144,44 @@ void HYDROGUI_SplitPolylinesOp::erasePreview() delete myPreviewPrs; myPreviewPrs = 0; } + + HYDROGUI_SplitPolylinesDlg* aPanel = + ::qobject_cast( inputPanel() ); + if ( !aPanel ) + return; + + OCCViewer_ViewManager* aViewManager = getPreviewManager(); + if ( aViewManager ) + { + if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() ) + { + if ( mySplitPointPreview ) + { + Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext(); + if ( !aCtx.IsNull() ) + { + if ( aCtx->HasOpenedContext() ) + aCtx->CloseLocalContext(); + aCtx->Erase( mySplitPointPreview, Standard_False ); + } + mySplitPointPreview = 0; + } + + if ( aPanel->GetMode() == HYDROGUI_SplitPolylinesDlg::ByPoint ) + { + disconnect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), + this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); + connect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), + aViewer, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); + } + } + } } void HYDROGUI_SplitPolylinesOp::OnUpdatePreview() { + HYDROGUI_SplitPolylinesDlg* aPanel = ::qobject_cast( inputPanel() ); + OCCViewer_ViewManager* aViewManager = getPreviewManager(); if ( aViewManager ) { @@ -151,14 +193,42 @@ void HYDROGUI_SplitPolylinesOp::OnUpdatePreview() if( !myPreviewPrs ) { myPreviewPrs = new HYDROGUI_Shape( aCtx, NULL, getPreviewZLayer() ); - myPreviewPrs->setSelectionMode( AIS_Shape::SelectionMode( TopAbs_VERTEX ) ); + myPreviewPrs->setSelectionMode( AIS_Shape::SelectionMode( TopAbs_FACE ) ); + } + + if ( mySplitPointPreview ) + { + if ( aCtx->HasOpenedContext() ) + aCtx->CloseLocalContext(); + if ( aPanel->GetMode() == HYDROGUI_SplitPolylinesDlg::ByPoint ) + { + if ( !aCtx->IsDisplayed( mySplitPointPreview ) ) + aCtx->Display( mySplitPointPreview, Standard_False ); + } + else + aCtx->Erase( mySplitPointPreview, Standard_False ); } - aCtx->ClearSelected(); + + aCtx->ClearSelected(true); + } + + if ( aPanel->GetMode() == HYDROGUI_SplitPolylinesDlg::ByPoint ) + { + disconnect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), + aViewer, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); + connect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), + this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); + } + else + { + disconnect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), + this, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); + connect(aViewManager, SIGNAL(mousePress(SUIT_ViewWindow*, QMouseEvent*)), + aViewer, SLOT(onMousePress(SUIT_ViewWindow*, QMouseEvent*))); } } } - HYDROGUI_SplitPolylinesDlg* aPanel = ::qobject_cast( inputPanel() ); if( myPreviewPrs && aPanel ) { BRep_Builder aBB; @@ -201,3 +271,50 @@ void HYDROGUI_SplitPolylinesOp::OnUpdatePreview() myPreviewPrs->setShape( aCmp ); } } + +void HYDROGUI_SplitPolylinesOp::onMousePress(SUIT_ViewWindow* theWindow, QMouseEvent* theEvent) +{ + OCCViewer_ViewManager* aViewManager = getPreviewManager(); + if ( !aViewManager ) + return; + + OCCViewer_ViewWindow* aViewWindow = (OCCViewer_ViewWindow*)aViewManager->getActiveView(); + if ( !aViewWindow ) + return; + + OCCViewer_ViewPort3d* aViewPort = aViewWindow->getViewPort(); + if ( !aViewPort ) + return; + + Handle(V3d_View) aView = aViewPort->getView(); + if ( aView.IsNull() ) + return; + + OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer(); + if ( !aViewer ) + return; + + Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext(); + if ( aCtx.IsNull() ) + return; + + gp_Pnt aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(), aView ); + BRep_Builder aBuilder; + TopoDS_Compound aShape; + aBuilder.MakeCompound(aShape); + aBuilder.Add(aShape, BRepBuilderAPI_MakeVertex( aPnt ) ); + + if ( mySplitPointPreview ) + { + if ( aCtx->HasOpenedContext() ) + aCtx->CloseLocalContext(); + aCtx->Erase( mySplitPointPreview, Standard_False ); + } + + mySplitPointPreview = new AIS_Shape( aShape ); + if ( aCtx->HasOpenedContext() ) + aCtx->CloseLocalContext(); + aCtx->Display( mySplitPointPreview, Standard_False ); + + aCtx->UpdateCurrentViewer(); +}