Salome HOME
refs #550: fix crash when myObject is NULL
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ImportBathymetryOp.cxx
index d902c7d397bd0317de7103334d3f7852741bb9ec..fb8e663a1bf1d02ec1cdaf8eb85a6b3ad94adc63 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
@@ -23,6 +19,7 @@
 #include "HYDROGUI_ImportBathymetryOp.h"
 
 #include "HYDROGUI_DataModel.h"
+#include "HYDROGUI_DataObject.h"
 #include "HYDROGUI_ImportBathymetryDlg.h"
 #include "HYDROGUI_Module.h"
 #include "HYDROGUI_Tool.h"
 
 #include <LightApp_Application.h>
 #include <LightApp_UpdateFlags.h>
+#include <SUIT_ViewManager.h>
+#include <SVTK_ViewModel.h>
 
 #include <QFileInfo>
 
-HYDROGUI_ImportBathymetryOp::HYDROGUI_ImportBathymetryOp( HYDROGUI_Module* theModule )
-: HYDROGUI_Operation( theModule )
+HYDROGUI_ImportBathymetryOp::HYDROGUI_ImportBathymetryOp( HYDROGUI_Module* theModule, 
+                                                         const bool theIsEdit  )
+: HYDROGUI_Operation( theModule ),
+  myIsEdit( theIsEdit )
 {
-  setName( tr( "IMPORT_BATHYMETRY" ) );
+  setName( theIsEdit ? tr( "EDIT_IMPORTED_BATHYMETRY" ) : tr( "IMPORT_BATHYMETRY" ) );
 }
 
 HYDROGUI_ImportBathymetryOp::~HYDROGUI_ImportBathymetryOp()
@@ -55,6 +56,22 @@ void HYDROGUI_ImportBathymetryOp::startOperation()
     return;
 
   aPanel->reset();
+
+  if( myIsEdit )
+  {
+    if ( isApplyAndClose() )
+      myEditedObject = Handle(HYDROData_Bathymetry)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
+    if( !myEditedObject.IsNull() )
+    {
+      QString aName = myEditedObject->GetName();
+      QString aFileName = HYDROGUI_Tool::ToQString( myEditedObject->GetFilePath() );
+      bool anIsAltitudesInverted = myEditedObject->IsAltitudesInverted();
+
+      aPanel->setObjectName( aName );
+      aPanel->setFileName( aFileName );
+      aPanel->setInvertAltitudes( anIsAltitudesInverted );
+    }
+  }
 }
 
 void HYDROGUI_ImportBathymetryOp::abortOperation()
@@ -77,7 +94,8 @@ HYDROGUI_InputPanel* HYDROGUI_ImportBathymetryOp::createInputPanel() const
 }
 
 bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags,
-                                                QString& theErrorMsg )
+                                                QString& theErrorMsg,
+                                                QStringList& theBrowseObjectsEntries )
 {
   HYDROGUI_ImportBathymetryDlg* aPanel = 
     ::qobject_cast<HYDROGUI_ImportBathymetryDlg*>( inputPanel() );
@@ -92,6 +110,8 @@ bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags,
   }
 
   QString aFileName = aPanel->getFileName().simplified();
+  bool anIsInvertAltitudes = aPanel->isInvertAltitudes();
+
   if ( aFileName.isEmpty() )
   {
     theErrorMsg = tr( "INCORRECT_FILE_NAME" );
@@ -105,28 +125,86 @@ bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags,
     return false;
   }
 
-  // check that there are no other objects with the same name in the document
-  Handle(HYDROData_Object) anObject = HYDROGUI_Tool::FindObjectByName( module(), anObjectName );
-  if ( !anObject.IsNull() )
+  if( !myIsEdit || ( !myEditedObject.IsNull() && myEditedObject->GetName() != anObjectName ) )
   {
-    theErrorMsg = tr( "OBJECT_EXISTS_IN_DOCUMENT" ).arg( anObjectName );
-    return false;
+    // 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;
+    }
   }
 
-  Handle(HYDROData_Bathymetry) aBathymetryObj = 
-    Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) );
+  Handle(HYDROData_Bathymetry) aBathymetryObj;
+  if ( myIsEdit )
+  {
+    aBathymetryObj = myEditedObject;
+  }
+  else
+  {
+    aBathymetryObj = 
+      Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) );
+  }
   if ( aBathymetryObj.IsNull() )
     return false;
 
-  if ( !aBathymetryObj->ImportFromFile( aFileName ) )
+  QString anOldFileName = HYDROGUI_Tool::ToQString( aBathymetryObj->GetFilePath() );
+  if ( aFileName != anOldFileName )
   {
-    theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileName );
-    return false;
+    aBathymetryObj->SetAltitudesInverted( anIsInvertAltitudes, false );
+    if ( !aBathymetryObj->ImportFromFile( HYDROGUI_Tool::ToAsciiString( aFileName ) ) )
+    {
+      theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileName );
+      return false;
+    }
+  }
+  else if ( anIsInvertAltitudes != aBathymetryObj->IsAltitudesInverted() )
+  {
+    aBathymetryObj->SetAltitudesInverted( anIsInvertAltitudes );
   }
 
   aBathymetryObj->SetName( anObjectName );
 
-  theUpdateFlags = UF_Model;
+  aBathymetryObj->Update();
+
+  // Activate VTK viewer and show the bathymetry
+  SUIT_ViewManager* aVTKMgr = 0;
+  SUIT_ViewManager* aViewMgr = module()->getApp()->activeViewManager();
+  // Try to get a VTK viewer as an active or existing one
+  if ( aViewMgr )
+  {
+    if ( aViewMgr->getType() == SVTK_Viewer::Type() )
+    {
+      aVTKMgr = aViewMgr;
+    }
+    else
+    {
+      aVTKMgr = module()->getApp()->viewManager( SVTK_Viewer::Type() );
+    }
+  }
+
+  /*
+  // If there is no VTK viewer yet then create a new one
+  if ( !aVTKMgr )
+  {
+    aVTKMgr = module()->getApp()->createViewManager( SVTK_Viewer::Type() );
+  }
+  // Set the bathymetry visible in the VTK viewer
+  if ( aVTKMgr )
+  {
+    module()->setObjectVisible( (size_t)aVTKMgr->getViewModel(), aBathymetryObj, true );
+  }*/
+
+  theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced |
+                              UF_VTKViewer | UF_VTK_Forced;
+
+  if( !myIsEdit )
+  {
+    QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aBathymetryObj );
+    theBrowseObjectsEntries.append( anEntry );
+  }
+
   return true;
 }
 
@@ -138,9 +216,16 @@ void HYDROGUI_ImportBathymetryOp::onFileSelected()
     return;
 
   QString anObjectName = aPanel->getObjectName().simplified();
-  if ( anObjectName.isEmpty() )
+  //if ( anObjectName.isEmpty() )
   {
-    anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), "Bathymetry" );
+    anObjectName = aPanel->getFileName();
+    if ( !anObjectName.isEmpty() ) {
+        anObjectName = QFileInfo( anObjectName ).baseName();
+    }
+
+    if ( anObjectName.isEmpty() ) {
+      anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_BATHYMETRY_NAME" ) );
+    }
     aPanel->setObjectName( anObjectName );
   }
 }