]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
refs #732: create preview of split point.
authormkr <mkr@opencascade.com>
Mon, 23 Nov 2015 17:56:02 +0000 (20:56 +0300)
committermkr <mkr@opencascade.com>
Mon, 23 Nov 2015 17:56:02 +0000 (20:56 +0300)
src/HYDROGUI/HYDROGUI_SplitPolylinesOp.cxx
src/HYDROGUI/HYDROGUI_SplitPolylinesOp.h

index cae14c9ebb4b4e86bc1029c960a88501dea7478f..be1c18e38652cdabea107bd1eb44d8bb6a83a40b 100644 (file)
 #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()
@@ -136,10 +144,44 @@ void HYDROGUI_SplitPolylinesOp::erasePreview()
     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 )
   {
@@ -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();
       }
+
+      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;
@@ -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();
+}
index 8de00f8bca602803522518e082dddc9c58f05d53..c81a69ab44a5df848e35149313ed8daa6b763478 100644 (file)
 
 #include "HYDROGUI_Operation.h"
 
+class SUIT_ViewWindow;
+
+class AIS_Shape;
+
+class QMouseEvent;
+
 class HYDROGUI_SplitPolylinesOp : public HYDROGUI_Operation
 {
   Q_OBJECT
@@ -44,9 +50,11 @@ protected:
 protected slots:
   void OnUpdatePreview();
   void erasePreview();
+  void onMousePress(SUIT_ViewWindow*, QMouseEvent*);
 
 private:
   HYDROGUI_Shape* myPreviewPrs;
+  AIS_Shape*      mySplitPointPreview;
 };
 
 #endif