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