#include <LightApp_Application.h>
#include <OCCViewer_ViewModel.h>
#include <OCCViewer_ViewManager.h>
+#include <OCCViewer_ViewPort3d.h>
+#include <OCCViewer_ViewWindow.h>
#include <SUIT_Desktop.h>
#include <SUIT_MessageBox.h>
+#include <CurveCreator_Utils.hxx>
#include <gp_Pnt2d.hxx>
#include <BRepLib_MakeVertex.hxx>
#include <BRep_Builder.hxx>
+#include <BRepBuilderAPI_MakeVertex.hxx>
#include <TopoDS_Vertex.hxx>
#include <TopoDS_Compound.hxx>
#include <AIS_Shape.hxx>
+#include <QMouseEvent>
+
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()
delete myPreviewPrs;
myPreviewPrs = 0;
}
+
+ HYDROGUI_SplitPolylinesDlg* aPanel =
+ ::qobject_cast<HYDROGUI_SplitPolylinesDlg*>( 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<HYDROGUI_SplitPolylinesDlg*>( inputPanel() );
+
OCCViewer_ViewManager* aViewManager = getPreviewManager();
if ( aViewManager )
{
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();
}
+
+ 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<HYDROGUI_SplitPolylinesDlg*>( inputPanel() );
if( myPreviewPrs && aPanel )
{
BRep_Builder aBB;
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();
+}