]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
Creat\Edit stream operation.
authoradv <adv@opencascade.com>
Mon, 2 Dec 2013 10:56:38 +0000 (10:56 +0000)
committeradv <adv@opencascade.com>
Mon, 2 Dec 2013 10:56:38 +0000 (10:56 +0000)
12 files changed:
src/HYDROData/HYDROData_Stream.cxx
src/HYDROGUI/CMakeLists.txt
src/HYDROGUI/HYDROGUI_Module.cxx
src/HYDROGUI/HYDROGUI_Operation.cxx
src/HYDROGUI/HYDROGUI_Operations.cxx
src/HYDROGUI/HYDROGUI_Operations.h
src/HYDROGUI/HYDROGUI_Shape.cxx
src/HYDROGUI/HYDROGUI_StreamDlg.cxx [new file with mode: 0644]
src/HYDROGUI/HYDROGUI_StreamDlg.h [new file with mode: 0644]
src/HYDROGUI/HYDROGUI_StreamOp.cxx [new file with mode: 0755]
src/HYDROGUI/HYDROGUI_StreamOp.h [new file with mode: 0755]
src/HYDROGUI/resources/HYDROGUI_msg_en.ts

index 2b5d29ea8d4bb09c46c83f32a4fc1a6529160676..0512e90a24474f6bc725a619338f792daac1ab70 100644 (file)
@@ -121,6 +121,9 @@ void HYDROData_Stream::Update()
     {
       a2dShellBuilder.Add( a2dShell, aMakeFace.Face() );
     }
+
+    aPrevFirstPoint = aCurFirstPoint;
+    aPrevLastPoint = aCurLastPoint;
   }
 
   SetTopShape( a2dShell );
@@ -132,9 +135,16 @@ void HYDROData_Stream::Update()
 bool HYDROData_Stream::SetHydraulicAxis( const Handle(HYDROData_PolylineXY)& theAxis )
 {
   Handle(HYDROData_PolylineXY) aPrevAxis = GetHydraulicAxis();
-  if ( theAxis.IsNull() || IsEqual( aPrevAxis, theAxis ) )
+
+  if ( theAxis.IsNull() )
+  {
+    RemoveHydraulicAxis();
+    return !aPrevAxis.IsNull();
+  }
+
+  if ( IsEqual( aPrevAxis, theAxis ) )
     return false;
-  
+
   TopoDS_Wire aHydraulicWire = TopoDS::Wire( theAxis->GetShape() );
   if ( aHydraulicWire.IsNull() )
     return false; // The polyline must be a single wire
@@ -243,6 +253,7 @@ void HYDROData_Stream::insertProfileInToOrder( const Handle(HYDROData_Profile)&
     return;
 
   // TODO
+  AddReferenceObject( theProfile, DataTag_Profile ); // temporary for testing only
 }
 
 void HYDROData_Stream::updateProfilesOrder()
index 52b10504aefb02002860e9cc878f267b18e19051..9d953b672922f04d26f23d74bc9b2ce1c624eb6e 100644 (file)
@@ -49,6 +49,8 @@ set(PROJECT_HEADERS
     HYDROGUI_RemoveImageRefsOp.h
     HYDROGUI_Shape.h
     HYDROGUI_ShowHideOp.h
+    HYDROGUI_StreamDlg.h
+    HYDROGUI_StreamOp.h
     HYDROGUI_Tool.h
     HYDROGUI_TwoImagesDlg.h
     HYDROGUI_TwoImagesOp.h
@@ -122,6 +124,8 @@ set(PROJECT_SOURCES
     HYDROGUI_RemoveImageRefsOp.cxx
     HYDROGUI_Shape.cxx
     HYDROGUI_ShowHideOp.cxx
+    HYDROGUI_StreamDlg.cxx
+    HYDROGUI_StreamOp.cxx
     HYDROGUI_Tool.cxx
     HYDROGUI_TwoImagesDlg.cxx
     HYDROGUI_TwoImagesOp.cxx
index 616b4a9accb794a6e181f9dfa8d2362550c9a024..604ed597512ab270758189fc867e779fdf846210 100644 (file)
@@ -240,6 +240,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
   bool anIsRegion = false;
   bool anIsZone = false;
   bool anIsObstacle = false;
+  bool anIsStream = false;
   bool anIsGeomObject = false;
 
   // check the selected GEOM objects
@@ -262,7 +263,8 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
       anIsVisibleInSelection |= aVisibility;
       anIsHiddenInSelection |= !aVisibility;
 
-      if( anObject->GetKind() == KIND_IMAGE )
+      ObjectKind anObjectKind = anObject->GetKind();
+      if( anObjectKind == KIND_IMAGE )
       {
         anIsImage = true;
         Handle(HYDROData_Image) anImage = Handle(HYDROData_Image)::DownCast( anObject );
@@ -289,11 +291,12 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
           }
         }
       }
-      else if( anObject->GetKind() == KIND_POLYLINEXY )
+      else if( anObjectKind == KIND_POLYLINEXY )
         anIsPolyline = true;
-      else if( anObject->GetKind() == KIND_POLYLINE )
+      else if( anObjectKind == KIND_POLYLINE )
         anIsPolyline3D = true;
-      else if( anObject->GetKind() == KIND_PROFILE ) {
+      else if( anObjectKind == KIND_PROFILE )
+      {
         anIsProfile = true;
         aNbOfSelectedProfiles++;
 
@@ -303,20 +306,22 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
           anIsValidProfile = true;
         }
       }
-      else if( anObject->GetKind() == KIND_CALCULATION )
+      else if( anObjectKind == KIND_CALCULATION )
         anIsCalculation = true;
-      else if( anObject->GetKind() == KIND_IMMERSIBLE_ZONE )
+      else if( anObjectKind == KIND_IMMERSIBLE_ZONE )
         anIsImmersibleZone = true;
-      else if( anObject->GetKind() == KIND_VISUAL_STATE )
+      else if( anObjectKind == KIND_VISUAL_STATE )
         anIsVisualState = true;
-      else if( anObject->GetKind() == KIND_REGION )
+      else if( anObjectKind == KIND_REGION )
         anIsRegion = true;
-      else if( anObject->GetKind() == KIND_ZONE )
+      else if( anObjectKind == KIND_ZONE )
         anIsZone = true;
-      else if( anObject->GetKind() == KIND_BATHYMETRY )
+      else if( anObjectKind == KIND_BATHYMETRY )
         anIsBathymetry = true;
-      else if( anObject->GetKind() == KIND_OBSTACLE )
+      else if( anObjectKind == KIND_OBSTACLE )
         anIsObstacle = true;
+      else if( anObjectKind == KIND_STREAM )
+        anIsStream = true;
     }
 
     anIsGeomObject = HYDROData_Tool::IsGeometryObject( anObject );
