//-----------------------------------------------------------------------
//
// Copyright (c) 2011 Deltares. All rights reserved.
//
// B.S.T.I.M. The
// tom.the@deltares.nl
// 21-11-2011
// Create Geometry2DData object from geometry2D file
//-----------------------------------------------------------------------
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using Deltares.Dam.Data.Assemblers;
using Deltares.Geometry;
using Deltares.Geotechnics;
using Deltares.Geotechnics.SurfaceLines;
namespace Deltares.Dam.Data
{
using System;
using System.Text;
///
/// Exception class for Geometry2DTo1DConverter
///
public class Geometry2DDataCreatorException : ApplicationException
{
public Geometry2DDataCreatorException(string message) : base(message)
{
}
}
///
/// Create Geometry2DData object from geometry2D file
///
public class Geometry2DDataCreator
{
///
/// Creates the geometry2 d data from geometry 2d.
///
/// The filename.
///
public static Geometry2DData CreateGeometry2DDataFromGeometry2D(string filename)
{
var geometry2DSectionAssembler = new DAMMStabGeometry2DSectionAssembler();
var geometry2DSectionParameters = new Geometry2DSectionParameters();
geometry2DSectionParameters.SoilGeometry2DName = System.IO.Path.GetFullPath(filename);
geometry2DSectionParameters.XCoordinateSection = 0.0; // this parameter is not used
XDocument doc = geometry2DSectionAssembler.CreateDataTransferObject(geometry2DSectionParameters);
String LXMLInput = doc.ToString();
doc.Save("Geometry2DDataInput.xml");
StringBuilder LXMLOutput = null;
var stabilityServiceAgent = new StabilityServiceAgent();
stabilityServiceAgent.CreateGeometry2DDataFromGeometry2D(LXMLInput, ref LXMLOutput);
XDocument docOut = XDocument.Parse(LXMLOutput.ToString());
docOut.Save("Geometry2DDataOutput.xml");
var geometry2DDataAssembler = new DAMMStabGeometry2DDataAssembler();
Geometry2DData geometry2DData = geometry2DDataAssembler.CreateOutputObject(docOut);
return geometry2DData;
}
///
/// Creates the geometry2 d data.
///
/// The location.
/// The soil profile probability.
/// The surface line.
/// The geometry directory.
///
public static Geometry2DData CreateGeometry2DData(Location location, SoilGeometryProbability soilProfileProbability, SurfaceLine2 surfaceLine,
String geometryDirectory)
{
string geometryFilename;
CreateGeometryFile(location, soilProfileProbability, surfaceLine, geometryDirectory, out geometryFilename);
return CreateGeometry2DDataFromGeometry2D(geometryFilename);
}
///
/// Creates the geometry file.
///
/// The location.
/// The soil profile probability.
/// The surface line.
/// The geometry directory.
/// The geometry filename.
/// Geometry file (sti) is not created.
private static void CreateGeometryFile(Location location, SoilGeometryProbability soilProfileProbability, SurfaceLine2 surfaceLine,
String geometryDirectory, out String geometryFilename)
{
const int iterationIndex = -1;
geometryFilename = StabilityCalculator.DetermineCalculationFilename(location.Name, "PL", soilProfileProbability.SoilGeometryName, iterationIndex);
geometryFilename = geometryFilename + ".sti";
geometryFilename = Path.Combine(geometryDirectory, geometryFilename);
string soilgeometry2DFilename = null;
if (soilProfileProbability.SoilGeometry2DName != null)
{
soilgeometry2DFilename = Path.GetFullPath(Path.Combine(DamProject.ProjectMap, Path.Combine(location.MapForSoilGeometries2D, soilProfileProbability.SoilGeometry2DName)));
}
var soilGeometry = new SoilGeometry(soilProfileProbability.SoilProfile, soilProfileProbability.SoilGeometry2DName);
var failureMechanismeParamatersMStab = new FailureMechanismeParamatersMStab();
PLLines plLines = new PLLines();
var plLine = new PLLine();
IList geometryPoints = location.LocalXZSurfaceLine2.Geometry.Points;
plLine.Points.Add(new PLLinePoint(geometryPoints.First().X, geometryPoints.First().Z));
plLine.Points.Add(new PLLinePoint(geometryPoints.Last().X, geometryPoints.Last().Z));
plLines.Lines[PLLineType.PL1] = plLine;
plLines.Lines[PLLineType.PL2] = plLine;
plLines.Lines[PLLineType.PL3] = plLine;
plLines.Lines[PLLineType.PL4] = plLine;
failureMechanismeParamatersMStab.Location = location;
failureMechanismeParamatersMStab.PLLines = plLines;
failureMechanismeParamatersMStab.SoilProfile = soilGeometry.SoilProfile;
failureMechanismeParamatersMStab.MStabParameters.GeometryCreationOptions.SoilGeometryType = soilGeometry.SoilGeometryType;
failureMechanismeParamatersMStab.MStabParameters.GeometryCreationOptions.SoilGeometry2DFilename = soilgeometry2DFilename;
failureMechanismeParamatersMStab.MStabParameters.GeometryCreationOptions.MaterialForDike =location.DikeEmbankmentMaterial;
failureMechanismeParamatersMStab.MStabParameters.GeometryCreationOptions.MaterialForShoulder = location.ShoulderEmbankmentMaterial;
failureMechanismeParamatersMStab.MStabParameters.GeometryCreationOptions.XOffsetSoilGeometry2DOrigin = -location.XSoilGeometry2DOrigin;
failureMechanismeParamatersMStab.MStabParameters.SoilDatabaseName = location.SoildatabaseName;
failureMechanismeParamatersMStab.MStabParameters.Model = MStabModelType.Bishop;
failureMechanismeParamatersMStab.MStabParameters.ProjectFileName = geometryFilename;
failureMechanismeParamatersMStab.SurfaceLine = location.LocalXZSurfaceLine2;
DamMStabAssembler assembler = new DamMStabAssembler();
XDocument mstabXML = assembler.CreateDataTransferObject(failureMechanismeParamatersMStab);
mstabXML.Save(geometryFilename + ".xml");
StabilityServiceAgent stabilityServiceAgent = new StabilityServiceAgent();
stabilityServiceAgent.CreateProjectFile(mstabXML.ToString());
if (!File.Exists(geometryFilename))
{
throw new DamFailureMechanismeCalculatorException("Geometry file (sti) is not created.");
}
}
}
}