using System.Linq; using Deltares.UGrid.Entities; using Deltares.UGrid.Helpers; using ProtoBuf; namespace Deltares.UGrid.Api { [ProtoContract(AsReferenceDefault = true)] public class Disposable1DMeshGeometry : DisposableMeshObject { /// /// The name of the 1D mesh (always 255 characters) /// [ProtoMember(1)] [StringBufferSize(BufferSize = 255)] public string Name; /// /// X values of the 1D mesh nodes /// [ProtoMember(2)] public double[] NodesX; /// /// Y values of the 1D mesh nodes /// [ProtoMember(3)] public double[] NodesY; /// /// Branch ids of the Nodes /// [ProtoMember(4)] public int[] BranchIDs; /// /// Branch offsets of the Nodes /// [ProtoMember(5)] public double[] BranchOffsets; /// /// Ids of the nodes /// [ProtoMember(6)] [StringBufferSize(BufferSize = 40)] public string[] NodeIds; /// /// Long names of the nodes /// [ProtoMember(7)] [StringBufferSize(BufferSize = 80)] public string[] NodeLongNames; /// /// Branch ids for each edge /// [ProtoMember(8)] public int[] EdgeBranchIds; /// /// Offset values of the center point of each edge /// [ProtoMember(9)] public double[] EdgeCenterPointOffset; /// /// X values of the center point of each edge /// [ProtoMember(10)] public double[] EdgeCenterPointX; /// /// Y values of the center point of each edge /// [ProtoMember(11)] public double[] EdgeCenterPointY; internal void InitializeWithEmptyData(Mesh1DGeometryDimensions dimensions) { Name = Name.ToFixedLengthString(GetType().GetBufferSize(nameof(Name))); NodesX = new double[dimensions.NumberOfNodes]; NodesY = new double[dimensions.NumberOfNodes]; NodeIds = new string[dimensions.NumberOfNodes].GetFixedLengthStringArray(GetType().GetBufferSize(nameof(NodeIds))); NodeLongNames = new string[dimensions.NumberOfNodes].GetFixedLengthStringArray(GetType().GetBufferSize(nameof(NodeLongNames))); BranchIDs = new int[dimensions.NumberOfNodes]; BranchOffsets = new double[dimensions.NumberOfNodes]; EdgeBranchIds = new int[dimensions.NumberOfEdges]; EdgeCenterPointOffset = new double[dimensions.NumberOfEdges]; EdgeCenterPointX = new double[dimensions.NumberOfEdges]; EdgeCenterPointY = new double[dimensions.NumberOfEdges]; } internal Mesh1DGeometryDimensions CreateMesh1DGeometryDimensions() { return new Mesh1DGeometryDimensions { name = Name.ToCharArray(), NumberOfNodes = NodesX?.Length ?? 0, NumberOfEdges = EdgeBranchIds?.Length ?? 0 }; } internal Mesh1DGeometry CreateMesh1DGeometry() { if (!IsMemoryPinned) { PinMemory(); } return new Mesh1DGeometry { startIndex = 0, NodeX = GetPinnedObjectPointer(NodesX), NodeY = GetPinnedObjectPointer(NodesY), NodeIds = GetPinnedObjectPointer(NodeIds), NodeLongNames = GetPinnedObjectPointer(NodeLongNames), BranchIds = GetPinnedObjectPointer(BranchIDs), BranchOffsets = GetPinnedObjectPointer(BranchOffsets), EdgeBranchIds = GetPinnedObjectPointer(EdgeBranchIds), EdgeCenterPointOffset = GetPinnedObjectPointer(EdgeCenterPointOffset), EdgeCenterPointX = GetPinnedObjectPointer(EdgeCenterPointX), EdgeCenterPointY = GetPinnedObjectPointer(EdgeCenterPointY) }; } } }