Salome HOME
linear stream interpolator : insertPoints() : deny to add more points than needed
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ImportBathymetryOp.cxx
index c692196181d04bb6d454f25528e2364c78063e74..ed80b1d248a6bf0b3c6bb6839f85f7947f7e32f2 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 <HYDROGUI_OCCDisplayer.h>
+
 #include <HYDROData_Bathymetry.h>
 
 #include <LightApp_Application.h>
 #include <SUIT_ViewManager.h>
 #include <SVTK_ViewModel.h>
 
+#include <OCCViewer_ViewManager.h>
 #include <QFileInfo>
+#include <QSet>
+#include <SUIT_MessageBox.h>
+#include <SUIT_Desktop.h>
+#include <HYDROGUI_ShapeBathymetry.h>
+
 
 HYDROGUI_ImportBathymetryOp::HYDROGUI_ImportBathymetryOp( HYDROGUI_Module* theModule, 
                                                          const bool theIsEdit  )
@@ -59,16 +65,24 @@ void HYDROGUI_ImportBathymetryOp::startOperation()
     return;
 
   aPanel->reset();
+  aPanel->SetEditMode(myIsEdit);
 
   if( myIsEdit )
   {
-    myEditedObject = Handle(HYDROData_Bathymetry)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
+    if ( isApplyAndClose() )
+      myEditedObject = Handle(HYDROData_Bathymetry)::DownCast( HYDROGUI_Tool::GetSelectedObject( module() ) );
     if( !myEditedObject.IsNull() )
     {
       QString aName = myEditedObject->GetName();
-      QString aFileName = myEditedObject->GetFilePath();
+      QStringList aFileNames = myEditedObject->GetFilePaths();
+      bool anIsAltitudesInverted = myEditedObject->IsAltitudesInverted();
+
+      aPanel->setFuseIntoOneOptionChecked( true );
+
       aPanel->setObjectName( aName );
-      aPanel->setFileName( aFileName );
+      aPanel->addFileNames( aFileNames ); 
+      aPanel->setInvertAltitudes( anIsAltitudesInverted );
+      aPanel->setFuseIntoOneOptionEnabled( false );
     }
   }
 }
@@ -87,13 +101,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() );
@@ -107,48 +122,144 @@ bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags,
     return false;
   }
 
-  QString aFileName = aPanel->getFileName().simplified();
-  if ( aFileName.isEmpty() )
-  {
-    theErrorMsg = tr( "INCORRECT_FILE_NAME" );
-    return false;
-  }
+  QStringList aFileNames = aPanel->getFileNames();
+
+  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;
   }
 
-  // check that there are no other objects with the same name in the document
-  Handle(HYDROData_Entity) anObject = HYDROGUI_Tool::FindObjectByName( module(), anObjectName );
-  if ( ( !myIsEdit ) && ( !anObject.IsNull() ) )
+  QString inexistWarn;
+
+  foreach (QString aFileName, aFileNames )
   {
-    theErrorMsg = tr( "OBJECT_EXISTS_IN_DOCUMENT" ).arg( anObjectName );
-    return false;
+    QFileInfo aFileInfo( aFileName );
+    if ( !aFileInfo.exists() || !aFileInfo.isReadable() )
+    {
+      inexistWarn += "\n" + aFileName;
+      continue;
+    }
+    DummyFileList << aFileName;
   }
 
-  Handle(HYDROData_Bathymetry) aBathymetryObj;
+  if (!inexistWarn.isNull())
+    SUIT_MessageBox::warning( module()->getApp()->desktop(), 
+    tr( "BATHYMETRY_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;
+    //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, true );
+      if ( !myEditedObject->ImportFromFiles( aFileNames ) )
+      {
+        theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileNames.join("\n") );
+        return false;
+      }
+    }
+    else if ( anIsInvertAltitudes != myEditedObject->IsAltitudesInverted() )
+      myEditedObject->SetAltitudesInverted( anIsInvertAltitudes, true );
+
+    myEditedObject->SetName( anObjectName );
+    myEditedObject->Update();
   }
   else
   {
-    aBathymetryObj = 
-      Handle(HYDROData_Bathymetry)::DownCast( doc()->CreateObject( KIND_BATHYMETRY ) );
-  }
-  if ( aBathymetryObj.IsNull() )
-    return false;
+    //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;
+      }
 
-  if ( !aBathymetryObj->ImportFromFile( aFileName ) )
-  {
-    theErrorMsg = tr( "BAD_IMPORTED_BATHYMETRY_FILE" ).arg( aFileName );
-    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( "BATHYMETRY_IMPORT_WARNING" ), "The next files cannot be imported:" + UnreadFilesWarn );
+
+
+  if (!replacemWarn.isNull())
+    SUIT_MessageBox::warning( module()->getApp()->desktop(), 
+    tr( "BATHYMETRY_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;
@@ -165,21 +276,26 @@ bool HYDROGUI_ImportBathymetryOp::processApply( int& theUpdateFlags,
       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 )
+    
+  OCCViewer_ViewManager* mgr = dynamic_cast<OCCViewer_ViewManager*>(aViewMgr);
+  OCCViewer_Viewer* occ_viewer = mgr->getOCCViewer();
+  int aViewerId = (size_t)(occ_viewer);
+
+  HYDROGUI_Shape* aObjSh = module()->getObjectShape( aViewerId, myEditedObject );
+  HYDROGUI_ShapeBathymetry* aBathSh = dynamic_cast<HYDROGUI_ShapeBathymetry*>( aObjSh );
+  if (aBathSh)
   {
-    module()->setObjectVisible( (size_t)aVTKMgr->getViewModel(), aBathymetryObj, true );
+    aBathSh->update(false, false);
+    aBathSh->RescaleDefault();
+    module()->getOCCDisplayer()->UpdateColorScale( occ_viewer );
   }
 
-  theUpdateFlags = UF_Model | UF_VTKViewer | UF_VTK_Init | UF_VTK_Forced;
+  theUpdateFlags = UF_Model | UF_OCCViewer | UF_OCC_Forced |
+    UF_VTKViewer | UF_VTK_Forced;
+
   return true;
 }
-
 void HYDROGUI_ImportBathymetryOp::onFileSelected()
 {
   HYDROGUI_ImportBathymetryDlg* aPanel = 
@@ -187,20 +303,19 @@ void HYDROGUI_ImportBathymetryOp::onFileSelected()
   if ( !aPanel )
     return;
 
-  QString anObjectName = aPanel->getObjectName().simplified();
-  if ( anObjectName.isEmpty() )
-  {
-    anObjectName = aPanel->getFileName();
-    if ( !anObjectName.isEmpty() ) {
-        anObjectName = QFileInfo( anObjectName ).baseName();
-    }
+  aPanel->UpdateCheckBoxStates();
+}
 
-    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;
   }
 }
 
 
-