//-----------------------------------------------------------------------
//
// Copyright (c) 2010 Deltares. All rights reserved.
//
// B.S.T.I.M. The
// tom.the@deltares.nl
// 18-05-2010
// xml file creator for DGSMStabDam.dll
//-----------------------------------------------------------------------
using Deltares.Geotechnics.Soils;
using Deltares.Standard.IO.DtoAssembler;
namespace Deltares.Dam.Data.Assemblers
{
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Schema;
using Deltares.Geotechnics;
using Deltares.Soilbase;
using Deltares.Standard;
using Standard.Extensions;
///
///
///
public class DAMMStabGeometry2DSectionAssembler : DtoDocumentAssembler
{
#region Constant declarations
#endregion
///
/// Holds the xml element name
///
public const string XmlElementNameGeometry2DSectionInput = "Geometry2DSectionInput";
///
/// Holds the Geometry2DSectionParameters xml element and attribute names
///
public const string XmlElementGeometry2DSectionInput = "Geometry2DSectionInput";
public const string XmlAttributeSoilGeometry2DFilename = "SoilGeometry2DFilename";
public const string XmlAttributeXCoordinateSection = "XCoordinateSection";
///
///
///
public DAMMStabGeometry2DSectionAssembler() :
base(DamMStabAssembler.XmlElementName, DamMStabAssembler.XmlElementNamespace, DamMStabAssembler.XsdEmbeddedResourcePath)
{
}
public override XDocument CreateDataTransferObject(Geometry2DSectionParameters geometry2DSectionParameters)
{
var doc = base.CreateDataTransferObject(geometry2DSectionParameters);
XNamespace tns = ElementNamespace;
XNamespace tnsb = XmlElementNameGeometry2DSectionInput;
// Geometry2DSectionParameters
XElement geometry2DSectionElement = GetGeometry2DSectionParametersElement(geometry2DSectionParameters, tns);
doc.Root.Add(geometry2DSectionElement);
// Profile
var profile = geometry2DSectionParameters.SoilProfile;
if (profile != null)
{
var soilProfileAssembler = new SoilProfileAssembler();
XNamespace tnsa = soilProfileAssembler.ElementNamespace;
doc.Root.Add(new XAttribute(XNamespace.Xmlns + "tnsa", tnsa.NamespaceName));
//TODO: Remove duplicate code. The method GetProfileElement should call the SoilProfileAssembler already defined in another namespace
XElement profileElement = GetProfileElement(profile, tns, tnsa);
// XElement profileElement = soilProfileAssembler.CreateDataTransferObject(profile); //GetProfileElement(profile, tns, tnsa);
// profileElement.Name = tns.GetName(profileElement.Name.LocalName);// .SetNamespace(DamMStabAssembler.XmlElementProfile, tns.NamespaceName);
doc.Root.Add(profileElement);
}
return doc;
}
///
/// Assembles the GeometryCreationOptions element
///
///
///
///
private static XElement GetGeometry2DSectionParametersElement(Geometry2DSectionParameters geometry2DSectionParameters, XNamespace tnsb)
{
return new XElement(tnsb + XmlElementGeometry2DSectionInput,
new XAttribute(XmlAttributeSoilGeometry2DFilename, geometry2DSectionParameters.SoilGeometry2DName),
new XAttribute(XmlAttributeXCoordinateSection, geometry2DSectionParameters.XCoordinateSection)
);
}
///
///
///
///
///
///
///
private static XElement GetProfileElement(SoilProfile1D profile, XNamespace tns, XNamespace tnsa)
{
var profileElement = new XElement(tns + DamMStabAssembler.XmlElementProfile);
profileElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeName, profile.Name));
profileElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeXCoordinate, profile.X));
profileElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeYCoordinate, profile.Y));
profileElement.Add(new XAttribute(DamMStabAssembler.XmlAttributePhreaticLevel, profile.PhreaticLevel));
profileElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeHasPhreaticLevel, profile.HasPhreaticLevel));
profileElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeBottomLevel, profile.BottomLevel));
if (profile.Layers.Count > 0)
{
var layersElement = new XElement(tnsa + DamMStabAssembler.XmlElementLayers);
GetProfileLayersElement(profile, tnsa, layersElement);
profileElement.Add(layersElement);
}
// Bottom sand layer
if (profile.BottomAquiferLayer != null)
profileElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeBottomSandLayerID, profile.BottomAquiferLayer.Id));
// In-between sand layer
if (profile.InBetweenAquiferLayer != null)
profileElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeInBetweenSandLayerID, profile.InBetweenAquiferLayer.Id));
// Infiltration layer
if (profile.InfiltrationLayer != null)
profileElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeInfiltrationLayerID, profile.InfiltrationLayer.Id));
return profileElement;
}
// Assembles the layer elements for the profile
private static void GetProfileLayersElement(SoilProfile1D profile, XNamespace tnsa, XElement layersElement)
{
foreach (var layer in profile.Layers)
{
if (layer.Id == null)
layer.Id = profile.GetNewUniqueLayerId();
var layerElement = new XElement(tnsa + DamMStabAssembler.XmlElementLayer);
layersElement.Add(layerElement);
layerElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeID, String.Format("{0}", layer.Id)));
layerElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeSoilID, layer.Soil.Name));
layerElement.Add(new XAttribute(DamMStabAssembler.XmlAttributeTopLevel, layer.TopLevel));
}
}
public override Geometry2DSectionParameters CreateOutputObject(XDocument dtoDocument)
{
Geometry2DSectionParameters geometry2DSectionParameters = new Geometry2DSectionParameters();
// Get the dto
XElement dto = (from x in dtoDocument.Descendants()
where x.Name.LocalName == DAMMStabGeometry2DSectionAssembler.XmlElementGeometry2DSectionInput
select x).FirstOrDefault();
if (dto != null)
{
geometry2DSectionParameters.SoilGeometry2DName = dto.AttributeAs(DAMMStabGeometry2DSectionAssembler.XmlAttributeSoilGeometry2DFilename);
geometry2DSectionParameters.XCoordinateSection = dto.AttributeAs(DAMMStabGeometry2DSectionAssembler.XmlAttributeXCoordinateSection);
}
// Get the dto
XElement profileDto = (from x in dtoDocument.Descendants()
where x.Name.LocalName == DamMStabAssembler.XmlElementProfile
select x).FirstOrDefault();
if (profileDto != null)
{
var soilProfile = new SoilProfile1D();
soilProfile.Name = profileDto.AttributeAs(DamMStabAssembler.XmlAttributeName);
soilProfile.X = profileDto.AttributeAs(DamMStabAssembler.XmlAttributeXCoordinate);
soilProfile.Y = profileDto.AttributeAs(DamMStabAssembler.XmlAttributeYCoordinate);
soilProfile.PhreaticLevel = profileDto.AttributeAs(DamMStabAssembler.XmlAttributePhreaticLevel);
soilProfile.HasPhreaticLevel = profileDto.AttributeAs(DamMStabAssembler.XmlAttributeHasPhreaticLevel);
soilProfile.BottomLevel = profileDto.AttributeAs(DamMStabAssembler.XmlAttributeBottomLevel);
// Layers
XElement layerCollectionElement = (from element in profileDto.Descendants()
where element.Name.LocalName == DamMStabAssembler.XmlElementLayers
select element).Single();
IEnumerable layerElementCollection = from element in layerCollectionElement.Descendants()
where element.Name.LocalName == DamMStabAssembler.XmlElementLayer
select element;
foreach (XElement layerElement in layerElementCollection)
{
var soilLayer = new SoilLayer1D();
soilLayer.Id = layerElement.AttributeAs("ID");
soilLayer.Name = layerElement.AttributeAs(DamMStabAssembler.XmlAttributeSoilID);
soilLayer.TopLevel = layerElement.AttributeAs(DamMStabAssembler.XmlAttributeTopLevel);
soilProfile.Layers.Add(soilLayer);
}
geometry2DSectionParameters.SoilProfile = soilProfile;
}
return geometry2DSectionParameters;
}
}
}