Salome HOME
porting on linux
[modules/hydro.git] / src / HYDROData / HYDROData_Bathymetry.cxx
index 19a11e70133c1da5a62a2a1675fc3b7a6b2475fb..f7d31037c98ff71954ad8b203b6e975a10ba5736 100644 (file)
@@ -28,6 +28,7 @@
 #include <TDataStd_RealArray.hxx>
 #include <TDataStd_AsciiString.hxx>
 #include <TDataStd_Integer.hxx>
+#include <TDataStd_ExtStringArray.hxx>
 
 #include <QColor>
 #include <QFile>
@@ -35,6 +36,7 @@
 #include <QPointF>
 #include <QPolygonF>
 #include <QStringList>
+#include <QString>
 
 #ifndef LIGHT_MODE
 #include <vtkPoints.h>
@@ -436,6 +438,19 @@ void HYDROData_Bathymetry::SetFilePath( const TCollection_AsciiString& theFilePa
   TDataStd_AsciiString::Set( myLab.FindChild( DataTag_FilePath ), theFilePath );
 }
 
+void HYDROData_Bathymetry::SetFilePaths( const QStringList& theFilePaths )
+{
+  int i = 1;
+  Handle_TDataStd_ExtStringArray TExtStrArr = TDataStd_ExtStringArray::Set( myLab.FindChild( DataTag_FilePaths ), 1, theFilePaths.size() );
+  foreach (QString filepath, theFilePaths)
+  {
+    std::string sstr = filepath.toStdString();
+    const char* Val = sstr.c_str();
+    TExtStrArr->SetValue(i, TCollection_ExtendedString(Val));
+    i++;
+  }
+}
+
 TCollection_AsciiString HYDROData_Bathymetry::GetFilePath() const
 {
   TCollection_AsciiString aRes;
@@ -447,10 +462,52 @@ TCollection_AsciiString HYDROData_Bathymetry::GetFilePath() const
     if ( aLabel.FindAttribute( TDataStd_AsciiString::GetID(), anAsciiStr ) )
       aRes = anAsciiStr->Get();
   }
+  else
+  {
+    aLabel = myLab.FindChild( DataTag_FilePaths, false );
+    if ( !aLabel.IsNull() )
+    {
+      Handle(TDataStd_ExtStringArray) anExtStrArr;
+      if ( aLabel.FindAttribute( TDataStd_ExtStringArray::GetID(), anExtStrArr ) )
+        aRes = anExtStrArr->Value(1); //try take the first; convert extstring to asciistring
+    }
+  }
 
   return aRes;
 }
 
+QStringList HYDROData_Bathymetry::GetFilePaths() const
+{
+  QStringList aResL;
+
+  TDF_Label aLabel = myLab.FindChild( DataTag_FilePaths, false );
+  if ( !aLabel.IsNull() )
+  {
+    Handle(TDataStd_ExtStringArray) anExtStrArr;
+    if ( aLabel.FindAttribute( TDataStd_ExtStringArray::GetID(), anExtStrArr ) )
+    {
+      for (int i = anExtStrArr->Lower(); i <= anExtStrArr->Upper(); i++ )
+      {
+        Standard_ExtString str = anExtStrArr->Value(i).ToExtString();
+        TCollection_AsciiString aText (str);
+        aResL << QString(aText.ToCString());
+      }
+    }
+  }
+  else //backward compatibility 
+  {
+    TDF_Label anOldLabel = myLab.FindChild( DataTag_FilePath, false );
+    if ( !anOldLabel.IsNull() )
+    {
+      Handle(TDataStd_AsciiString) anAsciiStr;
+      if ( anOldLabel.FindAttribute( TDataStd_AsciiString::GetID(), anAsciiStr ) )
+        aResL << QString(anAsciiStr->Get().ToCString());
+    }
+  }
+
+  return aResL;
+}
+
 void HYDROData_Bathymetry::SetAltitudesInverted( const bool theIsInverted,
                                                  const bool theIsUpdate )
 {
@@ -495,46 +552,59 @@ bool HYDROData_Bathymetry::IsAltitudesInverted() const
   return aRes;
 }
 
-bool HYDROData_Bathymetry::ImportFromFile( const TCollection_AsciiString& theFileName )
+bool HYDROData_Bathymetry::ImportFromFile( const QString& theFileName )
 {
-  // Try to open the file
-  QFile aFile( theFileName.ToCString() );
-  if ( !aFile.exists() || !aFile.open( QIODevice::ReadOnly ) )
-    return false;
+  return ImportFromFiles(QStringList(theFileName));
+}
 
-  bool aRes = false;
+bool HYDROData_Bathymetry::ImportFromFiles( const QStringList& theFileNames )
+{
+  AltitudePoints AllPoints;
+  bool Stat = false;
 
-  QString aFileSuf = QFileInfo( aFile ).suffix().toLower();
+  foreach (QString theFileName, theFileNames)
+  {
+    // Try to open the file
+    QFile aFile( theFileName );
+    if ( !aFile.exists() || !aFile.open( QIODevice::ReadOnly ) )
+      continue;
 
-  HYDROData_Bathymetry::AltitudePoints aPoints;
+    QString aFileSuf = QFileInfo( aFile ).suffix().toLower();
 
-  // Try to import the file
-  if ( aFileSuf == "xyz" )
-    aRes = importFromXYZFile( aFile, aPoints );
-  else if ( aFileSuf == "asc" )
-    aRes = importFromASCFile( aFile, aPoints );
+    HYDROData_Bathymetry::AltitudePoints aPoints;
 
-  // Close the file
-  aFile.close();
-  
+    // Try to import the file
+    if ( aFileSuf == "xyz" )
+      Stat = importFromXYZFile( aFile, aPoints );
+    else if ( aFileSuf == "asc" )
+      Stat = importFromASCFile( aFile, aPoints );
+
+    if (!Stat)
+      continue; //ignore this points
+
+    // Close the file
+    aFile.close();
+
+    AllPoints.insert(AllPoints.end(), aPoints.begin(), aPoints.end());
+  }
 
   // Convert from global to local CS
   Handle_HYDROData_Document aDoc = HYDROData_Document::Document( myLab );
-  HYDROData_Bathymetry::AltitudePoints::iterator anIter = aPoints.begin(), aLast = aPoints.end();
+  HYDROData_Bathymetry::AltitudePoints::iterator anIter = AllPoints.begin(), aLast = AllPoints.end();
   for ( ; anIter!=aLast; ++anIter )
   {
     HYDROData_Bathymetry::AltitudePoint& aPoint = *anIter;
     aDoc->Transform( aPoint.X, aPoint.Y, aPoint.Z, true );
   }
 
-  if ( aRes )
+  if ( Stat )
   {
     // Update file path and altitude points of this Bathymetry
-    SetFilePath( theFileName );
-    SetAltitudePoints( aPoints );
+    SetFilePaths (theFileNames );
+    SetAltitudePoints( AllPoints );
   }
 
-  return aRes && !aPoints.empty();
+  return Stat && !AllPoints.empty();
 }
 
 bool HYDROData_Bathymetry::importFromXYZFile( QFile&          theFile,