Salome HOME
Merge branch 'BR_MULTI_BATHS' into HEAD
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ImportBathymetryOp.cxx
index fb8e663a1bf1d02ec1cdaf8eb85a6b3ad94adc63..02ea51ac293063d1dff35c8ef40ae345dfa2bcc9 100644 (file)
@@ -23,6 +23,7 @@
 #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 <SVTK_ViewModel.h>
 
 #include <QFileInfo>
+#include <QSet>
+#include <SUIT_MessageBox.h>
+#include <SUIT_Desktop.h>
+
 
 HYDROGUI_ImportBathymetryOp::HYDROGUI_ImportBathymetryOp( HYDROGUI_Module* theModule, 
                                                          const bool theIsEdit  )
@@ -64,12 +69,15 @@ void HYDROGUI_ImportBathymetryOp::startOperation()
     if( !myEditedObject.IsNull() )
     {
       QString aName = myEditedObject->GetName();
-      QString aFileName = HYDROGUI_Tool::ToQString( myEditedObject->GetFilePath() );
+      QStringList aFileNames = myEditedObject->GetFilePaths();
       bool anIsAltitudesInverted = myEditedObject->IsAltitudesInverted();
 
+      aPanel->setFuseIntoOneOptionChecked( true );
+
       aPanel->setObjectName( aName );
-      aPanel->setFileName( aFileName );
+      aPanel->setFileNames( aFileNames ); 
       aPanel->setInvertAltitudes( anIsAltitudesInverted );
+      aPanel->setFuseIntoOneOptionEnabled( false );
     }
   }
 }
@@ -88,7 +96,7 @@ 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;
 }
@@ -109,64 +117,151 @@ bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags,
     return false;
   }
 
-  QString aFileName = aPanel->getFileName().simplified();
-  bool anIsInvertAltitudes = aPanel->isInvertAltitudes();
+  QStringList aFileNames = aPanel->getFileNames();
 
-  if ( aFileName.isEmpty() )
-  {
-    theErrorMsg = tr( "INCORRECT_FILE_NAME" );
-    return false;
-  }
+  QStringList DummyFileList;
+  foreach (QString str, aFileNames)
+    DummyFileList << str.simplified();
 
-  QFileInfo aFileInfo( aFileName );
-  if ( !aFileInfo.exists() || !aFileInfo.isReadable() )
+  aFileNames = DummyFileList;
+  DummyFileList.clear();
+
+  if ( aFileNames.isEmpty() )
   {
-    theErrorMsg = tr( "FILE_NOT_EXISTS_OR_CANT_BE_READ" ).arg( aFileName );
+    theErrorMsg = tr( "EMPTY_FILENAMES" );
     return false;
   }
 
-  if( !myIsEdit || ( !myEditedObject.IsNull() && myEditedObject->GetName() != anObjectName ) )
+  QString inexistWarn;
+
+  foreach (QString aFileName, aFileNames )
   {
-    // 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() )
+    QFileInfo aFileInfo( aFileName );
+    if ( !aFileInfo.exists() || !aFileInfo.isReadable() )
     {
-      theErrorMsg = tr( "OBJECT_EXISTS_IN_DOCUMENT" ).arg( anObjectName );
-      return false;
+      inexistWarn += "\n" + aFileName;
+      continue;
     }
+    DummyFileList << aFileName;
   }
 
-  Handle(HYDROData_Bathymetry) aBathymetryObj;
+  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 )
   {
-    aBathymetryObj = myEditedObject;
-  }
-  else
-  {
-    aBathymetryObj = 
-      Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) );
-  }
-  if ( aBathymetryObj.IsNull() )
-    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 anOldFileName = HYDROGUI_Tool::ToQString( aBathymetryObj->GetFilePath() );
-  if ( aFileName != anOldFileName )
-  {
-    aBathymetryObj->SetAltitudesInverted( anIsInvertAltitudes, false );
-    if ( !aBathymetryObj->ImportFromFile( HYDROGUI_Tool::ToAsciiString( aFileName ) ) )
+    QString aNewObjName;
+    if (CheckNameExistingBathy(anObjectName, aNewObjName))
     {
-      theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileName );
-      return false;
+      myEditedObject->SetName( aNewObjName );
+      replacemWarn += "\n'" + anObjectName + "' => '" + aNewObjName + "'";
     }
+    else
+      myEditedObject->SetName( anObjectName );
+    myEditedObject->Update();
   }
-  else if ( anIsInvertAltitudes != aBathymetryObj->IsAltitudesInverted() )
+  else
   {
-    aBathymetryObj->SetAltitudesInverted( anIsInvertAltitudes );
+    //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;
+      }
+
+      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;
+      }
+    }
   }
 
-  aBathymetryObj->SetName( anObjectName );
+  if (!UnreadFilesWarn.isNull())
+    SUIT_MessageBox::warning( module()->getApp()->desktop(), 
+    tr( "BATHEMETRY_IMPORT_WARNING" ), "The next files cannot be imported:" + UnreadFilesWarn );
 
-  aBathymetryObj->Update();
+
+  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 );
 
   // Activate VTK viewer and show the bathymetry
   SUIT_ViewManager* aVTKMgr = 0;
@@ -184,30 +279,12 @@ bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags,
     }
   }
 
-  /*
-  // 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 );
-  }
+    UF_VTKViewer | UF_VTK_Forced;
 
   return true;
 }
-
 void HYDROGUI_ImportBathymetryOp::onFileSelected()
 {
   HYDROGUI_ImportBathymetryDlg* aPanel = 
@@ -215,11 +292,17 @@ 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() )
+  if ( anObjectName.isEmpty() )
   {
-    anObjectName = aPanel->getFileName();
-    if ( !anObjectName.isEmpty() ) {
+    if (aFileNames.count() == 1)
+    {
+      anObjectName = aFileNames[0];
+      if ( !anObjectName.isEmpty() )
         anObjectName = QFileInfo( anObjectName ).baseName();
     }
 
@@ -230,5 +313,16 @@ void HYDROGUI_ImportBathymetryOp::onFileSelected()
   }
 }
 
+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;
+  }
+}