Salome HOME
refs #426: grammatic error
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ImmersibleZoneOp.cxx
index 2059057f492970c48311140ab3c68ce7f1cc2222..b6c0fd02b4ab084efd0951c861606f00be946af1 100644 (file)
 #include "HYDROGUI_Shape.h"
 #include "HYDROGUI_Tool.h"
 #include "HYDROGUI_UpdateFlags.h"
+#include "HYDROGUI_DataObject.h"
 
 #include <HYDROData_Bathymetry.h>
 #include <HYDROData_Iterator.h>
-#include <HYDROData_Polyline.h>
+#include <HYDROData_PolylineXY.h>
 
 #include <OCCViewer_ViewManager.h>
 #include <OCCViewer_ViewModel.h>
 #include <LightApp_Application.h>
 #include <LightApp_UpdateFlags.h>
 
+#include <SUIT_MessageBox.h>
+#include <SUIT_Desktop.h>
+
 #include <TopoDS.hxx>
 #include <TopoDS_Wire.hxx>
 
+#include <QApplication>
+
 HYDROGUI_ImmersibleZoneOp::HYDROGUI_ImmersibleZoneOp( HYDROGUI_Module* theModule,
                                                       const bool theIsEdit )
 : HYDROGUI_Operation( theModule ),
   myIsEdit( theIsEdit ),
-  myViewManager( 0 ),
   myPreviewPrs( 0 )
 {
   setName( theIsEdit ? tr( "EDIT_IMMERSIBLE_ZONE" ) : tr( "CREATE_IMMERSIBLE_ZONE" ) );
@@ -71,8 +76,6 @@ void HYDROGUI_ImmersibleZoneOp::startOperation()
 
   QString anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_IMMERSIBLE_ZONE_NAME" ) );
 
-  QColor      aFillingColor( HYDROData_ImmersibleZone::DefaultFillingColor() );
-  QColor      aBorderColor( HYDROData_ImmersibleZone::DefaultBorderColor() );
   QString     aSelectedPolyline, aSelectedBathymetry;
   QStringList aSelectedBathymetries;
 
@@ -83,62 +86,19 @@ void HYDROGUI_ImmersibleZoneOp::startOperation()
     {
       anObjectName = myEditedObject->GetName();
 
-      aFillingColor = myEditedObject->GetFillingColor();
-      aBorderColor = myEditedObject->GetBorderColor();
-
-      Handle(HYDROData_Polyline) aRefPolyline = myEditedObject->GetPolyline();
+      Handle(HYDROData_PolylineXY) aRefPolyline = myEditedObject->GetPolyline();
       if ( !aRefPolyline.IsNull() )
         aSelectedPolyline = aRefPolyline->GetName();
 
-      Handle(HYDROData_Bathymetry) aRefBathymetry = myEditedObject->GetBathymetry();
-      if ( !aRefBathymetry.IsNull() )
-        aSelectedBathymetry = aRefBathymetry->GetName();
+      Handle(HYDROData_IAltitudeObject) aRefAltitude = myEditedObject->GetAltitudeObject();
+      if ( !aRefAltitude.IsNull() )
+        aSelectedBathymetry = aRefAltitude->GetName();
     }
   }
 
-  // collect information about existing closed polylines
-  QStringList aPolylines;
-
-  HYDROData_Iterator anIter( doc(), KIND_POLYLINE );
-  for ( ; anIter.More(); anIter.Next() )
-  {
-    Handle(HYDROData_Polyline) aPolylineObj = 
-      Handle(HYDROData_Polyline)::DownCast( anIter.Current() );
-    if ( aPolylineObj.IsNull() || !aPolylineObj->IsClosed() )
-      continue;
-
-    QString aPolylineName = aPolylineObj->GetName();
-    if ( aPolylineName.isEmpty() )
-      continue;
-
-    aPolylines.append( aPolylineName );
-  }
-
-  // collect information about existing bathymetries
-  QStringList aBathymetries;
-
-  anIter = HYDROData_Iterator( doc(), KIND_BATHYMETRY );
-  for ( ; anIter.More(); anIter.Next() )
-  {
-    Handle(HYDROData_Bathymetry) aBathymetryObj = 
-      Handle(HYDROData_Bathymetry)::DownCast( anIter.Current() );
-    if ( aBathymetryObj.IsNull() )
-      continue;
-
-    QString aBathymetryName = aBathymetryObj->GetName();
-    if ( aBathymetryName.isEmpty() )
-      continue;
-
-    aBathymetries.append( aBathymetryName );
-  }
-  
   aPanel->setObjectName( anObjectName );