@@ -436,6 +441,11 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
         theMenu->addAction( action( EditImmersibleZoneId ) );
         theMenu->addSeparator();
       }
+      else if( anIsStream )
+      {
+        theMenu->addAction( action( EditStreamId ) );
+        theMenu->addSeparator();
+      }
       else if( anIsVisualState && anIsObjectBrowser )
       {
         theMenu->addAction( action( SaveVisualStateId ) );
@@ -458,7 +468,7 @@ void HYDROGUI_Module::contextMenuPopup( const QString& theClient,
     theMenu->addSeparator();
 
     if( anIsImage || anIsPolyline || anIsPolyline3D || anIsImmersibleZone || anIsZone || 
-        anIsRegion || anIsBathymetry || anIsObstacle || anIsValidProfile )
+        anIsRegion || anIsBathymetry || anIsObstacle || anIsStream || anIsValidProfile )
     {
       if( anIsHiddenInSelection )
         theMenu->addAction( action( ShowId ) );
index 52fbcd1739a140a21570c64536dbfa19d6a2e97e..1f308ea385607a04eaca1ef28e51ddbceb4d92a0 100644 (file)
@@ -143,19 +143,22 @@ void HYDROGUI_Operation::processCancel()
 void HYDROGUI_Operation::startDocOperation()
 {
   // Open transaction in the model document
-  doc()->StartOperation();
+  if ( !doc()->IsOperation() )
+    doc()->StartOperation();
 }
 
 void HYDROGUI_Operation::abortDocOperation()
 {
   // Abort transaction in the model document
-  doc()->AbortOperation();
+  if ( doc()->IsOperation() )
+    doc()->AbortOperation();
 }
 
 void HYDROGUI_Operation::commitDocOperation()
 {
   // Commit transaction in the model document
-  doc()->CommitOperation( HYDROGUI_Tool::ToExtString( getName() ) );
+  if ( doc()->IsOperation() )
+    doc()->CommitOperation( HYDROGUI_Tool::ToExtString( getName() ) );
 }
 
 Handle_HYDROData_Document HYDROGUI_Operation::doc() const
index 233cddba4fe986dcef15016fe8defc5bd674d7cd..6e1bc51ca7a06c39aad7d5c114953e0bd794f183 100644 (file)
@@ -37,7 +37,7 @@
 #include "HYDROGUI_ProfileOp.h"
 #include "HYDROGUI_RemoveImageRefsOp.h"
 #include "HYDROGUI_ShowHideOp.h"
-#include "HYDROData_SplitToZonesTool.h"
+#include "HYDROGUI_StreamOp.h"
 #include "HYDROGUI_TwoImagesOp.h"
 #include "HYDROGUI_UpdateFlags.h"
 #include "HYDROGUI_UpdateImageOp.h"
@@ -50,8 +50,9 @@
 #include "HYDROGUI_GeoreferencementOp.h"
 #include "HYDROGUI_SetColorOp.h"
 
-#include "HYDROData_Document.h"
-#include "HYDROData_Obstacle.h"
+#include <HYDROData_Document.h>
+#include <HYDROData_Obstacle.h>
+#include <HYDROData_SplitToZonesTool.h>
 
 #include <GeometryGUI.h>
 #include <GeometryGUI_Operations.h>
@@ -122,6 +123,9 @@ void HYDROGUI_Module::createActions()
   createAction( CreateImmersibleZoneId, "CREATE_IMMERSIBLE_ZONE" );
   createAction( EditImmersibleZoneId, "EDIT_IMMERSIBLE_ZONE" );
 
+  createAction( CreateStreamId, "CREATE_STREAM" );
+  createAction( EditStreamId, "EDIT_STREAM" );
+
   createAction( ImportObstacleFromFileId, "IMPORT_OBSTACLE_FROM_FILE" );
   createAction( ImportGeomObjectId, "IMPORT_GEOM_OBJECT" );
   createAction( CreateBoxId, "CREATE_BOX" );
@@ -179,6 +183,7 @@ void HYDROGUI_Module::createMenus()
   createMenu( AllGeoreferencementId, aNewProfileId, -1, -1 );
 
   createMenu( CreateImmersibleZoneId, aHydroId, -1, -1 );
+  createMenu( CreateStreamId, aHydroId, -1, -1 );
 
   int aNewObstacleId = createMenu( tr( "MEN_OBSTACLE" ), aHydroId, -1 );
   createMenu( ImportObstacleFromFileId, aNewObstacleId, -1, -1 );
@@ -365,6 +370,10 @@ LightApp_Operation* HYDROGUI_Module::createOperation( const int theId ) const
   case EditImmersibleZoneId:
     anOp = new HYDROGUI_ImmersibleZoneOp( aModule, theId == EditImmersibleZoneId );
     break;
+  case CreateStreamId:
+  case EditStreamId:
+    anOp = new HYDROGUI_StreamOp( aModule, theId == EditStreamId );
+    break;
   case CreateCalculationId:
   case EditCalculationId:
     anOp = new HYDROGUI_CalculationOp( aModule, theId == EditCalculationId );
index 6a488f2731e4da886bc656c6b5b1b3ffa4625b20..534d56caa108b9e7d172e44c346fa66c1eaa73a0 100644 (file)
@@ -61,6 +61,9 @@ enum OperationId
   CreateImmersibleZoneId,
   EditImmersibleZoneId,
 
+  CreateStreamId,
+  EditStreamId,
+
   CreateCalculationId,
   EditCalculationId,
   ExportCalculationId,
index 9e36f73d2307986c0eb7ae74eb90949fe407f5b1..86f12ef42fa205f20c7e654b269a7d057a423e85 100644 (file)
 #include <HYDROData_Document.h>
 #include <HYDROData_Image.h>
 #include <HYDROData_ImmersibleZone.h>
+#include <HYDROData_Obstacle.h>
 #include <HYDROData_PolylineXY.h>
+#include <HYDROData_Profile.h>
 #include <HYDROData_Region.h>
+#include <HYDROData_Stream.h>
 #include <HYDROData_Zone.h>
-#include <HYDROData_Obstacle.h>
-#include <HYDROData_Profile.h>
 
 #include <TopoDS.hxx>
 #include <TopoDS_Wire.hxx>
@@ -169,25 +170,6 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer )
 
       TopoDS_Face aZoneFace = TopoDS::Face( aZone->GetShape() );
 
-      // Generate the filling color for zone
-      QStringList aGeomObjectsNames;
-
-      HYDROData_SequenceOfObjects aRefObjects = aZone->GetGeometryObjects();
-      HYDROData_SequenceOfObjects::Iterator anIter( aRefObjects );
-      for ( ; anIter.More(); anIter.Next() )
-      {
-        Handle(HYDROData_Object) aRefbject = 
-          Handle(HYDROData_Object)::DownCast( anIter.Value() );
-        if ( aRefbject.IsNull() )
-          continue;
-
-        QString aRefObjectName = aRefbject->GetName();
-        if ( aRefObjectName.isEmpty() )
-          continue;
-
-        aGeomObjectsNames.append( aRefObjectName );
-      }
-       
       setFace( aZoneFace, false, false );
       if (aZone->IsMergingNeed() && aZone->GetMergeType() == HYDROData_Zone::Merge_UNKNOWN )
       {
@@ -196,6 +178,25 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer )
       }
       else
       {
+        // Generate the filling color for zone
+        QStringList aGeomObjectsNames;
+
+        HYDROData_SequenceOfObjects aRefObjects = aZone->GetGeometryObjects();
+        HYDROData_SequenceOfObjects::Iterator anIter( aRefObjects );
+        for ( ; anIter.More(); anIter.Next() )
+        {
+          Handle(HYDROData_Object) aRefbject = 
+            Handle(HYDROData_Object)::DownCast( anIter.Value() );
+          if ( aRefbject.IsNull() )
+            continue;
+
+          QString aRefObjectName = aRefbject->GetName();
+          if ( aRefObjectName.isEmpty() )
+            continue;
+
+          aGeomObjectsNames.append( aRefObjectName );
+        }
+
         setFillingColor( HYDROGUI_Tool::GenerateFillingColor( aDocument, aGeomObjectsNames ) );
       }
     }
