Salome HOME
Merge branch 'BR_LAND_COVER_MAP' into BR_quadtree
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ChannelOp.cxx
index 38d16ae440520b49ededb060e2939842a09b3827..99bf0cb70ca9fff56f3364274e98c3657bd11c72 100644 (file)
@@ -1,12 +1,8 @@
-// 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
-//
+// Copyright (C) 2014-2015  EDF-R&D
 // 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.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 #include "HYDROGUI_ChannelOp.h"
 
 #include "HYDROGUI_DataModel.h"
+#include <HYDROGUI_DataObject.h>
 #include "HYDROGUI_ChannelDlg.h"
 #include "HYDROGUI_Module.h"
 #include "HYDROGUI_Shape.h"
 #include "HYDROGUI_Tool.h"
+#include "HYDROGUI_Tool2.h"
 #include "HYDROGUI_UpdateFlags.h"
 
 #include <HYDROData_Iterator.h>
@@ -45,7 +43,6 @@ HYDROGUI_ChannelOp::HYDROGUI_ChannelOp( HYDROGUI_Module* theModule,
                                        const bool theIsEdit )
 : HYDROGUI_Operation( theModule ),
   myIsEdit( theIsEdit ),
-  myViewManager( 0 ),
   myPreviewPrs( 0 )
 {
   setName( theIsEdit ? tr( "EDIT_CHANNEL" ) : tr( "CREATE_CHANNEL" ) );
@@ -60,41 +57,44 @@ void HYDROGUI_ChannelOp::startOperation()
 {
   HYDROGUI_Operation::startOperation();
 
-  // We start operation in the document
-  startDocOperation();
-
   HYDROGUI_ChannelDlg* aPanel = ::qobject_cast<HYDROGUI_ChannelDlg*>( inputPanel() );
 
   aPanel->blockSignals( true );
 
   aPanel->reset();
 
-  myEditedObject = getObjectToEdit();
+  if ( isApplyAndClose() )
+    myEditedObject.Nullify();
 
   QString aSelectedGuideLine, aSelectedProfile;
 
   QString anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_CHANNEL_NAME" ) );
-  if ( myIsEdit && !myEditedObject.IsNull() )
+  if ( myIsEdit )
   {
-    anObjectName = myEditedObject->GetName();
+    if ( isApplyAndClose() )
+      myEditedObject =
+        Handle(HYDROData_Channel)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
+    if ( !myEditedObject.IsNull() )
+    {
+      anObjectName = myEditedObject->GetName();
 
-    Handle(HYDROData_Polyline3D) aRefGuideLine = myEditedObject->GetGuideLine();
-    if ( !aRefGuideLine.IsNull() )
-      aSelectedGuideLine = aRefGuideLine->GetName();
+      Handle(HYDROData_Polyline3D) aRefGuideLine = myEditedObject->GetGuideLine();
+      if ( !aRefGuideLine.IsNull() )
+        aSelectedGuideLine = aRefGuideLine->GetName();
 
-    Handle(HYDROData_Profile) aRefProfile = myEditedObject->GetProfile();
-    if ( !aRefProfile.IsNull() )
-      aSelectedProfile = aRefProfile->GetName();
+      Handle(HYDROData_Profile) aRefProfile = myEditedObject->GetProfile();
+      if ( !aRefProfile.IsNull() )
+        aSelectedProfile = aRefProfile->GetName();
+    }
   }
 
   // collect information about existing 3d polylines
   QStringList aGuideLines;
-  QStringList anAllGuideLines = HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_POLYLINE );
-  foreach( QString aGuideLine, anAllGuideLines )
+  HYDROData_Iterator aPolylinesIt( doc(), KIND_POLYLINE );
+  for ( ; aPolylinesIt.More(); aPolylinesIt.Next() )
   {
-    Handle( HYDROData_Polyline3D ) aPolyline3d = 
-      Handle( HYDROData_Polyline3D )::DownCast( 
-    HYDROGUI_Tool::FindObjectByName( module(), aGuideLine, KIND_POLYLINE ) );
+    Handle(HYDROData_Polyline3D) aPolyline3d = 
+      Handle(HYDROData_Polyline3D)::DownCast( aPolylinesIt.Current() );
     if( !aPolyline3d.IsNull() )
     {
       TopoDS_Shape aShape = aPolyline3d->GetShape3D();
@@ -102,13 +102,13 @@ void HYDROGUI_ChannelOp::startOperation()
       {
         TopoDS_Wire aWire = TopoDS::Wire( aShape );
         if( !aWire.Closed() )
-          aGuideLines.append( aGuideLine );
+          aGuideLines.append( aPolyline3d->GetName() );
       }
     }
   }
 
   // collect information about existing profiles
-  QStringList aProfiles = HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_PROFILE );
+  QStringList aProfiles = HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_PROFILE, false );
 
   aPanel->setObjectName( anObjectName );
 
