]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
refs #585: preview in split operation
authorasl <asl@opencascade.com>
Fri, 19 Jun 2015 08:15:24 +0000 (11:15 +0300)
committerasl <asl@opencascade.com>
Fri, 19 Jun 2015 08:15:24 +0000 (11:15 +0300)
src/HYDROGUI/HYDROGUI_ObjComboBox.cxx
src/HYDROGUI/HYDROGUI_ObjListBox.cxx
src/HYDROGUI/HYDROGUI_ObjListBox.h
src/HYDROGUI/HYDROGUI_SplitPolylinesDlg.cxx
src/HYDROGUI/HYDROGUI_SplitPolylinesDlg.h
src/HYDROGUI/HYDROGUI_SplitPolylinesOp.cxx
src/HYDROGUI/HYDROGUI_SplitPolylinesOp.h

index 18639114738a43049abf688f2b9f27d3da1808ee..13c88f0555db8f0c8f7a453f594fefefa3571c44 100644 (file)
@@ -122,7 +122,10 @@ QStringList HYDROGUI_ObjComboBox::objectNames( HYDROData_SequenceOfObjects& theO
     for ( HYDROData_Iterator it( HYDROData_Document::Document( module()->getStudyId() ), objectType() ); it.More(); it.Next() )
     {
         if ( !objectFilter() || objectFilter()->isOk( it.Current() ) )
+        {
+          theObjects.Append( it.Current() );
             aNames.append( it.Current()->GetName() );
+        }
     }
     return aNames;
 }
index f20715a645dc821e748bbf359ea14fe14f745ccb..f63b7fdfe86716f33689b04064d5177e6b9ab413 100644 (file)
@@ -94,6 +94,7 @@ void HYDROGUI_ObjListBox::reset()
 {
   myList->clear();
   mySelection.Clear();
+  emit selectionChanged();
 }
 
 void HYDROGUI_ObjListBox::setSelectedObjects( const HYDROData_SequenceOfObjects& theObjects )
@@ -115,6 +116,7 @@ HYDROData_SequenceOfObjects HYDROGUI_ObjListBox::selectedObjects() const
 void HYDROGUI_ObjListBox::OnInclude()
 {
   Append( HYDROGUI_Tool::GetSelectedObjects( module() ) );
+  emit selectionChanged();
 }
 
 void HYDROGUI_ObjListBox::OnExclude()
@@ -126,6 +128,7 @@ void HYDROGUI_ObjListBox::OnExclude()
     myList->takeItem( anIndex );
     mySelection.Remove( anIndex, anIndex );
   }
+  emit selectionChanged();
 }
 
 void HYDROGUI_ObjListBox::Append( const HYDROData_SequenceOfObjects& theObjects )
index 7d599dd3a5de0270a0dc04a8c15487cffd84e89b..ddb4da286c31b46f4097f3cc2c73b5b485720214 100644 (file)
@@ -51,6 +51,9 @@ public:
 private:
   void Init(const QString& theTitle);
 
+signals:
+  void selectionChanged();
+
 private slots:
   void OnInclude();
   void OnExclude();
index ddc0a44dcb29074d486dbe4f440e9af7b7c04241..6fe879871c1bc44a0548f47977d5d4f5f6ebbd59 100644 (file)
 #include <HYDROGUI_ObjComboBox.h>
 #include <HYDROGUI_ObjListBox.h>
 #include <HYDROGUI_Tool.h>
+#include <OCCViewer_ViewManager.h>
+#include <OCCViewer_ViewWindow.h>
+#include <OCCViewer_ViewPort3d.h>
+#include <CurveCreator_Utils.hxx>
+#include <SUIT_ViewWindow.h>
 #include <QtxDoubleSpinBox.h>
 #include <QFrame>
 #include <QLabel>
 #include <QGridLayout>
 #include <QTabWidget>
+#include <QMouseEvent>
 #include <gp_Pnt2d.hxx>
 
+const double MIN_COORD = -1000000;
+const double MAX_COORD =  1000000;
+const double STEP      =  10;
+
 HYDROGUI_SplitPolylinesDlg::HYDROGUI_SplitPolylinesDlg( HYDROGUI_Module* theModule, const QString& theTitle )