@@ -304,6 +305,15 @@ void HYDROGUI_Shape::update( const bool theIsUpdateViewer )
 
       setWire( aProfileWire, false, false );  
     }
+    else if ( myObject->IsKind( STANDARD_TYPE(HYDROData_Stream) ) )
+    {
+      Handle(HYDROData_Stream) aStream =
+        Handle(HYDROData_Stream)::DownCast( myObject );
+
+      TopoDS_Shell aStreamShape = TopoDS::Shell( aStream->GetTopShape() );
+
+      setShape( aStreamShape, false, false );
+    }
   }
  
   if ( myShape.IsNull() || !isVisible() )
diff --git a/src/HYDROGUI/HYDROGUI_StreamDlg.cxx b/src/HYDROGUI/HYDROGUI_StreamDlg.cxx
new file mode 100644 (file)
index 0000000..b2aa1e1
--- /dev/null
@@ -0,0 +1,177 @@
+// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "HYDROGUI_StreamDlg.h"
+
+#include "HYDROGUI_Tool.h"
+
+#include <QComboBox>
+#include <QGroupBox>
+#include <QLabel>
+#include <QLayout>
+#include <QLineEdit>
+#include <QListWidget>
+
+HYDROGUI_StreamDlg::HYDROGUI_StreamDlg( HYDROGUI_Module* theModule, const QString& theTitle )
+: HYDROGUI_InputPanel( theModule, theTitle )
+{
+  // Stream name
+  myObjectNameGroup = new QGroupBox( tr( "STREAM_NAME" ), mainFrame() );
+
+  myObjectName = new QLineEdit( myObjectNameGroup );
+
+  QBoxLayout* aNameLayout = new QHBoxLayout( myObjectNameGroup );
+  aNameLayout->setMargin( 5 );
+  aNameLayout->setSpacing( 5 );
+  aNameLayout->addWidget( new QLabel( tr( "NAME" ), myObjectNameGroup ) );
+  aNameLayout->addWidget( myObjectName );
+
+  // Stream parameters
+  QGroupBox* aParamGroup = new QGroupBox( tr( "STREAM_PARAMETERS" ), mainFrame() );
+
+  myAxises = new QComboBox( aParamGroup );
+  myAxises->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) );
+
+  myProfiles = new QListWidget( aParamGroup );
+  myProfiles->setSelectionMode( QListWidget::SingleSelection );
+  myProfiles->setEditTriggers( QListWidget::NoEditTriggers );
+  myProfiles->setViewMode( QListWidget::ListMode );
+  myProfiles->setSortingEnabled( false );
+  QGridLayout* aParamLayout = new QGridLayout( aParamGroup );
+  aParamLayout->setMargin( 5 );
+  aParamLayout->setSpacing( 5 );
+  aParamLayout->addWidget( new QLabel( tr( "STREAM_HYDRAULIC_AXIS" ), aParamGroup ), 0, 0 );
+  aParamLayout->addWidget( myAxises, 0, 1 );
+  aParamLayout->addWidget( myProfiles, 1, 0, 1, 2 );
+
+  // Common
+  addWidget( myObjectNameGroup );
+  addWidget( aParamGroup );
+
+  addStretch();
+
+  // Connect signals and slots
+  connect( myAxises, SIGNAL( currentIndexChanged( int ) ), this, SLOT( onStreamDefChanged() ) );
+}
+
+HYDROGUI_StreamDlg::~HYDROGUI_StreamDlg()
+{
+}
+
+void HYDROGUI_StreamDlg::reset()
+{
+  bool isBlocked = blockSignals( true );
+
+  myObjectName->clear();
+
+  myAxises->clear();
+  myProfiles->clear();
+
+  blockSignals( isBlocked );
+
+  onStreamDefChanged();
+}
+
+void HYDROGUI_StreamDlg::setObjectName( const QString& theName )
+{
+  myObjectName->setText( theName );
+}
+
+QString HYDROGUI_StreamDlg::getObjectName() const
+{
+  return myObjectName->text();
+}
+
+void HYDROGUI_StreamDlg::setAxisNames( const QStringList& theAxises )
+{
+  bool isBlocked = blockSignals( true );
+
+  myAxises->clear();
+  myAxises->addItems( theAxises );
+
+  blockSignals( isBlocked );
+}
+
+void HYDROGUI_StreamDlg::setAxisName( const QString& theName )
+{
+  int aNewIdx = myAxises->findText( theName );
+  if ( aNewIdx != myAxises->currentIndex() )
+  {
+    myAxises->setCurrentIndex( aNewIdx );
+  }
+  else
+  {
+    onStreamDefChanged();
+  }
+}
+
+QString HYDROGUI_StreamDlg::getAxisName() const
+{
+  return myAxises->currentText();
+}
+
+void HYDROGUI_StreamDlg::setSelectedProfiles( const QStringList& theProfiles )
+{
+  bool isBlocked = blockSignals( true );
+
+  myProfiles->setUpdatesEnabled( false );
+  
+  myProfiles->clear();
+  for ( int i = 0, n = theProfiles.length(); i < n; ++i )
+  {
+    const QString& aProfileName = theProfiles.at( i );
+    QListWidgetItem* aListItem = new QListWidgetItem( aProfileName, myProfiles );
+    aListItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
+  }
+
+  myProfiles->setUpdatesEnabled( true );
+
+  blockSignals( isBlocked );
+
+  onStreamDefChanged();
+}
+
+QStringList HYDROGUI_StreamDlg::getSelectedProfiles() const
+{
+  QStringList aProfiles;
+
+  for ( int i = 0, n = myProfiles->count(); i < n; ++i )
+  {
+    QListWidgetItem* aListItem = myProfiles->item( i );
+    if ( !aListItem )
+      continue;
+
+    QString aProfileName = aListItem->text();
+    aProfiles << aProfileName;
+  }
+
+  return aProfiles;
+}
+
+void HYDROGUI_StreamDlg::onStreamDefChanged()
+{
+  if ( signalsBlocked() )
+    return;
+
+  emit CreatePreview();
+}
diff --git a/src/HYDROGUI/HYDROGUI_StreamDlg.h b/src/HYDROGUI/HYDROGUI_StreamDlg.h
new file mode 100644 (file)
index 0000000..425f869
--- /dev/null
@@ -0,0 +1,68 @@
+// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef HYDROGUI_StreamDlg_H
+#define HYDROGUI_StreamDlg_H
+
+#include "HYDROGUI_InputPanel.h"
+
+class QComboBox;
+class QGroupBox;
+class QLineEdit;
+class QListWidget;
+
+class HYDROGUI_StreamDlg : public HYDROGUI_InputPanel
+{
+  Q_OBJECT
+
+public:
+  HYDROGUI_StreamDlg( HYDROGUI_Module* theModule, const QString& theTitle );
+  virtual ~HYDROGUI_StreamDlg();
+
+  void                       reset();
+
+  void                       setObjectName( const QString& theName );
+  QString                    getObjectName() const;
+
+  void                       setAxisNames( const QStringList& theAxises );
+  void                       setAxisName( const QString& thePolyline );
+  QString                    getAxisName() const;
+
+  void                       setSelectedProfiles( const QStringList& theProfiles );
+  QStringList                getSelectedProfiles() const;
+
+signals:
+  void                       CreatePreview();
+
+private slots:
+  void                       onStreamDefChanged();
+
+private:
+
+  QGroupBox*                 myObjectNameGroup;
+  QLineEdit*                 myObjectName;
+
+  QComboBox*                 myAxises;
+  QListWidget*               myProfiles;
+};
+
+#endif
diff --git a/src/HYDROGUI/HYDROGUI_StreamOp.cxx b/src/HYDROGUI/HYDROGUI_StreamOp.cxx
new file mode 100755 (executable)
index 0000000..30cad0e
--- /dev/null
@@ -0,0 +1,247 @@
+// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#include "HYDROGUI_StreamOp.h"
+
+#include "HYDROGUI_Module.h"
+#include "HYDROGUI_Shape.h"
+#include "HYDROGUI_StreamDlg.h"
+#include "HYDROGUI_Tool.h"
+#include "HYDROGUI_UpdateFlags.h"
+
+#include <HYDROData_Document.h>
+#include <HYDROData_PolylineXY.h>
+#include <HYDROData_Profile.h>
+
+#include <LightApp_Application.h>
+#include <LightApp_SelectionMgr.h>
+#include <LightApp_UpdateFlags.h>
+
+#include <OCCViewer_ViewManager.h>
+#include <OCCViewer_ViewModel.h>
+#include <OCCViewer_ViewWindow.h>
+
+HYDROGUI_StreamOp::HYDROGUI_StreamOp( HYDROGUI_Module* theModule, bool theIsEdit )
+: HYDROGUI_Operation( theModule ), 
+  myIsEdit( theIsEdit ),
+  myViewManager( NULL ),
+  myPreviewPrs( NULL )
+{
+  setName( theIsEdit ? tr( "EDIT_STREAM" ) : tr( "CREATE_STREAM" ) );
+}
+
+HYDROGUI_StreamOp::~HYDROGUI_StreamOp()
+{
+  erasePreview();
+}
+
+void HYDROGUI_StreamOp::startOperation()
+{
+  HYDROGUI_Operation::startOperation();
+
+  // We start operation in the document
+  startDocOperation();
+
+  HYDROGUI_StreamDlg* aPanel = (HYDROGUI_StreamDlg*)inputPanel();
+
+  aPanel->blockSignals( true );
+
+  aPanel->reset();
+
+  if( myIsEdit )
+    myEditedObject = Handle(HYDROData_Stream)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
+  else 
+    myEditedObject = Handle(HYDROData_Stream)::DownCast( doc()->CreateObject( KIND_STREAM ) );
+
+  QString aSelectedAxis;
+  QStringList aSelectedProfiles;
+
+  QString anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_STREAM_NAME" ) );
+  if ( myIsEdit && !myEditedObject.IsNull() )
+  {
+    anObjectName = myEditedObject->GetName();
+
+    Handle(HYDROData_PolylineXY) aHydraulicAxis = myEditedObject->GetHydraulicAxis();
+    if ( !aHydraulicAxis.IsNull() )
+      aSelectedAxis = aHydraulicAxis->GetName();
+
+    HYDROData_SequenceOfObjects aProfiles = myEditedObject->GetProfiles();
+    for ( int i = 1, n = aProfiles.Length(); i <= n; ++i )
+    {
+      Handle(HYDROData_Profile) aProfile = 
+        Handle(HYDROData_Profile)::DownCast( aProfiles.Value( i ) );
+      if ( aProfile.IsNull() )
+        continue;
+
+      QString aProfileName = aProfile->GetName();
+      aSelectedProfiles << aProfileName;
+    }
+  }
+
+  QStringList anAxises = HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_POLYLINEXY );
+
+  // Temporary, to be removed
+  if ( aSelectedProfiles.isEmpty() )
+  {
+    aSelectedProfiles = HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_PROFILE );
+  }
+
+  aPanel->setObjectName( anObjectName );
+  aPanel->setAxisNames( anAxises );
+  aPanel->setAxisName( aSelectedAxis );
+  aPanel->setSelectedProfiles( aSelectedProfiles );
+
+  aPanel->blockSignals( false );
+
+  onCreatePreview();
+}
+
+void HYDROGUI_StreamOp::abortOperation()
+{
+  erasePreview();
+  abortDocOperation();
+
+  HYDROGUI_Operation::abortOperation();
+}
+
+void HYDROGUI_StreamOp::commitOperation()
+{
+  erasePreview();
+
+  HYDROGUI_Operation::commitOperation();
+}
+
+HYDROGUI_InputPanel* HYDROGUI_StreamOp::createInputPanel() const
+{
+  HYDROGUI_StreamDlg* aPanel = new HYDROGUI_StreamDlg( module(), getName() );
+  connect( aPanel, SIGNAL( CreatePreview() ), this,   SLOT( onCreatePreview() ) );
+  return aPanel;
+}
+
+bool HYDROGUI_StreamOp::processApply( int& theUpdateFlags,
+                                      QString& theErrorMsg )
+{
+  HYDROGUI_StreamDlg* aPanel = ::qobject_cast<HYDROGUI_StreamDlg*>( inputPanel() );
+  if ( !aPanel )
+    return false;
+
+  QString anObjectName = aPanel->getObjectName().simplified();
+  if ( anObjectName.isEmpty() )
+  {
+    theErrorMsg = tr( "INCORRECT_OBJECT_NAME" );
+    return false;
+  }
+
+  if( !myIsEdit || ( !myEditedObject.IsNull() && myEditedObject->GetName() != anObjectName ) )
+  {
+    // check that there are no other objects with the same name in the document
+    Handle(HYDROData_Entity) anObject = HYDROGUI_Tool::FindObjectByName( module(), anObjectName );
+    if( !anObject.IsNull() )
+    {
+      theErrorMsg = tr( "OBJECT_EXISTS_IN_DOCUMENT" ).arg( anObjectName );
+      return false;
+    }
+  }
+
+  if ( myEditedObject.IsNull() )
+    return false;
+
+  myEditedObject->SetName( anObjectName );
+
+  erasePreview();
+
+  if( !myIsEdit )
+    module()->setObjectVisible( HYDROGUI_Tool::GetActiveOCCViewId( module() ), myEditedObject, true );
+
+  theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced;
+
+  return true;
+}
+
+void HYDROGUI_StreamOp::onCreatePreview()
+{
+  HYDROGUI_StreamDlg* aPanel = ::qobject_cast<HYDROGUI_StreamDlg*>( inputPanel() );
+  if ( !aPanel )
+    return;
+
+  QString anAxisName = aPanel->getAxisName();
+  QStringList aProfiles = aPanel->getSelectedProfiles();
+  if ( anAxisName.isEmpty() || aProfiles.isEmpty() )
+  {
+    erasePreview();
+    return;
+  }
+
+  if ( myEditedObject.IsNull() )
+    return;
+
+  // At first we remove all references from stream
+  myEditedObject->RemoveProfiles();
+
+  Handle(HYDROData_PolylineXY) anAxis = Handle(HYDROData_PolylineXY)::DownCast(
+    HYDROGUI_Tool::FindObjectByName( module(), anAxisName, KIND_POLYLINEXY ) );
+  myEditedObject->SetHydraulicAxis( anAxis );
+
+  HYDROData_SequenceOfObjects aProfileObjects =
+    HYDROGUI_Tool::FindObjectsByNames( module(), aProfiles, KIND_PROFILE );
+  for ( int i = 1, n = aProfileObjects.Length(); i <= n; ++i )
+  {
+    Handle(HYDROData_Profile) aProfile = 
+      Handle(HYDROData_Profile)::DownCast( aProfileObjects.Value( i ) );
+    if ( aProfile.IsNull() )
+      continue;
+
+    myEditedObject->AddProfile( aProfile );
+  }
+  
+  myEditedObject->Update();
+
+
+  LightApp_Application* anApp = module()->getApp();
+  if ( !myViewManager )
+    myViewManager = ::qobject_cast<OCCViewer_ViewManager*>( 
+      anApp->getViewManager( OCCViewer_Viewer::Type(), true ) );
+
+  if ( myViewManager && !myPreviewPrs )
+  {
+    if ( OCCViewer_Viewer* aViewer = myViewManager->getOCCViewer() )
+    {
+      Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
+      if ( !aCtx.IsNull() )
+        myPreviewPrs = new HYDROGUI_Shape( aCtx, myEditedObject );
+    }
+  }
+
+  if ( !myViewManager || !myPreviewPrs )
+    return;
+
+  myPreviewPrs->update();
+}
+
+void HYDROGUI_StreamOp::erasePreview()
+{
+  if( myPreviewPrs )
+  {
+    delete myPreviewPrs;
+    myPreviewPrs = 0;
+  }
+}
diff --git a/src/HYDROGUI/HYDROGUI_StreamOp.h b/src/HYDROGUI/HYDROGUI_StreamOp.h
new file mode 100755 (executable)
index 0000000..05ccea5
--- /dev/null
@@ -0,0 +1,66 @@
+// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+//
+// Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
+// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+//
+// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+
+#ifndef HYDROGUI_StreamOp_H
+#define HYDROGUI_StreamOp_H
+
+#include "HYDROGUI_Operation.h"
+
+#include <HYDROData_Stream.h>
+
+class OCCViewer_ViewManager;
+class HYDROGUI_Shape;
+
+class HYDROGUI_StreamOp : public HYDROGUI_Operation
+{
+  Q_OBJECT
+
+public:
+  HYDROGUI_StreamOp( HYDROGUI_Module* theModule, bool isEdit );
+  virtual ~HYDROGUI_StreamOp();
+
+protected:
+
+  virtual void                 startOperation();
+  virtual void                 abortOperation();
+  virtual void                 commitOperation();
+
+  virtual HYDROGUI_InputPanel* createInputPanel() const;
+
+  virtual bool                 processApply( int& theUpdateFlags, QString& theErrorMsg );
+
+private slots:
+  void                         onCreatePreview();
+
+private:
+  void                         erasePreview();
+
+private:
+  OCCViewer_ViewManager*       myViewManager;
+
+  bool                         myIsEdit;
+  Handle(HYDROData_Stream)     myEditedObject;
+
+  HYDROGUI_Shape*              myPreviewPrs;
+};
+
+#endif
index 84d57407127870d0d59b49545dfdc44332754c43..4b13e041be928bdfee475d5f847c9750a8c3c03f 100644 (file)
@@ -504,6 +504,14 @@ file cannot be correctly imported for a Bathymetry definition.</translation>
       <source>DSK_EDIT_IMMERSIBLE_ZONE</source>
       <translation>Edit immersible zone</translation> 
     </message>
