using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading;
using Deltares.Geometry;
using Deltares.Geotechnics.GeotechnicalGeometry;
using Deltares.Geotechnics.IO.Importers.Exception;
using Deltares.Standard;
using Deltares.Standard.EventPublisher;
using Deltares.Standard.IO;
using Deltares.Standard.Language;
using Deltares.Standard.Logging;
using LumenWorks.Framework.IO.Csv;
namespace Deltares.Geotechnics.IO.Importers
{
public class CharacteristicPointsImporter : Importer
{
///
/// This was the original (public) read used by DAM
///
/// Name of the file.
/// The surface lines.
/// Note: This method will remove entries from if
/// an error occurred while adding characteristic points to a particular entry.
public void Read(string fileName, List surfaceLines)
{
Type = typeof(SurfaceLine2);
CultureInfo oldcur = Thread.CurrentThread.CurrentCulture;
DataEventPublisher.InvokeWithoutPublishingEvents(() =>
{
try
{
Thread.CurrentThread.CurrentCulture = CsvReaderUtilities.DetermineCultureForFile(fileName);
using (var csv = new CsvReader(new StreamReader(fileName), true, ';'))
{
var headers = GetCharacteristicPointsFileHeader(fileName, csv);
var indexes = GetHeaderIndexes(fileName, headers);
int recordCount = 0;
while (csv.ReadNextRecord())
{
SurfaceLine2 surfaceLine = null;
recordCount++;
// Used to keep track of characteristic points that are required to be specified but couldn't be added.
bool charCheck = true;
try
{
surfaceLine = GetSurfacelineForDataRow(surfaceLines, csv, indexes);
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.MaaiveldBinnenwaarts, csv, CharacteristicPointType.SurfaceLevelInside);
if (charCheck && indexes.InsteekSlootPolderzijde.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.InsteekSlootPolderzijde, csv, CharacteristicPointType.DitchPolderSide);
}
if (charCheck && indexes.SlootbodemPolderzijde.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.SlootbodemPolderzijde, csv, CharacteristicPointType.BottomDitchPolderSide);
}
if (charCheck && indexes.SlootbodemDijkzijde.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.SlootbodemDijkzijde, csv, CharacteristicPointType.BottomDitchDikeSide);
}
if (charCheck && indexes.InsteekSlootDijkzijde.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.InsteekSlootDijkzijde, csv, CharacteristicPointType.DitchDikeSide);
}
if (charCheck)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.TeenDijkBinnenwaarts, csv, CharacteristicPointType.DikeToeAtPolder);
}
if (charCheck && indexes.KruinBinnenberm.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.KruinBinnenberm, csv, CharacteristicPointType.ShoulderTopInside);
}
if (charCheck && indexes.InsteekBinnenberm.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.InsteekBinnenberm, csv, CharacteristicPointType.ShoulderBaseInside);
}
if (charCheck)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.KruinBinnentalud, csv, CharacteristicPointType.DikeTopAtPolder);
}
if (charCheck && indexes.VerkeersbelastingKantBinnenwaarts.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.VerkeersbelastingKantBinnenwaarts, csv, CharacteristicPointType.TrafficLoadInside);
}
if (charCheck && indexes.VerkeersbelastingKantBuitenwaarts.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.VerkeersbelastingKantBuitenwaarts, csv, CharacteristicPointType.TrafficLoadOutside);
}
if (charCheck)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.KruinBuitentalud, csv, CharacteristicPointType.DikeTopAtRiver);
}
if (charCheck && indexes.InsteekBuitenberm.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.InsteekBuitenberm, csv, CharacteristicPointType.ShoulderBaseOutside);
}
if (charCheck && indexes.KruinBuitenberm.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.KruinBuitenberm, csv, CharacteristicPointType.ShoulderTopOutside);
}
if (charCheck)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.TeenDijkBuitenwaarts, csv, CharacteristicPointType.DikeToeAtRiver);
}
if (charCheck)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.MaaiveldBuitenwaarts, csv, CharacteristicPointType.SurfaceLevelOutside);
}
if (charCheck && indexes.TeenGeul.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.TeenGeul, csv, CharacteristicPointType.BottomRiverChannel);
}
if (charCheck && indexes.InsteekGeul.X > 0)
{
charCheck &= AddCharacteristicPointToSurfaceLine(surfaceLine, indexes.InsteekGeul, csv, CharacteristicPointType.InsertRiverChannel);
}
}
catch (System.Exception e)
{
string csvCharacteristicPointError = String.Format(
LocalizationManager.GetTranslatedText(typeof(CharacteristicPointsImporter),
"csvCharacteristicPointError"), surfaceLine.Name);
ErrorMessages.Add(new LogMessage(LogMessageType.Error, FileName, csvCharacteristicPointError + e.Message));
charCheck = false;
}
if (!charCheck)
{
surfaceLines.Remove(surfaceLine);
}
else
{
surfaceLine.SortPoints();
}
}
if (recordCount == 0)
{
var msg = String.Format(LocalizationManager.GetTranslatedText(this, "CharacteristicPointCsvFileEmptyWarning"), fileName);
ErrorMessages.Add(new LogMessage(LogMessageType.Warning, FileName, msg));
}
}
}
finally
{
Thread.CurrentThread.CurrentCulture = oldcur;
}
});
}
///
/// This is the unified Read to be used by the original
/// and the new Import() method of the superclass Importer class
///
///
///
/// This one is used by Ringtoets
public void Read(string fileName, IDataFactory factory)
{
// If we use the factory we are not sure if the surfaceline is already available;
// so we set isAddPointToSurfaceLineIfMissing to true: add the surfaceline if missing and add the characteristic points as points to the surface line
// If we use available surfacelines then set isAddPointToSurfaceLineIfMissing to false: surfaceline must be available and characteristic points should
// already be present as points in the surfaceline; a check is made on that
bool isAddPointToSurfaceLineIfMissing = (factory != null);
if (Type == null)
{
Type = typeof(SurfaceLine2);
}
CultureInfo oldcur = Thread.CurrentThread.CurrentCulture;
try
{
DataEventPublisher.InvokeWithoutPublishingEvents(() =>
{
Thread.CurrentThread.CurrentCulture = CsvReaderUtilities.DetermineCultureForFile(fileName);
using (var csv = new CsvReader(new StreamReader(fileName), true, ';'))
{
var headers = GetCharacteristicPointsFileHeader(fileName, csv);
var indexes = GetHeaderIndexes(fileName, headers);
SurfaceLine2 surfaceLine = null;
string surfaceLineName = "";
while (csv.ReadNextRecord())
{
try
{
surfaceLineName = csv[indexes.SurfaceLineId];
surfaceLine = GetSurfaceLine(factory, csv[indexes.SurfaceLineId]);
if (surfaceLine == null)
{
// warning if the physical surfaceline is undefined at this point
string surfacelLineNotFoundError = LocalizationManager.GetTranslatedText(typeof(CharacteristicPointsImporter), "SurfaceLineNotFoundError");
string logmessage = String.Format(surfacelLineNotFoundError, surfaceLineName);
SendImportError(logmessage);
}
else
{
AddCharacteristicPoints(csv, indexes, surfaceLine, isAddPointToSurfaceLineIfMissing);
surfaceLine.SortPoints();
}
}
catch (System.Exception e)
{
string csvCharacteristicPointError = String.Format(LocalizationManager.GetTranslatedText(typeof(CharacteristicPointsImporter),"csvCharacteristicPointError"), surfaceLineName);
SendImportError(csvCharacteristicPointError + e.Message);
}
}
}
});
}
finally
{
Thread.CurrentThread.CurrentCulture = oldcur;
}
}
private void SendImportError(string logmessage)
{
ErrorMessages.Add(new LogMessage(LogMessageType.Warning, FileName, logmessage));
}
private void AddCharacteristicPoints(CsvReader csv, CharacteristicPointsIndexes indexes, SurfaceLine2 surfaceLine, bool isAddPointToSurfaceLineIfMissing)
{
bool charCheck;
double x = Convert.ToDouble(csv[indexes.MaaiveldBinnenwaarts.X]);
double y = Convert.ToDouble(csv[indexes.MaaiveldBinnenwaarts.Y]);
double z = Convert.ToDouble(csv[indexes.MaaiveldBinnenwaarts.Z]);
var type = CharacteristicPointType.SurfaceLevelInside;
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type, isAddPointToSurfaceLineIfMissing);
if (charCheck && indexes.InsteekSlootPolderzijde.X > 0)
{
type = CharacteristicPointType.DitchPolderSide;
x = Convert.ToDouble(csv[indexes.InsteekSlootPolderzijde.X]);
y = Convert.ToDouble(csv[indexes.InsteekSlootPolderzijde.Y]);
z = Convert.ToDouble(csv[indexes.InsteekSlootPolderzijde.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck && indexes.SlootbodemPolderzijde.X > 0)
{
type = CharacteristicPointType.BottomDitchPolderSide;
x = Convert.ToDouble(csv[indexes.SlootbodemPolderzijde.X]);
y = Convert.ToDouble(csv[indexes.SlootbodemPolderzijde.Y]);
z = Convert.ToDouble(csv[indexes.SlootbodemPolderzijde.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck && indexes.SlootbodemDijkzijde.X > 0)
{
type = CharacteristicPointType.BottomDitchDikeSide;
x = Convert.ToDouble(csv[indexes.SlootbodemDijkzijde.X]);
y = Convert.ToDouble(csv[indexes.SlootbodemDijkzijde.Y]);
z = Convert.ToDouble(csv[indexes.SlootbodemDijkzijde.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck && indexes.InsteekSlootDijkzijde.X > 0)
{
type = CharacteristicPointType.DitchDikeSide;
x = Convert.ToDouble(csv[indexes.InsteekSlootDijkzijde.X]);
y = Convert.ToDouble(csv[indexes.InsteekSlootDijkzijde.Y]);
z = Convert.ToDouble(csv[indexes.InsteekSlootDijkzijde.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck)
{
type = CharacteristicPointType.DikeToeAtPolder;
x = Convert.ToDouble(csv[indexes.TeenDijkBinnenwaarts.X]);
y = Convert.ToDouble(csv[indexes.TeenDijkBinnenwaarts.Y]);
z = Convert.ToDouble(csv[indexes.TeenDijkBinnenwaarts.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck && indexes.KruinBinnenberm.X > 0)
{
type = CharacteristicPointType.ShoulderTopInside;
x = Convert.ToDouble(csv[indexes.KruinBinnenberm.X]);
y = Convert.ToDouble(csv[indexes.KruinBinnenberm.Y]);
z = Convert.ToDouble(csv[indexes.KruinBinnenberm.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck & indexes.InsteekBinnenberm.X > 0)
{
type = CharacteristicPointType.ShoulderBaseInside;
x = Convert.ToDouble(csv[indexes.InsteekBinnenberm.X]);
y = Convert.ToDouble(csv[indexes.InsteekBinnenberm.Y]);
z = Convert.ToDouble(csv[indexes.InsteekBinnenberm.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck)
{
type = CharacteristicPointType.DikeTopAtPolder;
x = Convert.ToDouble(csv[indexes.KruinBinnentalud.X]);
y = Convert.ToDouble(csv[indexes.KruinBinnentalud.Y]);
z = Convert.ToDouble(csv[indexes.KruinBinnentalud.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck && indexes.VerkeersbelastingKantBinnenwaarts.X > 0)
{
type = CharacteristicPointType.TrafficLoadInside;
x = Convert.ToDouble(csv[indexes.VerkeersbelastingKantBinnenwaarts.X]);
y = Convert.ToDouble(csv[indexes.VerkeersbelastingKantBinnenwaarts.Y]);
z = Convert.ToDouble(csv[indexes.VerkeersbelastingKantBinnenwaarts.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck && indexes.VerkeersbelastingKantBuitenwaarts.X > 0)
{
type = CharacteristicPointType.TrafficLoadOutside;
x = Convert.ToDouble(csv[indexes.VerkeersbelastingKantBuitenwaarts.X]);
y = Convert.ToDouble(csv[indexes.VerkeersbelastingKantBuitenwaarts.Y]);
z = Convert.ToDouble(csv[indexes.VerkeersbelastingKantBuitenwaarts.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck)
{
type = CharacteristicPointType.DikeTopAtRiver;
x = Convert.ToDouble(csv[indexes.KruinBuitentalud.X]);
y = Convert.ToDouble(csv[indexes.KruinBuitentalud.Y]);
z = Convert.ToDouble(csv[indexes.KruinBuitentalud.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck && indexes.InsteekBuitenberm.X > 0)
{
type = CharacteristicPointType.ShoulderBaseOutside;
x = Convert.ToDouble(csv[indexes.InsteekBuitenberm.X]);
y = Convert.ToDouble(csv[indexes.InsteekBuitenberm.Y]);
z = Convert.ToDouble(csv[indexes.InsteekBuitenberm.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck && indexes.KruinBuitenberm.X > 0)
{
type = CharacteristicPointType.ShoulderTopOutside;
x = Convert.ToDouble(csv[indexes.KruinBuitenberm.X]);
y = Convert.ToDouble(csv[indexes.KruinBuitenberm.Y]);
z = Convert.ToDouble(csv[indexes.KruinBuitenberm.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck)
{
type = CharacteristicPointType.DikeToeAtRiver;
x = Convert.ToDouble(csv[indexes.TeenDijkBuitenwaarts.X]);
y = Convert.ToDouble(csv[indexes.TeenDijkBuitenwaarts.Y]);
z = Convert.ToDouble(csv[indexes.TeenDijkBuitenwaarts.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck)
{
type = CharacteristicPointType.SurfaceLevelOutside;
x = Convert.ToDouble(csv[indexes.MaaiveldBuitenwaarts.X]);
y = Convert.ToDouble(csv[indexes.MaaiveldBuitenwaarts.Y]);
z = Convert.ToDouble(csv[indexes.MaaiveldBuitenwaarts.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck && indexes.TeenGeul.X > 0)
{
type = CharacteristicPointType.BottomRiverChannel;
x = Convert.ToDouble(csv[indexes.TeenGeul.X]);
y = Convert.ToDouble(csv[indexes.TeenGeul.Y]);
z = Convert.ToDouble(csv[indexes.TeenGeul.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
if (charCheck && indexes.InsteekGeul.X > 0)
{
type = CharacteristicPointType.InsertRiverChannel;
x = Convert.ToDouble(csv[indexes.InsteekGeul.X]);
y = Convert.ToDouble(csv[indexes.InsteekGeul.Y]);
z = Convert.ToDouble(csv[indexes.InsteekGeul.Z]);
charCheck = AddCharacteristicPointToSurfaceLine(surfaceLine, x, y, z, type,
isAddPointToSurfaceLineIfMissing);
}
}
public override void Import()
{
Read(FileName, Factory);
}
#region Nested Types: CharacteristicPointsIndexes, XYZ
///
/// Keeps all header indexes for a characteristic point csv file.
///
private class CharacteristicPointsIndexes
{
public readonly XYZ InsteekBinnenberm;
public readonly XYZ InsteekBuitenberm;
public readonly XYZ InsteekGeul;
public readonly XYZ InsteekSlootDijkzijde;
public readonly XYZ InsteekSlootPolderzijde;
public readonly XYZ KruinBinnenberm;
public readonly XYZ KruinBinnentalud;
public readonly XYZ KruinBuitenberm;
public readonly XYZ KruinBuitentalud;
public readonly XYZ MaaiveldBinnenwaarts;
public readonly XYZ MaaiveldBuitenwaarts;
public readonly XYZ SlootbodemDijkzijde;
public readonly XYZ SlootbodemPolderzijde;
public readonly XYZ TeenDijkBinnenwaarts;
public readonly XYZ TeenDijkBuitenwaarts;
public readonly XYZ TeenGeul;
public readonly XYZ VerkeersbelastingKantBinnenwaarts;
public readonly XYZ VerkeersbelastingKantBuitenwaarts;
public int SurfaceLineId;
public int Volgnummer;
public CharacteristicPointsIndexes()
{
SurfaceLineId = -1;
MaaiveldBinnenwaarts = new XYZ();
InsteekSlootPolderzijde = new XYZ();
SlootbodemPolderzijde = new XYZ();
SlootbodemDijkzijde = new XYZ();
InsteekSlootDijkzijde = new XYZ();
TeenDijkBinnenwaarts = new XYZ();
KruinBinnenberm = new XYZ();
InsteekBinnenberm = new XYZ();
KruinBinnentalud = new XYZ();
VerkeersbelastingKantBinnenwaarts = new XYZ();
VerkeersbelastingKantBuitenwaarts = new XYZ();
KruinBuitentalud = new XYZ();
InsteekBuitenberm = new XYZ();
KruinBuitenberm = new XYZ();
TeenDijkBuitenwaarts = new XYZ();
MaaiveldBuitenwaarts = new XYZ();
InsteekGeul = new XYZ();
TeenGeul = new XYZ();
}
}
///
/// Keeps the X, Y and Z coordinate values of a characteristic point.
///
private class XYZ
{
public int X;
public int Y;
public int Z;
public XYZ()
{
X = -1;
Y = -1;
Z = -1;
}
}
#endregion
///
/// Adds the characteristic point to the surface line.
///
/// The surface line.
/// The x co-ordinate.
/// The y co-ordinate.
/// The z co-ordinate.
/// The type.
/// if set to true [is add point to surface line if missing].
///
protected bool AddCharacteristicPointToSurfaceLine(SurfaceLine2 surfaceLine, double xGlobal, double yGlobal, double zGlobal,
CharacteristicPointType type, bool isAddPointToSurfaceLineIfMissing)
{
bool charCheck = true;
if (xGlobal == -1 && yGlobal == -1 && zGlobal == -1)
{
return true; //already exist or error situation ?????
}
GeometryPoint tppoint = surfaceLine.Geometry.GetPointAt(xGlobal, yGlobal, zGlobal);
if (surfaceLine.CharacteristicPoints.GeometryMustContainPoint)
{
if (tppoint != null)
{
surfaceLine.AddCharacteristicPoint(tppoint, type);
}
else
{
// Point is missing
if (isAddPointToSurfaceLineIfMissing)
{
// If point is missing add it to the surfaceline
surfaceLine.EnsurePointOfType(xGlobal, yGlobal, zGlobal, type);
}
else
{
// If point is missing log error message
string charPointNotFoundInSurfaceError = LocalizationManager.GetTranslatedText(typeof(CharacteristicPointsImporter), "charPointNotFoundInSurfaceError");
string logmessage = String.Format("{0} : {1} {2}", surfaceLine.Name, charPointNotFoundInSurfaceError, type);
ErrorMessages.Add(new LogMessage(LogMessageType.Error, FileName, logmessage));
charCheck = false;
}
}
}
else
{
var globalPoint = new GeometryPoint(xGlobal, yGlobal, zGlobal);
var localPoint = surfaceLine.Geometry.GetLocalPoint(globalPoint);
surfaceLine.AddCharacteristicPoint(localPoint ?? globalPoint, type);
}
return charCheck;
}
///
/// Retrieves the headers of the characteristic points csv file.
///
/// File being read.
/// Opened csv file reader.
/// The headers.
/// When the number of header
/// entries is lower then expected.
private static string[] GetCharacteristicPointsFileHeader(string fileName, CsvReader csv)
{
string[] headers = csv.GetFieldHeaders();
if (headers.Length < 53)
{
string csvHeaderError = LocalizationManager.GetTranslatedText(typeof(CharacteristicPointsImporter),
"csvHeaderError");
throw new CharacteristicPointsImporterException(String.Format("{0} : {1}", fileName, csvHeaderError));
}
return headers;
}
private static CharacteristicPointsIndexes GetHeaderIndexes(string fileName, string[] headers)
{
var indexes = new CharacteristicPointsIndexes();
indexes.SurfaceLineId = GetRequiredIndex(fileName, headers,
CharacteristicPointCsvIdentifiers.SurfaceLineId, CharacteristicPointCsvIdentifiers.LocationId);
GetRequiredXYZ(indexes.MaaiveldBinnenwaarts, fileName, headers,
new[]
{
CharacteristicPointCsvIdentifiers.SurfaceLevelInsideX
},
new[]
{
CharacteristicPointCsvIdentifiers.SurfaceLevelInsideY
},
new[]
{
CharacteristicPointCsvIdentifiers.SurfaceLevelInsideZ
});
GetXYZ(indexes.InsteekSlootPolderzijde, headers,
new[]
{
CharacteristicPointCsvIdentifiers.DitchPolderSideX
},
new[]
{
CharacteristicPointCsvIdentifiers.DitchPolderSideY
},
new[]
{
CharacteristicPointCsvIdentifiers.DitchPolderSideZ
});
GetXYZ(indexes.SlootbodemPolderzijde, headers,
new[]
{
CharacteristicPointCsvIdentifiers.BottomDitchPolderSideX
},
new[]
{
CharacteristicPointCsvIdentifiers.BottomDitchPolderSideY
},
new[]
{
CharacteristicPointCsvIdentifiers.BottomDitchPolderSideZ
});
GetXYZ(indexes.SlootbodemDijkzijde, headers,
new[]
{
CharacteristicPointCsvIdentifiers.BottomDitchDikeSideX
},
new[]
{
CharacteristicPointCsvIdentifiers.BottomDitchDikeSideY
},
new[]
{
CharacteristicPointCsvIdentifiers.BottomDitchDikeSideZ
});
GetXYZ(indexes.InsteekSlootDijkzijde, headers,
new[]
{
CharacteristicPointCsvIdentifiers.DitchDikeSideX
},
// The click program by Erik Vastenburg now delivers "Y_Insteek_sloot dijkzijde" instead of the correct above definition
// Erik will change this in his program but for now, this wrong tag should also be recognized.
new[]
{
CharacteristicPointCsvIdentifiers.DitchDikeSideY, "Y_Insteek_sloot dijkzijde"
},
new[]
{
CharacteristicPointCsvIdentifiers.DitchDikeSideZ
});
GetRequiredXYZ(indexes.TeenDijkBinnenwaarts, fileName, headers,
new[]
{
CharacteristicPointCsvIdentifiers.DikeToeAtPolderX
},
new[]
{
CharacteristicPointCsvIdentifiers.DikeToeAtPolderY
},
new[]
{
CharacteristicPointCsvIdentifiers.DikeToeAtPolderZ
});
GetXYZ(indexes.KruinBinnenberm, headers,
new[]
{
CharacteristicPointCsvIdentifiers.TopShoulderInsideX
},
new[]
{
CharacteristicPointCsvIdentifiers.TopShoulderInsideY
},
new[]
{
CharacteristicPointCsvIdentifiers.TopShoulderInsideZ
});
GetXYZ(indexes.InsteekBinnenberm, headers,
new[]
{
CharacteristicPointCsvIdentifiers.InsteekShoulderInsideX
},
new[]
{
CharacteristicPointCsvIdentifiers.InsteekShoulderInsideY
},
new[]
{
CharacteristicPointCsvIdentifiers.InsteekShoulderInsideZ
});
GetXYZ(indexes.KruinBinnentalud, headers,
new[]
{
CharacteristicPointCsvIdentifiers.DikeTopAtPolderX
},
new[]
{
CharacteristicPointCsvIdentifiers.DikeTopAtPolderY
},
new[]
{
CharacteristicPointCsvIdentifiers.DikeTopAtPolderZ
});
GetXYZ(indexes.VerkeersbelastingKantBinnenwaarts, headers,
new[]
{
CharacteristicPointCsvIdentifiers.TrafficLoadInsideX
},
new[]
{
CharacteristicPointCsvIdentifiers.TrafficLoadInsideY
},
new[]
{
CharacteristicPointCsvIdentifiers.TrafficLoadInsideZ
});
GetXYZ(indexes.VerkeersbelastingKantBuitenwaarts, headers,
new[]
{
CharacteristicPointCsvIdentifiers.TrafficLoadOutsideX
},
new[]
{
CharacteristicPointCsvIdentifiers.TrafficLoadOutsideY
},
new[]
{
CharacteristicPointCsvIdentifiers.TrafficLoadOutsideZ
});
GetRequiredXYZ(indexes.KruinBuitentalud, fileName, headers,
new[]
{
CharacteristicPointCsvIdentifiers.DikeTopAtRiverX
},
new[]
{
CharacteristicPointCsvIdentifiers.DikeTopAtRiverY
},
new[]
{
CharacteristicPointCsvIdentifiers.DikeTopAtRiverZ
});
GetXYZ(indexes.InsteekBuitenberm, headers,
new[]
{
CharacteristicPointCsvIdentifiers.InsteekShoulderOutsideX
},
new[]
{
CharacteristicPointCsvIdentifiers.InsteekShoulderOutsideY
},
new[]
{
CharacteristicPointCsvIdentifiers.InsteekShoulderOutsideZ
});
GetXYZ(indexes.KruinBuitenberm, headers,
new[]
{
CharacteristicPointCsvIdentifiers.TopShoulderOutsideX
},
new[]
{
CharacteristicPointCsvIdentifiers.TopShoulderOutsideY
},
new[]
{
CharacteristicPointCsvIdentifiers.TopShoulderOutsideZ
});
GetRequiredXYZ(indexes.TeenDijkBuitenwaarts, fileName, headers,
new[]
{
CharacteristicPointCsvIdentifiers.DikeToeAtRiverX
},
new[]
{
CharacteristicPointCsvIdentifiers.DikeToeAtRiverY
},
new[]
{
CharacteristicPointCsvIdentifiers.DikeToeAtRiverZ
});
GetRequiredXYZ(indexes.MaaiveldBuitenwaarts, fileName, headers,
new[]
{
CharacteristicPointCsvIdentifiers.SurfaceLevelOutsideX
},
new[]
{
CharacteristicPointCsvIdentifiers.SurfaceLevelOutsideY
},
new[]
{
CharacteristicPointCsvIdentifiers.SurfaceLevelOutsideZ
});
GetXYZ(indexes.InsteekGeul, headers,
new[]
{
CharacteristicPointCsvIdentifiers.InsertRiverChannelX
},
new[]
{
CharacteristicPointCsvIdentifiers.InsertRiverChannelY
},
new[]
{
CharacteristicPointCsvIdentifiers.InsertRiverChannelZ
});
GetXYZ(indexes.TeenGeul, headers,
new[]
{
CharacteristicPointCsvIdentifiers.BottomRiverChannelX
},
new[]
{
CharacteristicPointCsvIdentifiers.BottomRiverChannelY
},
new[]
{
CharacteristicPointCsvIdentifiers.BottomRiverChannelZ
});
indexes.Volgnummer = GetIndex(headers, "Volgnummer");
return indexes;
}
private static void GetXYZ(XYZ xyzIndexes, string[] headers, string[] xHeaderText, string[] yHeaderText, string[] zHeaderText)
{
xyzIndexes.X = GetIndex(headers, xHeaderText);
xyzIndexes.Y = GetIndex(headers, yHeaderText);
xyzIndexes.Z = GetIndex(headers, zHeaderText);
}
private static void GetRequiredXYZ(XYZ xyzIndexes, string fileName, string[] headers, string[] xHeaderText, string[] yHeaderText, string[] zHeaderText)
{
xyzIndexes.X = GetRequiredIndex(fileName, headers, xHeaderText);
xyzIndexes.Y = GetRequiredIndex(fileName, headers, yHeaderText);
xyzIndexes.Z = GetRequiredIndex(fileName, headers, zHeaderText);
}
///
/// Finds the index of a required header item.
///
/// All headers in the csv file.
/// The headers, mapping to a particular data item.
/// An integer greater the 0, being the index of the header in the csv file,
/// when a match is found; -1 when no match has been found.
private static int GetIndex(string[] headers, params string[] headerText)
{
Contract.Requires(headerText != null && headerText.Length > 0);
int index = -1;
foreach (var header in headerText)
{
index = CsvReaderUtilities.GetHeaderIndexByString(headers, header);
if (index != -1)
{
break;
}
}
return index;
}
///
/// Finds the index of a required header item, or throws an exception in case none can be found.
///
/// Name of the file being read (for error messages).
/// All headers in the csv file.
/// The required headers, mapping to a particular data item.
/// An integer greater the 0, being the index of the header in the csv file.
/// When no match from
/// could be found in .
private static int GetRequiredIndex(string fileName, string[] headers, params string[] headerText)
{
Contract.Ensures(Contract.Result() > 0);
var index = GetIndex(headers, headerText);
if (index < 0)
{
string csvHeaderFieldError = LocalizationManager.GetTranslatedText(typeof(CharacteristicPointsImporter),
"csvHeaderFieldError");
throw new CharacteristicPointsImporterException(String.Format("{0} : {1} {2}", fileName, csvHeaderFieldError, String.Join(" / ", headerText)));
}
return index;
}
private SurfaceLine2 GetSurfacelineForDataRow(IEnumerable surfaceLines, CsvReader csv, CharacteristicPointsIndexes indexes)
{
Contract.Ensures(Contract.Result() != null);
SurfaceLine2 surfaceLine = surfaceLines.FirstOrDefault(sl => sl.Name == csv[indexes.SurfaceLineId]);
if (surfaceLine == null)
{
surfaceLine = new SurfaceLine2
{
Name = csv[indexes.SurfaceLineId]
};
ErrorMessages.Add(new LogMessage(LogMessageType.Error, FileName, String.Format(this.Translate("SurfaceLineNotFoundError"), surfaceLine.Name)));
}
return surfaceLine;
}
///
/// Use the factory to create a new
///
///
///
///
private SurfaceLine2 GetSurfaceLine(IDataFactory factory, string name)
{
SurfaceLine2 surfaceLine = null;
var geometry = factory.GetExistingObject(name, null);
if (geometry != null)
{
surfaceLine = factory.GetObject(name, null);
// To prevent a full synch when GeometryMustContainPoint is already false
if (surfaceLine.CharacteristicPoints.GeometryMustContainPoint)
{
surfaceLine.CharacteristicPoints.GeometryMustContainPoint = false;
}
surfaceLine.Name = name;
surfaceLine.Geometry = geometry;
}
return surfaceLine;
}
private bool AddCharacteristicPointToSurfaceLine(SurfaceLine2 surfaceLine, XYZ xyzIndexes,
CsvReader csv, CharacteristicPointType type)
{
double x = Convert.ToDouble(csv[xyzIndexes.X]);
double y = Convert.ToDouble(csv[xyzIndexes.Y]);
double z = Convert.ToDouble(csv[xyzIndexes.Z]);
if (x == -1 && y == -1 && z == -1)
{
return true; //already exist or error situation ?????
}
var globalPoint = new GeometryPoint(x, y, z);
var localPoint = surfaceLine.Geometry.GetLocalPoint(globalPoint);
var addedPoint = localPoint ?? globalPoint;
if (surfaceLine.CharacteristicPoints.GeometryMustContainPoint)
{
GeometryPoint geometryPoint = surfaceLine.Geometry.GetPointAt(addedPoint.X, addedPoint.Y, addedPoint.Z);
if (geometryPoint == null)
{
string charPointNotFoundInSurfaceError = LocalizationManager.GetTranslatedText(typeof(CharacteristicPointsImporter), "charPointNotFoundInSurfaceError");
string logmessage = String.Format("{0} : {1} {2}", surfaceLine.Name, charPointNotFoundInSurfaceError, type);
ErrorMessages.Add(new LogMessage(LogMessageType.Warning, FileName, logmessage));
return false;
}
surfaceLine.EnsurePointOfType(addedPoint.X, addedPoint.Y, addedPoint.Z, type);
}
else
{
surfaceLine.AddCharacteristicPoint(addedPoint, type);
}
return true;
}
}
}