@@ -120,22 +120,18 @@ void HYDROGUI_ChannelOp::startOperation()
 
   aPanel->blockSignals( false );
 
-  onCreatePreview( true );
+  onCreatePreview();
 }
 
-
 void HYDROGUI_ChannelOp::abortOperation()
 {
   erasePreview();
-  abortDocOperation();
-
   HYDROGUI_Operation::abortOperation();
 }
 
 void HYDROGUI_ChannelOp::commitOperation()
 {
   erasePreview();
-
   HYDROGUI_Operation::commitOperation();
 }
 
@@ -147,7 +143,8 @@ HYDROGUI_InputPanel* HYDROGUI_ChannelOp::createInputPanel() const
 }
 
 bool HYDROGUI_ChannelOp::processApply( int& theUpdateFlags,
-                                       QString& theErrorMsg )
+                                       QString& theErrorMsg,
+                                       QStringList& theBrowseObjectsEntries )
 {
   HYDROGUI_ChannelDlg* aPanel = ::qobject_cast<HYDROGUI_ChannelDlg*>( inputPanel() );
   if ( !aPanel )
@@ -160,7 +157,7 @@ bool HYDROGUI_ChannelOp::processApply( int& theUpdateFlags,
     return false;
   }
 
-  if( !myIsEdit || ( !myEditedObject.IsNull() && myEditedObject->GetName() != anObjectName ) )
+  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 );
@@ -171,21 +168,61 @@ bool HYDROGUI_ChannelOp::processApply( int& theUpdateFlags,
     }
   }
 
+  
   if ( myEditedObject.IsNull() )
-    return false;
+    myEditedObject = createNewObject(); // Create new data model object
 
   myEditedObject->SetName( anObjectName );
 
   if ( !myIsEdit )
   {
-    myEditedObject->SetFillingColor( HYDROData_Channel::DefaultFillingColor() );
-    myEditedObject->SetBorderColor( HYDROData_Channel::DefaultBorderColor() );
+    myEditedObject->SetFillingColor( myEditedObject->DefaultFillingColor() );
+    myEditedObject->SetBorderColor( myEditedObject->DefaultBorderColor() );
+  }
+
+  QString aGuideLineName = aPanel->getGuideLineName();
+  QString aProfileName = aPanel->getProfileName();
+  /*if ( aGuideLineName.isEmpty() || aProfileName.isEmpty() )
+  {
+    myEditedObject->RemoveGuideLine();
+    myEditedObject->RemoveProfile();
+  }
+  else*/
+  {
+    Handle(HYDROData_Polyline3D) aGuideLine = Handle(HYDROData_Polyline3D)::DownCast(
+      HYDROGUI_Tool::FindObjectByName( module(), aGuideLineName, KIND_POLYLINE ) );
+    if ( aGuideLine.IsNull() )
+    {
+      theErrorMsg = tr( "GUIDE_LINE_IS_NOT_SELECTED" );
+      return false;
+    }
+
+    myEditedObject->RemoveGuideLine();
+    myEditedObject->SetGuideLine( aGuideLine );
+
+    Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast(
+      HYDROGUI_Tool::FindObjectByName( module(), aProfileName, KIND_PROFILE ) );
+    if ( aProfile.IsNull() )
+    {
+      theErrorMsg = tr( "PROFILE_IS_NOT_SELECTED" );
+      return false;
+    }
+
+    myEditedObject->RemoveProfile();
+    myEditedObject->SetProfile( aProfile );
   }
 
+  if ( myEditedObject->IsMustBeUpdated( HYDROData_Entity::Geom_2d ) )
+    myEditedObject->Update();
+
   erasePreview();
 
   if( !myIsEdit )
+  {
     module()->setObjectVisible( HYDROGUI_Tool::GetActiveOCCViewId( module() ), myEditedObject, true );
+    QString anEntry = HYDROGUI_DataObject::dataObjectEntry( myEditedObject );
+    theBrowseObjectsEntries.append( anEntry );
+  }
 
   module()->setIsToUpdate( myEditedObject );
 
@@ -194,67 +231,74 @@ bool HYDROGUI_ChannelOp::processApply( int& theUpdateFlags,
   return true;
 }
 