-  
-  aPanel->setFillingColor( aFillingColor );
-  aPanel->setBorderColor( aBorderColor );
-
-  aPanel->setPolylineNames( aPolylines );
-  aPanel->setBathymetryNames( aBathymetries );
+  aPanel->setPolylineNames( HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_POLYLINEXY ) );
+  aPanel->setBathymetryNames( HYDROGUI_Tool::FindExistingObjectsNames( doc(), KIND_BATHYMETRY ) );
 
   aPanel->blockSignals( false );
 
@@ -169,7 +129,8 @@ HYDROGUI_InputPanel* HYDROGUI_ImmersibleZoneOp::createInputPanel() const
 }
 
 bool HYDROGUI_ImmersibleZoneOp::processApply( int& theUpdateFlags,
-                                              QString& theErrorMsg )
+                                              QString& theErrorMsg,
+                                              QStringList& theBrowseObjectsEntries )
 {
   HYDROGUI_ImmersibleZoneDlg* aPanel = ::qobject_cast<HYDROGUI_ImmersibleZoneDlg*>( inputPanel() );
   if ( !aPanel )
@@ -193,19 +154,14 @@ bool HYDROGUI_ImmersibleZoneOp::processApply( int& theUpdateFlags,
     }
   }
 
-  Handle(HYDROData_ImmersibleZone) aZoneObj = myIsEdit ? myEditedObject :
-    Handle(HYDROData_ImmersibleZone)::DownCast( doc()->CreateObject( KIND_IMMERSIBLE_ZONE ) );
-  if ( aZoneObj.IsNull() )
-    return false;
-
-  Handle(HYDROData_Polyline) aZonePolyline;
+  Handle(HYDROData_PolylineXY) aZonePolyline;
   Handle(HYDROData_Bathymetry) aZoneBathymetry;
 
   QString aPolylineName = aPanel->getPolylineName();
   if ( !aPolylineName.isEmpty() )
   {
-    aZonePolyline = Handle(HYDROData_Polyline)::DownCast(
-      HYDROGUI_Tool::FindObjectByName( module(), aPolylineName, KIND_POLYLINE ) );
+    aZonePolyline = Handle(HYDROData_PolylineXY)::DownCast(
+      HYDROGUI_Tool::FindObjectByName( module(), aPolylineName, KIND_POLYLINEXY ) );
   }
 
   QString aBathymetryName = aPanel->getBathymetryName();
@@ -215,20 +171,40 @@ bool HYDROGUI_ImmersibleZoneOp::processApply( int& theUpdateFlags,
       HYDROGUI_Tool::FindObjectByName( module(), aBathymetryName, KIND_BATHYMETRY ) );
   }
 
+
+  if ( HYDROData_ImmersibleZone::generateTopShape( aZonePolyline ).IsNull() )
+  {
+    theErrorMsg = tr( "ZONE_OBJECT_CANNOT_BE_CREATED" );
+    return false;
+  }
+
+  Handle(HYDROData_ImmersibleZone) aZoneObj = myIsEdit ? myEditedObject :
+    Handle(HYDROData_ImmersibleZone)::DownCast( doc()->CreateObject( KIND_IMMERSIBLE_ZONE ) );
+
   aZoneObj->SetName( anObjectName );
 
