Salome HOME
Merge branch 'BR_MULTI_BATHS' into HEAD
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ImportBathymetryOp.cxx
index d902c7d397bd0317de7103334d3f7852741bb9ec..02ea51ac293063d1dff35c8ef40ae345dfa2bcc9 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_ImportBathymetryOp.h"
 
 #include "HYDROGUI_DataModel.h"
+#include "HYDROGUI_DataObject.h"
 #include "HYDROGUI_ImportBathymetryDlg.h"
 #include "HYDROGUI_Module.h"
 #include "HYDROGUI_Tool.h"
+#include "HYDROGUI_Tool2.h"
 #include "HYDROGUI_UpdateFlags.h"
 
 #include <HYDROData_Bathymetry.h>
 
 #include <LightApp_Application.h>
 #include <LightApp_UpdateFlags.h>
+#include <SUIT_ViewManager.h>
+#include <SVTK_ViewModel.h>
 
 #include <QFileInfo>
+#include <QSet>
+#include <SUIT_MessageBox.h>
+#include <SUIT_Desktop.h>
+
 
-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 +61,25 @@ 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();
+      QStringList aFileNames = myEditedObject->GetFilePaths();
+      bool anIsAltitudesInverted = myEditedObject->IsAltitudesInverted();
+
+      aPanel->setFuseIntoOneOptionChecked( true );
+
+      aPanel->setObjectName( aName );
+      aPanel->setFileNames( aFileNames ); 
+      aPanel->setInvertAltitudes( anIsAltitudesInverted );
+      aPanel->setFuseIntoOneOptionEnabled( false );
+    }
+  }
 }
 
 void HYDROGUI_ImportBathymetryOp::abortOperation()
@@ -71,13 +96,14 @@ HYDROGUI_InputPanel* HYDROGUI_ImportBathymetryOp::createInputPanel() const
 {
   HYDROGUI_InputPanel* aPanel = new HYDROGUI_ImportBathymetryDlg( module(), getName() );
   
-  connect ( aPanel, SIGNAL( FileSelected( const QString& ) ), SLOT( onFileSelected() ) );
+  connect ( aPanel, SIGNAL( FileSelected( const QStringList& ) ), SLOT( onFileSelected() ) );
 
   return aPanel;
 }
 
 bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags,
-                                                QString& theErrorMsg )
+                                                QString& theErrorMsg,
+                                                QStringList& theBrowseObjectsEntries )
 {
   HYDROGUI_ImportBathymetryDlg* aPanel = 
     ::qobject_cast<HYDROGUI_ImportBathymetryDlg*>( inputPanel() );
@@ -91,45 +117,174 @@ bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags,
     return false;
   }
 
-  QString aFileName = aPanel->getFileName().simplified();
-  if ( aFileName.isEmpty() )
+  QStringList aFileNames = aPanel->getFileNames();
+
+  QStringList DummyFileList;
+  foreach (QString str, aFileNames)
+    DummyFileList << str.simplified();
+
+  aFileNames = DummyFileList;
+  DummyFileList.clear();
+
+  if ( aFileNames.isEmpty() )
   {
-    theErrorMsg = tr( "INCORRECT_FILE_NAME" );
+    theErrorMsg = tr( "EMPTY_FILENAMES" );
     return false;
   }
 
-  QFileInfo aFileInfo( aFileName );
-  if ( !aFileInfo.exists() || !aFileInfo.isReadable() )
+  QString inexistWarn;
+
+  foreach (QString aFileName, aFileNames )
   {
-    theErrorMsg = tr( "FILE_NOT_EXISTS_OR_CANT_BE_READ" ).arg( aFileName );
-    return false;
+    QFileInfo aFileInfo( aFileName );
+    if ( !aFileInfo.exists() || !aFileInfo.isReadable() )
+    {
+      inexistWarn += "\n" + aFileName;
+      continue;
+    }
+    DummyFileList << aFileName;
   }
 
-  // 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 (!inexistWarn.isNull())
+    SUIT_MessageBox::warning( module()->getApp()->desktop(), 
+    tr( "BATHEMETRY_IMPORT_WARNING" ), "Can't read the next files:" + inexistWarn );
+
+  aFileNames = DummyFileList;
+
+  bool isFuseIntoOneOption = aPanel->isFuseIntoOneOptionChecked(); 
+  bool anIsInvertAltitudes = aPanel->isInvertAltitudes();
+
+  QString replacemWarn;
+  QString UnreadFilesWarn;
+
+  if ( myIsEdit )
   {
-    theErrorMsg = tr( "OBJECT_EXISTS_IN_DOCUMENT" ).arg( anObjectName );
-    return false;
+    //edit already existing bath
+    if (myEditedObject.IsNull())
+      return false;
+    QStringList anOldFileNames = myEditedObject->GetFilePaths(); 
+    bool anIsInvertAltitudes = aPanel->isInvertAltitudes();
+    myEditedObject->SetAltitudesInverted( anIsInvertAltitudes, false );
+    if ( aFileNames.toSet() != anOldFileNames.toSet() )
+    {
+      myEditedObject->SetAltitudesInverted( anIsInvertAltitudes, false );
+      if ( !myEditedObject->ImportFromFiles( aFileNames ) )
+      {
+        theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileNames.join("\n") );
+        return false;
+      }
+    }
+    else if ( anIsInvertAltitudes != myEditedObject->IsAltitudesInverted() )
+      myEditedObject->SetAltitudesInverted( anIsInvertAltitudes );
+
+    QString aNewObjName;
+    if (CheckNameExistingBathy(anObjectName, aNewObjName))
+    {
+      myEditedObject->SetName( aNewObjName );
+      replacemWarn += "\n'" + anObjectName + "' => '" + aNewObjName + "'";
+    }
+    else
+      myEditedObject->SetName( anObjectName );
+    myEditedObject->Update();
   }
