//----------------------------------------------------------------------- // // 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; } } }