-  aZoneObj->SetFillingColor( aPanel->getFillingColor() );
-  aZoneObj->SetBorderColor( aPanel->getBorderColor() );
+  if ( !myIsEdit )
+  {
+    aZoneObj->SetFillingColor( HYDROData_ImmersibleZone::DefaultFillingColor() );
+    aZoneObj->SetBorderColor( HYDROData_ImmersibleZone::DefaultBorderColor() );
+  }
 
   aZoneObj->SetPolyline( aZonePolyline );
-  aZoneObj->SetBathymetry( aZoneBathymetry );
+  aZoneObj->SetAltitudeObject( aZoneBathymetry );
+  aZoneObj->Update();
 
   closePreview();
 
   if( !myIsEdit )
+  {
     module()->setObjectVisible( HYDROGUI_Tool::GetActiveOCCViewId( module() ), aZoneObj, true );
+    QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aZoneObj );
+    theBrowseObjectsEntries.append( anEntry );
+  }
+
+  module()->setIsToUpdate( aZoneObj );
 
-  theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced;
+  theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced | UF_VTKViewer;
 
   return true;
 }
@@ -239,36 +215,51 @@ void HYDROGUI_ImmersibleZoneOp::onCreatePreview( const QString& thePolylineName
   if ( !aPanel )
     return;
 
-  TopoDS_Wire aWire;
+  QApplication::setOverrideCursor( Qt::WaitCursor );
+  TopoDS_Shape aZoneShape;
 
-  Handle(HYDROData_Polyline) aPolyline = Handle(HYDROData_Polyline)::DownCast(
-    HYDROGUI_Tool::FindObjectByName( module(), thePolylineName, KIND_POLYLINE ) );
+  Handle(HYDROData_PolylineXY) aPolyline = Handle(HYDROData_PolylineXY)::DownCast(
+    HYDROGUI_Tool::FindObjectByName( module(), thePolylineName, KIND_POLYLINEXY ) );
   if ( !aPolyline.IsNull() )
   {
-    aWire = TopoDS::Wire( aPolyline->GetTopShape() );
+    aZoneShape = HYDROData_ImmersibleZone::generateTopShape( aPolyline );
+    if( aZoneShape.IsNull() )
+      printErrorMessage( tr( "ZONE_OBJECT_CANNOT_BE_CREATED" ) );
   }
 
   LightApp_Application* anApp = module()->getApp();
-  if ( !myViewManager )
-    myViewManager = ::qobject_cast<OCCViewer_ViewManager*>( 
-      anApp->getViewManager( OCCViewer_Viewer::Type(), true ) );
-
-  if ( myViewManager && !myPreviewPrs )
+  if ( !getPreviewManager() )
+    setPreviewManager( ::qobject_cast<OCCViewer_ViewManager*>( 
+                       anApp->getViewManager( OCCViewer_Viewer::Type(), true ) ) );
+  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, NULL );
+        myPreviewPrs = new HYDROGUI_Shape( aCtx, NULL, getPreviewZLayer() );
     }
   }
 
-  if ( !myViewManager || !myPreviewPrs )
-    return;
+  if ( aViewManager && myPreviewPrs )
+  {
+    QColor aFillingColor = HYDROData_ImmersibleZone::DefaultFillingColor();
+    QColor aBorderColor = HYDROData_ImmersibleZone::DefaultBorderColor();
+    if ( !myEditedObject.IsNull() ) {
+      aFillingColor = myEditedObject->GetFillingColor();
+      aBorderColor = myEditedObject->GetBorderColor();
+    }
+
+    myPreviewPrs->setFillingColor( aFillingColor, false, false );
+    myPreviewPrs->setBorderColor( aBorderColor, false, false );
+    TopoDS_Face aFace;
+    if( !aZoneShape.IsNull() )
+      aFace = TopoDS::Face( aZoneShape );
+    myPreviewPrs->setFace( aFace );
+  }
 
-  myPreviewPrs->setFillingColor( aPanel->getFillingColor(), false, false );
-  myPreviewPrs->setBorderColor( aPanel->getBorderColor(), false, false );
-  myPreviewPrs->setFace( aWire );
+  QApplication::restoreOverrideCursor();
 }
 
 void HYDROGUI_ImmersibleZoneOp::closePreview()