Salome HOME
#refs 522 (very draft) //import only
[modules/hydro.git] / src / HYDROData / HYDROData_Bathymetry.cxx
index e3320ad2d4f308b5e68a32ac9f309494514cd6c9..adc140a1db93066822acd12b612faced8666e980 100644 (file)
@@ -409,6 +409,8 @@ bool HYDROData_Bathymetry::ImportFromFile( const TCollection_AsciiString& theFil
   // Try to import the file
   if ( aFileSuf == "xyz" )
     aRes = importFromXYZFile( aFile, aPoints );
+  else if ( aFileSuf == "asc" )
+    aRes = importFromASCFile( aFile, aPoints );
 
   // Close the file
   aFile.close();
@@ -496,6 +498,97 @@ bool HYDROData_Bathymetry::importFromXYZFile( QFile&          theFile,
   return true;
 }
 
+bool HYDROData_Bathymetry::importFromASCFile( QFile&          theFile,
+                                              AltitudePoints& thePoints ) const
+{
+  if ( !theFile.isOpen() )
+    return false;
+
+  QString aLine;
+  QStringList aStrList;
+
+  int aNCols;
+  int aNRows;
+  double anXllCorner; 
+  double anYllCorner; 
+  double aCellSize; 
+  double aNoDataValue;
+
+  aLine = theFile.readLine().simplified();
+  aStrList = aLine.split( ' ', QString::SkipEmptyParts );
+  if ( aStrList.length() != 2 && aStrList[0].toLower() != "ncols" )
+    return false;
+  aNCols = aStrList[1].toInt();
+
+  aLine = theFile.readLine().simplified();
+  aStrList = aLine.split( ' ', QString::SkipEmptyParts );
+  if ( aStrList.length() != 2 && aStrList[0].toLower() != "nrows" )
+    return false;
+  aNRows = aStrList[1].toInt();
+
+  aLine = theFile.readLine().simplified();
+  aStrList = aLine.split( ' ', QString::SkipEmptyParts );
+  if ( aStrList.length() != 2 && aStrList[0].toLower() != "xllcorner" )
+    return false;
+  anXllCorner = aStrList[1].toDouble();
+
+  aLine = theFile.readLine().simplified();
+  aStrList = aLine.split( ' ', QString::SkipEmptyParts );
+  if ( aStrList.length() != 2 && aStrList[0].toLower() != "yllcorner" )
+    return false;
+  anYllCorner = aStrList[1].toDouble();
+
+  aLine = theFile.readLine().simplified();
+  aStrList = aLine.split( ' ', QString::SkipEmptyParts );
+  if ( aStrList.length() != 2 && aStrList[0].toLower() != "cellsize" )
+    return false;
+  aCellSize = aStrList[1].toDouble();
+
+  aLine = theFile.readLine().simplified();
+  aStrList = aLine.split( ' ', QString::SkipEmptyParts );
+  if ( aStrList.length() != 2 && aStrList[0].toLower() != "nodata_value" )
+    return false;
+  aNoDataValue = aStrList[1].toDouble();
+
+  bool anIsAltitudesInverted = IsAltitudesInverted();
+
+  int i = 0;
+  int aStrLength = 0;
+  while ( !theFile.atEnd() )
+  {
+    aLine = theFile.readLine().simplified();
+    aStrList = aLine.split( ' ', QString::SkipEmptyParts );
+
+    aStrLength =  aStrList.length();
+    if ( aStrLength == 0 )
+      continue;
+
+    if ( aStrLength != aNRows )
+      return false;
+
+    for (int j = 0; j < aNCols; j++)
+    {
+      if (aStrList[j].toDouble() != aNoDataValue)
+      {
+        AltitudePoint aPoint;
+        aPoint.SetX(anXllCorner + aCellSize*(j + 0.5));
+        aPoint.SetY(anYllCorner + aCellSize*(aNRows - i + 0.5));
+        aPoint.SetZ(aStrList[j].toDouble());
+
+        if ( anIsAltitudesInverted )
+         aPoint.SetZ( -aPoint.Z() );
+
+        thePoints.Append(aPoint);
+      }
+    }
+    i++;
+
+  }
+
+  return true;
+
+}
+
 
 Handle_HYDROData_PolylineXY HYDROData_Bathymetry::CreateBoundaryPolyline() const
 {