namespace Yw.Epanet
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public class InteropXHelper : IDisposable
|
{
|
/// <summary>
|
///
|
/// </summary>
|
public InteropXHelper()
|
{
|
_ = InteropXWrapper.EN_createproject(out IntPtr ph);
|
_ph = ph;
|
}
|
|
private IntPtr _ph;
|
|
|
#region 打开和关闭
|
|
/// <summary>
|
/// 打开
|
/// </summary>
|
/// <param name="inpFile">EPANETH输入文件名</param>
|
/// <param name="rptFile">输出报告文件名</param>
|
/// <param name="outFile">可选二进制输出文件名,如果不需要保存EPANETH的二进制输出文件,outFile可以为空字符串("")</param>
|
/// <returns>错误代码</returns>
|
public eErrorCode Open(string inpFile, string rptFile, string outFile)
|
{
|
var code = InteropXWrapper.EN_open(_ph, inpFile, rptFile, outFile);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 关闭
|
/// </summary>
|
public eErrorCode Close()
|
{
|
var code = InteropXWrapper.EN_close(_ph);
|
return (eErrorCode)code;
|
}
|
|
#endregion
|
|
#region 节点
|
|
/// <summary>
|
/// 获取节点索引
|
/// </summary>
|
public eErrorCode GetNodeIndex(string id, out int index)
|
{
|
index = 0;
|
var code = InteropXWrapper.EN_getnodeindex(_ph, id, ref index);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 获取节点id
|
/// </summary>
|
public eErrorCode GetNodeId(int index, out string id)
|
{
|
var sb = new StringBuilder(SizeLimits.EN_MAXID + 1);//+1 保证终止符空间
|
var code = InteropXWrapper.EN_getnodeid(_ph, index, sb, sb.Capacity);
|
id = sb.ToString();
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 获取节点类型
|
/// </summary>
|
public eErrorCode GetNodeType(int index, out eNodeType nodeType)
|
{
|
int typeCode = NodeType.EN_JUNCTION;
|
var code = InteropXWrapper.EN_getnodetype(_ph, index, ref typeCode);
|
nodeType = (eNodeType)typeCode;
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 获取节点值
|
/// </summary>
|
public eErrorCode GetNodeValue(int index, eNodeProperty property, out double value)
|
{
|
value = 0;
|
var code = InteropXWrapper.EN_getnodevalue(_ph, index, (int)property, ref value);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 设置节点值
|
/// </summary>
|
public eErrorCode SetNodeValue(int index, eNodeProperty property, double value)
|
{
|
var code = InteropXWrapper.EN_setnodevalue(_ph, index, (int)property, value);
|
return (eErrorCode)code;
|
}
|
|
#endregion
|
|
#region 管段
|
|
/// <summary>
|
/// 获取管段索引
|
/// </summary>
|
public eErrorCode GetLinkIndex(string id, out int index)
|
{
|
index = 0;
|
var code = InteropXWrapper.EN_getlinkindex(_ph, id, ref index);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 获取管段id
|
/// </summary>
|
public eErrorCode GetLinkId(int index, out string id)
|
{
|
var sb = new StringBuilder(SizeLimits.EN_MAXID + 1);
|
var code = InteropXWrapper.EN_getlinkid(_ph, index, sb, sb.Capacity);
|
id = sb.ToString();
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 获取管段类型
|
/// </summary>
|
public eErrorCode GetLinkType(int index, out eLinkType linkType)
|
{
|
int typeCode = LinkType.EN_PIPE;
|
var code = InteropXWrapper.EN_getlinktype(_ph, index, ref typeCode);
|
linkType = (eLinkType)typeCode;
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 获取管段端点节点的索引
|
/// </summary>
|
public eErrorCode GetLinkNodes(int index, out int fromNodeIndex, out int toNodeIndex)
|
{
|
fromNodeIndex = 0;
|
toNodeIndex = 0;
|
var code = InteropXWrapper.EN_getlinknodes(_ph, index, ref fromNodeIndex, ref toNodeIndex);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 获取管段属性值
|
/// </summary>
|
public eErrorCode GetLinkValue(int index, eLinkProperty linkValue, out double value)
|
{
|
value = 0;
|
var code = InteropXWrapper.EN_getlinkvalue(_ph, index, (int)linkValue, ref value);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 设置管段属性值
|
/// </summary>
|
public eErrorCode SetLinkValue(int index, eLinkProperty property, double value)
|
{
|
var code = InteropXWrapper.EN_setlinkvalue(_ph, index, (int)property, value);
|
return (eErrorCode)code;
|
}
|
|
#endregion
|
|
#region 水力
|
|
/// <summary>
|
/// 求解水力模型
|
/// </summary>
|
public eErrorCode SolveH()
|
{
|
var code = InteropXWrapper.EN_solveH(_ph);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 初始化逐步式水力求解器。
|
/// </summary>
|
public eErrorCode OpenH()
|
{
|
var code = InteropXWrapper.EN_openH(_ph);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 初始化逐步分析的水力状态
|
/// </summary>
|
public eErrorCode InitH(bool save = false)
|
{
|
var flag = save ? 1 : 0;
|
var code = InteropXWrapper.EN_initH(_ph, flag);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 计算当前时间步的水力结果。
|
/// </summary>
|
public eErrorCode RunH(out long t)
|
{
|
t = 0;
|
var code = InteropXWrapper.EN_runH(_ph, ref t);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 推进到下一个时间步
|
/// </summary>
|
public eErrorCode NextH(out long tstep)
|
{
|
tstep = 0;
|
var code = InteropXWrapper.EN_nextH(_ph, ref tstep);
|
return (eErrorCode)code;
|
}
|
|
/// <summary>
|
/// 关闭水力求解器并释放资源
|
/// </summary>
|
public eErrorCode CloseH()
|
{
|
var code = InteropXWrapper.EN_closeH(_ph);
|
return (eErrorCode)code;
|
}
|
|
#endregion
|
|
#region 数量
|
|
/// <summary>
|
/// 获取数量
|
/// </summary>
|
public eErrorCode GetCount(eCountType countType, out int count)
|
{
|
count = 0;
|
var code = InteropXWrapper.EN_getcount(_ph, (int)countType, ref count);
|
return (eErrorCode)code;
|
}
|
|
#endregion
|
|
#region 错误
|
|
/// <summary>
|
/// 获取错误信息
|
/// </summary>
|
public eErrorCode GetError(eErrorCode errorCode, out string errorMsg)
|
{
|
var sb = new StringBuilder(SizeLimits.EN_MAXMSG + 1);
|
var code = InteropXWrapper.EN_geterror(_ph, (int)errorCode, sb, sb.Capacity);
|
errorMsg = sb.ToString();
|
return (eErrorCode)code;
|
}
|
|
#endregion
|
|
/// <summary>
|
/// 释放
|
/// </summary>
|
public void Dispose()
|
{
|
_ = InteropXWrapper.EN_deleteproject(_ph);
|
}
|
|
|
}
|
}
|