+    <message>
+      <source>DSK_CREATE_STREAM</source>
+      <translation>Create stream</translation>
+    </message>
+    <message>
+      <source>DSK_EDIT_STREAM</source>
+      <translation>Edit stream</translation>
+    </message>
     <message>
       <source>DSK_COPY</source>
       <translation>Copy</translation>
@@ -676,6 +684,14 @@ file cannot be correctly imported for a Bathymetry definition.</translation>
       <source>MEN_EDIT_IMMERSIBLE_ZONE</source>
       <translation>Edit immersible zone</translation>
     </message>
+    <message>
+      <source>MEN_CREATE_STREAM</source>
+      <translation>Create stream</translation>
+    </message>
+    <message>
+      <source>MEN_EDIT_STREAM</source>
+      <translation>Edit stream</translation>
+    </message>
     <message>
       <source>MEN_CUT_IMAGES</source>
       <translation>Cut images</translation>
@@ -856,6 +872,14 @@ file cannot be correctly imported for a Bathymetry definition.</translation>
       <source>STB_EDIT_IMMERSIBLE_ZONE</source>
       <translation>Edit immersible zone</translation>
     </message>
+    <message>
+      <source>STB_CREATE_STREAM</source>
+      <translation>Create stream</translation>
+    </message>
+    <message>
+      <source>STB_EDIT_STREAM</source>
+      <translation>Edit stream</translation>
+    </message>
     <message>
       <source>STB_COPY</source>
       <translation>Copy</translation>
@@ -1465,4 +1489,40 @@ file cannot be correctly imported for an Obstacle definition.</translation>
     </message>
   </context>
 
+  <context>
+    <name>HYDROGUI_StreamDlg</name>
+    <message>
+      <source>NAME</source>
+      <translation>Name</translation>
+    </message>
+    <message>
+      <source>STREAM_NAME</source>
+      <translation>Stream name</translation>
+    </message>
+    <message>
+      <source>STREAM_PARAMETERS</source>
+      <translation>Parameters</translation>
+    </message>
+    <message>
+      <source>STREAM_HYDRAULIC_AXIS</source>
+      <translation>Hydraulic axis</translation>
+    </message>
+  </context>
+
+  <context>
+    <name>HYDROGUI_StreamOp</name>
+    <message>
+      <source>CREATE_STREAM</source>
+      <translation>Create stream</translation>
+    </message>
+    <message>
+      <source>EDIT_STREAM</source>
+      <translation>Edit stream</translation>
+    </message>
+    <message>
+      <source>DEFAULT_STREAM_NAME</source>
+      <translation>Stream</translation>
+    </message>
+  </context>
+
 </TS>