-: HYDROGUI_InputPanel( theModule, theTitle )
+: HYDROGUI_InputPanel( theModule, theTitle ), myOCCViewer( 0 )
 {
   QFrame* aFrame = new QFrame( mainFrame() );
   addWidget( aFrame, 1 );
@@ -43,7 +53,11 @@ HYDROGUI_SplitPolylinesDlg::HYDROGUI_SplitPolylinesDlg( HYDROGUI_Module* theModu
   QFrame* aPointPage = new QFrame();
   myMainPolyline1 = new HYDROGUI_ObjComboBox( theModule, tr( "POLYLINE" ), KIND_POLYLINEXY, aPointPage );
   myX = new QtxDoubleSpinBox( aPointPage );
+  myX->setRange( MIN_COORD, MAX_COORD );
+  myX->setSingleStep( STEP );
   myY = new QtxDoubleSpinBox( aPointPage );
+  myY->setRange( MIN_COORD, MAX_COORD );
+  myY->setSingleStep( STEP );
   
   QGridLayout* aPointPageLayout = new QGridLayout( aPointPage );
   aPointPageLayout->addWidget( myMainPolyline1, 0, 0, 1, 3 );
@@ -70,6 +84,14 @@ HYDROGUI_SplitPolylinesDlg::HYDROGUI_SplitPolylinesDlg( HYDROGUI_Module* theModu
   QGridLayout* aSplitPageLayout = new QGridLayout( aSplitPage );
   aSplitPageLayout->addWidget( myPolylines, 0, 0 );
   myTab->addTab( aSplitPage, tr( "COMPLETE_SPLIT" ) );
+
+  connect( myX, SIGNAL( valueChanged( double ) ), this, SIGNAL( pointMoved() ) );
+  connect( myY, SIGNAL( valueChanged( double ) ), this, SIGNAL( pointMoved() ) );
+  connect( myTab, SIGNAL( currentChanged( int ) ), this, SIGNAL( modeChanged() ) );
+  connect( myMainPolyline1, SIGNAL( objectSelected( const QString& ) ), this, SIGNAL( selectionChanged() ) );
+  connect( myMainPolyline2, SIGNAL( objectSelected( const QString& ) ), this, SIGNAL( selectionChanged() ) );
+  connect( myToolPolyline, SIGNAL( objectSelected( const QString& ) ), this, SIGNAL( selectionChanged() ) );
+  connect( myPolylines, SIGNAL( selectionChanged() ), this, SIGNAL( selectionChanged() ) );
 }
 
 HYDROGUI_SplitPolylinesDlg::~HYDROGUI_SplitPolylinesDlg()
@@ -117,6 +139,10 @@ HYDROData_SequenceOfObjects HYDROGUI_SplitPolylinesDlg::GetPolylines() const
 
 void HYDROGUI_SplitPolylinesDlg::setPolylinesFromSelection()
 {
+  myMainPolyline1->reset();
+  myMainPolyline2->reset();
+  myPolylines->reset();
+
   Handle( HYDROData_Entity ) anObject = HYDROGUI_Tool::GetSelectedObject( module() );
   if( anObject.IsNull() || anObject->GetKind() != KIND_POLYLINEXY )
     return;
@@ -126,3 +152,32 @@ void HYDROGUI_SplitPolylinesDlg::setPolylinesFromSelection()
   myMainPolyline2->setObjectName( aName );
   myPolylines->setObjectsFromSelection();
 }
+
+void HYDROGUI_SplitPolylinesDlg::setOCCViewer( OCCViewer_Viewer* theViewer )
+{
+  if( !theViewer )
+    return;
+  
+  myOCCViewer = theViewer;
+  OCCViewer_ViewManager* aViewManager = dynamic_cast<OCCViewer_ViewManager*>( myOCCViewer->getViewManager() );
+  disconnect( aViewManager, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
+              this, SLOT( onMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
+  connect( aViewManager, SIGNAL( mousePress( SUIT_ViewWindow*, QMouseEvent* ) ),
+           this, SLOT( onMousePress( SUIT_ViewWindow*, QMouseEvent* ) ) );
+}
+
+void HYDROGUI_SplitPolylinesDlg::onMousePress( SUIT_ViewWindow* theWindow, QMouseEvent* theEvent )
+{
+  gp_Pnt aPnt = CurveCreator_Utils::ConvertClickToPoint( theEvent->x(), theEvent->y(), getViewPort()->getView() );
+  myX->setValue( aPnt.X() );
+  myY->setValue( aPnt.Y() );
+}
+
+OCCViewer_ViewPort3d* HYDROGUI_SplitPolylinesDlg::getViewPort() const
+{
+  OCCViewer_ViewPort3d* aViewPort = 0;
+  if ( myOCCViewer )
+    aViewPort = dynamic_cast<OCCViewer_ViewWindow*>( myOCCViewer->getViewManager()->getActiveView() )->getViewPort();
+    
+  return aViewPort;
+}
index 0d09934e257550d0a9067db2a977e7516568565e..c550472a7d3a99482a2572930d56745bf45fb681 100644 (file)
@@ -27,6 +27,9 @@ class QtxDoubleSpinBox;
 class HYDROGUI_ObjComboBox;
 class HYDROGUI_ObjListBox;
 class gp_Pnt2d;
+class OCCViewer_Viewer;
+class SUIT_ViewWindow;
+class OCCViewer_ViewPort3d;
 
 class HYDROGUI_SplitPolylinesDlg : public HYDROGUI_InputPanel
 {
@@ -46,6 +49,18 @@ public:
   HYDROData_SequenceOfObjects GetPolylines() const;
 
   void setPolylinesFromSelection();
+  void setOCCViewer( OCCViewer_Viewer* theViewer );
+
+signals:
+  void modeChanged();
+  void pointMoved();
+  void selectionChanged();
+
+private slots:
+  void onMousePress( SUIT_ViewWindow*, QMouseEvent* );
+
+private:
+  OCCViewer_ViewPort3d* getViewPort() const;
 
 private:
   QTabWidget* myTab;
@@ -55,6 +70,7 @@ private:
   HYDROGUI_ObjComboBox* myMainPolyline2;
   HYDROGUI_ObjComboBox* myToolPolyline;
   HYDROGUI_ObjListBox*  myPolylines;
+  OCCViewer_Viewer*     myOCCViewer;
 };
 
 #endif
index 07a49d3be89aa597e0c1500eb9fab1be1d126220..afb40918ae12b7abb5dd77a85f50c5cd1a569e74 100644 (file)
 
 #include <HYDROGUI_SplitPolylinesOp.h>
 #include <HYDROGUI_SplitPolylinesDlg.h>
+#include <HYDROGUI_Module.h>
 #include <HYDROGUI_UpdateFlags.h>
+#include <HYDROGUI_Shape.h>
 #include <HYDROData_PolylineOperator.h>
+#include <LightApp_Application.h>
+#include <OCCViewer_ViewModel.h>
+#include <OCCViewer_ViewManager.h>
 #include <gp_Pnt2d.hxx>
+#include <BRepLib_MakeVertex.hxx>
+#include <BRep_Builder.hxx>
+#include <TopoDS_Vertex.hxx>
+#include <TopoDS_Compound.hxx>
 
 HYDROGUI_SplitPolylinesOp::HYDROGUI_SplitPolylinesOp( HYDROGUI_Module* theModule )
-: HYDROGUI_Operation( theModule )
+: HYDROGUI_Operation( theModule ),
+  myPreviewPrs( 0 )
 {
   setName( tr( "SPLIT_POLYLINES" ) );
 }
@@ -42,12 +52,22 @@ void HYDROGUI_SplitPolylinesOp::startOperation()
     return;
 
   aPanel->setPolylinesFromSelection();
+  LightApp_Application* anApp = module()->getApp();
+  OCCViewer_ViewManager* aViewManager =
+    dynamic_cast<OCCViewer_ViewManager*>( anApp->getViewManager( OCCViewer_Viewer::Type(), true ) );
+  aPanel->setOCCViewer( aViewManager ? aViewManager->getOCCViewer() : 0 );
+  setPreviewManager( aViewManager );
 
+  OnUpdatePreview();
 }
 
 HYDROGUI_InputPanel* HYDROGUI_SplitPolylinesOp::createInputPanel() const
 {
-  return new HYDROGUI_SplitPolylinesDlg( module(), getName() );
+  HYDROGUI_SplitPolylinesDlg* aDlg = new HYDROGUI_SplitPolylinesDlg( module(), getName() );
+  connect( aDlg, SIGNAL( pointMoved() ), this, SLOT( OnUpdatePreview() ) );
+  connect( aDlg, SIGNAL( modeChanged() ), this, SLOT( OnUpdatePreview() ) );
+  connect( aDlg, SIGNAL( selectionChanged() ), this, SLOT( OnUpdatePreview() ) );
+  return aDlg;
 }
 
 bool HYDROGUI_SplitPolylinesOp::processApply( int& theUpdateFlags,
@@ -80,3 +100,82 @@ bool HYDROGUI_SplitPolylinesOp::processApply( int& theUpdateFlags,
   theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced | UF_VTKViewer;
   return true;
 }
+
+void HYDROGUI_SplitPolylinesOp::abortOperation()
+{
+  erasePreview();
+  HYDROGUI_Operation::abortOperation();
+}
+
+void HYDROGUI_SplitPolylinesOp::commitOperation()
+{
+  erasePreview();
+  HYDROGUI_Operation::commitOperation();
+}
+
+void HYDROGUI_SplitPolylinesOp::erasePreview()
+{
+  if( myPreviewPrs )
+  {
+    delete myPreviewPrs;
+    myPreviewPrs = 0;
+  }
+}
+
+void HYDROGUI_SplitPolylinesOp::OnUpdatePreview()
+{
+  OCCViewer_ViewManager* aViewManager = getPreviewManager();
+  if ( aViewManager )
+  {
+    if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() )
+    {
+      Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
+      if ( !aCtx.IsNull() )
+      {
+        if( !myPreviewPrs )
+          myPreviewPrs = new HYDROGUI_Shape( aCtx, NULL, getPreviewZLayer() );
+        aCtx->ClearSelected();
+      }
+    }
+  }
+
+  HYDROGUI_SplitPolylinesDlg* aPanel = ::qobject_cast<HYDROGUI_SplitPolylinesDlg*>( inputPanel() );
+  if( myPreviewPrs && aPanel )
+  {
+    BRep_Builder aBB;
+    TopoDS_Compound aCmp;
+    aBB.MakeCompound( aCmp );
+
+    switch( aPanel->GetMode() )
+    {
+    case HYDROGUI_SplitPolylinesDlg::ByPoint:
+      {
+        gp_Pnt2d aPnt = aPanel->GetPoint();
+        TopoDS_Vertex aVertex = BRepLib_MakeVertex( gp_Pnt( aPnt.X(), aPnt.Y(), 0.0 ) );
+        aBB.Add( aCmp, aPanel->GetMainPolyline()->GetShape() );
+        aBB.Add( aCmp, aVertex );
+        break;
+      }
+    case HYDROGUI_SplitPolylinesDlg::ByTool:
+      {
+        aBB.Add( aCmp, aPanel->GetMainPolyline()->GetShape() );
+        aBB.Add( aCmp, aPanel->GetToolPolyline()->GetShape() );
+        break;
+      }
+    case HYDROGUI_SplitPolylinesDlg::Split:
+      {
+        HYDROData_SequenceOfObjects aPolylines = aPanel->GetPolylines();
+        for( int i=aPolylines.Lower(), n=aPolylines.Upper(); i<=n; i++ )
+        {
+          Handle( HYDROData_PolylineXY ) aPolyline = Handle( HYDROData_PolylineXY )::DownCast( aPolylines.Value( i ) );
+          if( !aPolyline.IsNull() )
+            aBB.Add( aCmp, aPolyline->GetShape() );
+        }
+        break;
+      }
+    }
+
+
+    myPreviewPrs->setShape( aCmp );
+  }
+}
index e2454a54307810ba6560e53a305fd1eb2d95e63f..8de00f8bca602803522518e082dddc9c58f05d53 100644 (file)
@@ -31,11 +31,22 @@ public:
 
 protected:
   virtual void startOperation();
+  virtual void abortOperation();
+  virtual void commitOperation();
 
   virtual HYDROGUI_InputPanel* createInputPanel() const;
 
   virtual bool processApply( int& theUpdateFlags, QString& theErrorMsg,
                              QStringList& theBrowseObjectsEntries );
+
+  virtual HYDROGUI_Shape*      getPreviewShape() const { return myPreviewPrs; };
+
+protected slots:
+  void OnUpdatePreview();
+  void erasePreview();
+
+private:
+  HYDROGUI_Shape* myPreviewPrs;
 };
 
 #endif