+  else
+  {
+    //create the new one
+    if (isFuseIntoOneOption)
+    {
+      Handle(HYDROData_Bathymetry) aBathymetryObj = Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) );
+      if ( aBathymetryObj.IsNull() )
+        return false;
+      aBathymetryObj->SetAltitudesInverted( anIsInvertAltitudes, false );
+      if ( !aBathymetryObj->ImportFromFiles( aFileNames ) )
+      {
+        theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileNames.join("\n") );
+        return false;
+      }
 
-  Handle(HYDROData_Bathymetry) aBathymetryObj = 
-    Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) );
-  if ( aBathymetryObj.IsNull() )
-    return false;
+      QString aNewObjName;
+      if (CheckNameExistingBathy(anObjectName, aNewObjName))
+      {
+        aBathymetryObj->SetName( aNewObjName );
+        replacemWarn += "\n'" + anObjectName + "' => '" + aNewObjName + "'";
+      }
+      else
+        aBathymetryObj->SetName( anObjectName );
+
+      aBathymetryObj->SetName( anObjectName );
+      aBathymetryObj->Update();
+      QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aBathymetryObj );
+      theBrowseObjectsEntries.append( anEntry );
+    }
+    else //myedit off + non-fuse => import separate files
+    {
+      bool AtLeastOneWasImported = false;
+      foreach (QString filename, aFileNames)
+      {
+        Handle(HYDROData_Bathymetry) aBathymetryObj = Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) );
+        if ( aBathymetryObj.IsNull() )
+          continue;
+        aBathymetryObj->SetAltitudesInverted( anIsInvertAltitudes, false );
+        if ( !aBathymetryObj->ImportFromFiles( QStringList(filename) ) )
+        {
+          UnreadFilesWarn += "\n" + filename;
+          continue;
+        }
+
+        QString anObjectName = QFileInfo( filename ).baseName();
+        QString aNewObjName;
+        if (CheckNameExistingBathy(anObjectName, aNewObjName))
+        {
+          aBathymetryObj->SetName( aNewObjName );
+          replacemWarn += "\n'" + anObjectName + "' => '" + aNewObjName + "'";
+        }
+        else
+          aBathymetryObj->SetName( anObjectName );
+
+        AtLeastOneWasImported = true;
+        aBathymetryObj->Update();
+        QString anEntry = HYDROGUI_DataObject::dataObjectEntry( aBathymetryObj );
+        theBrowseObjectsEntries.append( anEntry );
+      }
+      if (!AtLeastOneWasImported)
+      {
+        theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILES" ).arg( aFileNames.join("\n") ); 
+        return false;
+      }
+    }
+  }
+
+  if (!UnreadFilesWarn.isNull())
+    SUIT_MessageBox::warning( module()->getApp()->desktop(), 
+    tr( "BATHEMETRY_IMPORT_WARNING" ), "The next files cannot be imported:" + UnreadFilesWarn );
+
+
+  if (!replacemWarn.isNull())
+    SUIT_MessageBox::warning( module()->getApp()->desktop(), 
+    tr( "BATHEMETRY_IMPORT_WARNING" ), "The next objects names are already exist in the document; so the new objects was renamed:" + replacemWarn );
 
-  if ( !aBathymetryObj->ImportFromFile( aFileName ) )
+  // 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 )
   {
-    theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileName );
-    return false;
+    if ( aViewMgr->getType() == SVTK_Viewer::Type() )
+    {
+      aVTKMgr = aViewMgr;
+    }
+    else
+    {
+      aVTKMgr = module()->getApp()->viewManager( SVTK_Viewer::Type() );
+    }
   }
 
-  aBathymetryObj->SetName( anObjectName );
+  theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced |
+    UF_VTKViewer | UF_VTK_Forced;
 
-  theUpdateFlags = UF_Model;
   return true;
 }
-
 void HYDROGUI_ImportBathymetryOp::onFileSelected()
 {
   HYDROGUI_ImportBathymetryDlg* aPanel = 
@@ -137,13 +292,37 @@ void HYDROGUI_ImportBathymetryOp::onFileSelected()
   if ( !aPanel )
     return;
 
+  QStringList aFileNames = aPanel->getFileNames();
+  if ( !aPanel->isFuseIntoOneOptionEnabled() )
+    aPanel->setFuseIntoOneOptionEnabled( !myIsEdit && aFileNames.count() > 1 );
+
   QString anObjectName = aPanel->getObjectName().simplified();
   if ( anObjectName.isEmpty() )
   {
-    anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), "Bathymetry" );
+    if (aFileNames.count() == 1)
+    {
+      anObjectName = aFileNames[0];
+      if ( !anObjectName.isEmpty() )
+        anObjectName = QFileInfo( anObjectName ).baseName();
+    }
+
+    if ( anObjectName.isEmpty() ) {
+      anObjectName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_BATHYMETRY_NAME" ) );
+    }
     aPanel->setObjectName( anObjectName );
   }
 }
 
+bool HYDROGUI_ImportBathymetryOp::CheckNameExistingBathy(const QString& InpName, QString& OutputName)
+{
+  Handle(HYDROData_Entity) anObject = HYDROGUI_Tool::FindObjectByName( module(), InpName );
+  if (anObject.IsNull())
+    return false;
+  else
+  {
+    OutputName = HYDROGUI_Tool::GenerateObjectName( module(), tr( "DEFAULT_BATHYMETRY_NAME" ) );
+    return true;
+  }
+}