-Handle(HYDROData_Channel) HYDROGUI_ChannelOp::getObjectToEdit() const
+Handle(HYDROData_Channel) HYDROGUI_ChannelOp::createNewObject() const
 {
-  return myIsEdit ? Handle(HYDROData_Channel)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) ) :
-                    Handle(HYDROData_Channel)::DownCast( doc()->CreateObject( KIND_CHANNEL ) );
+  return Handle(HYDROData_Channel)::DownCast( doc()->CreateObject( KIND_CHANNEL ) );
 }
 
-void HYDROGUI_ChannelOp::onCreatePreview( const bool theIsInit )
+void HYDROGUI_ChannelOp::onCreatePreview()
 {
   HYDROGUI_ChannelDlg* aPanel = ::qobject_cast<HYDROGUI_ChannelDlg*>( inputPanel() );
-  if ( !aPanel || myEditedObject.IsNull() )
+  if ( !aPanel )
     return;
 
   QString aGuideLineName = aPanel->getGuideLineName();
   QString aProfileName = aPanel->getProfileName();
   if ( aGuideLineName.isEmpty() || aProfileName.isEmpty() )
   {
-    if ( !theIsInit )
-    {
-      myEditedObject->RemoveGuideLine();
-      myEditedObject->RemoveProfile();
-      myEditedObject->Update();
-    }
-
     erasePreview();
     return;
   }
 
-  // Update channel data
-  if ( !theIsInit )
+  LightApp_Application* anApp = module()->getApp();
+  
+  if ( !getPreviewManager() )
   {
-    Handle(HYDROData_Polyline3D) aGuideLine = Handle(HYDROData_Polyline3D)::DownCast(
-      HYDROGUI_Tool::FindObjectByName( module(), aGuideLineName, KIND_POLYLINE ) );
-    myEditedObject->SetGuideLine( aGuideLine );
-
-    Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast(
-      HYDROGUI_Tool::FindObjectByName( module(), aProfileName, KIND_PROFILE ) );
-    myEditedObject->SetProfile( aProfile );
-
-    if ( myEditedObject->IsMustBeUpdated() )
-      myEditedObject->Update();
+    setPreviewManager( ::qobject_cast<OCCViewer_ViewManager*>( 
+                       anApp->getViewManager( OCCViewer_Viewer::Type(), true ) ) );
   }
 
-  LightApp_Application* anApp = module()->getApp();
-  if ( !myViewManager )
-    myViewManager = ::qobject_cast<OCCViewer_ViewManager*>( 
-      anApp->getViewManager( OCCViewer_Viewer::Type(), true ) );
-
-  if ( myViewManager && !myPreviewPrs )
+  OCCViewer_ViewManager* aViewManager = getPreviewManager();
+  if ( aViewManager && !myPreviewPrs )
   {
-    if ( OCCViewer_Viewer* aViewer = myViewManager->getOCCViewer() )
+    if ( OCCViewer_Viewer* aViewer = aViewManager->getOCCViewer() )
     {
       Handle(AIS_InteractiveContext) aCtx = aViewer->getAISContext();
       if ( !aCtx.IsNull() )
-        myPreviewPrs = new HYDROGUI_Shape( aCtx, myEditedObject );
+      {
+        myPreviewPrs = new HYDROGUI_Shape( aCtx, NULL, getPreviewZLayer() );
+
+        QColor aFillingColor = Qt::blue;
+        QColor aBorderColor = Qt::transparent;
+        if ( !myEditedObject.IsNull() )
+        {
+          aFillingColor = myEditedObject->GetFillingColor();
+          aBorderColor = myEditedObject->GetBorderColor();
+        }
+
+        myPreviewPrs->setFillingColor( aFillingColor, false, false );
+        myPreviewPrs->setBorderColor( aBorderColor, false, false );
+      }
     }
   }
 
-  if ( !myViewManager || !myPreviewPrs )
+  if ( !aViewManager || !myPreviewPrs )
     return;
 
-  myPreviewPrs->update( true, true );
+  Handle(HYDROData_Polyline3D) aGuideLine = Handle(HYDROData_Polyline3D)::DownCast(
+    HYDROGUI_Tool::FindObjectByName( module(), aGuideLineName, KIND_POLYLINE ) );
+
+  Handle(HYDROData_Profile) aProfile = Handle(HYDROData_Profile)::DownCast(
+    HYDROGUI_Tool::FindObjectByName( module(), aProfileName, KIND_PROFILE ) );
+
+  HYDROData_Channel::PrsDefinition aPrsDef;
+  if ( !HYDROData_Channel::CreatePresentations( aGuideLine, aProfile, aPrsDef ) )
+  {
+    erasePreview();
+    return;
+  }
+
+  myPreviewPrs->setShape( aPrsDef.myPrs2D );
 }
 
 void HYDROGUI_ChannelOp::erasePreview()