namespace Yw.Epanet
|
{
|
/// <summary>
|
/// 交互拓展包裹层
|
/// </summary>
|
internal class InteropXWrapper
|
{
|
|
private const string DllName = "epanet2.dll";//需要确保为2.2版本
|
private const CharSet CHARSet = CharSet.Ansi;//String charset of epanet dll methods
|
private const CallingConvention Convention = CallingConvention.StdCall;//Epanet dll calling convention
|
private const UnmanagedType LPStr = UnmanagedType.LPStr;//String type of epanet dll
|
|
#region 项目
|
|
/// <summary>
|
/// 创建项目
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <returns>返回错误码</returns>
|
[DllImport(DllName, EntryPoint = "EN_createproject", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_createproject(out IntPtr ph);
|
|
/// <summary>
|
/// 删除当前打开的项目
|
/// </summary>
|
[DllImport(DllName, EntryPoint = "EN_deleteproject", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_deleteproject(IntPtr ph);
|
|
|
#endregion
|
|
#region 打开和关闭
|
|
/// <summary>
|
/// This function should be called immediately after EN_createproject if an EPANET-formatted input file will be used to supply network data.
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="inpFile">EPANETH输入文件名</param>
|
/// <param name="rptFile">输出报告文件名</param>
|
/// <param name="outFile">可选二进制输出文件名,如果不需要保存EPANETH的二进制输出文件,outFile可以为空字符串("")</param>
|
/// <returns>返回错误代码</returns>
|
[DllImport(DllName, EntryPoint = "EN_open", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_open(IntPtr ph, string inpFile, string rptFile, string outFile);
|
|
/// <summary>
|
/// This function clears all existing data from a project but does not delete the project, so it can be re-used with another set of network data. Use EN_deleteproject to actually delete a project from memory.
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <returns>返回错误代码</returns>
|
[DllImport(DllName, EntryPoint = "EN_close", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
|
public static extern int EN_close(IntPtr ph);
|
|
#endregion
|
|
#region 节点
|
|
/// <summary>
|
/// Gets the index of a node given its ID name
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="id">节点的 ID 字符串(如 "JUNCTION-1")</param>
|
/// <param name="index">节点索引,节点索引是从1开始的连续整数</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功,非 0 表示错误(如节点不存在)常见错误码:201:节点 ID 不存在。202:模型未正确初始化</returns>
|
[DllImport(DllName, EntryPoint = "EN_getnodeindex", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_getnodeindex(IntPtr ph, string id, ref int index);
|
|
/// <summary>
|
/// Gets the ID name of a node given its index.
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="index">节点索引,节点索引是从1开始的连续整数</param>
|
/// <param name="id">节点的 ID 字符串(如 "JUNCTION-1")</param>
|
/// <param name="maxIdLength">最大id长度</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功,非 0 表示错误(如索引越界)</returns>
|
[DllImport(DllName, EntryPoint = "EN_getnodeid", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_getnodeid(IntPtr ph, int index, StringBuilder id, int maxIdLength);
|
|
/// <summary>
|
/// Retrieves a node's type given its index
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="index">节点索引,节点索引是从1开始的连续整数</param>
|
/// <param name="typeCode">节点类型代码</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功</returns>
|
[DllImport(DllName, EntryPoint = "EN_getnodetype", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_getnodetype(IntPtr ph, int index, ref int typeCode);
|
|
/// <summary>
|
/// Retrieves a property value for a node
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="index">节点索引,节点索引是从1开始的连续整数</param>
|
/// <param name="property">参数代码</param>
|
/// <param name="value">参数值</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功</returns>
|
[DllImport(DllName, EntryPoint = "EN_getnodevalue", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_getnodevalue(IntPtr ph, int index, int property, ref double value);
|
|
/// <summary>
|
/// 设置节点属性参数值
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="index">节点索引,节点索引是从1开始的连续整数</param>
|
/// <param name="property">参数代码</param>
|
/// <param name="value">参数值</param>
|
/// <returns></returns>
|
[DllImport(DllName, EntryPoint = "EN_setnodevalue", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_setnodevalue(IntPtr ph, int index, int property, double value);
|
|
#endregion
|
|
#region 管段
|
|
/// <summary>
|
/// Gets the index of a link given its ID name
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="id">管段的 ID 字符串</param>
|
/// <param name="index">管段索引,管段索引是从1开始的连续整数</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功,非 0 表示错误(如管段不存在)常见错误码:201:管段 ID 不存在。202:模型未正确初始化</returns>
|
[DllImport(DllName, EntryPoint = "EN_getlinkindex", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_getlinkindex(IntPtr ph, string id, ref int index);
|
|
/// <summary>
|
/// Gets the ID name of a link given its index
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="index">管段索引,管段索引是从1开始的连续整数</param>
|
/// <param name="id">管段的 ID 字符串</param>
|
/// <param name="maxIdLength">最大id长度</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功,非 0 表示错误(如索引越界)</returns>
|
[DllImport(DllName, EntryPoint = "EN_getlinkid", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_getlinkid(IntPtr ph, int index, StringBuilder id, int maxIdLength);
|
|
/// <summary>
|
/// Retrieves a link's type
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="index">管段索引,管段索引是从1开始的连续整数</param>
|
/// <param name="typeCode">管段类型代码</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功</returns>
|
[DllImport(DllName, EntryPoint = "EN_getlinktype", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_getlinktype(IntPtr ph, int index, ref int typeCode);
|
|
/// <summary>
|
/// Gets the indexes of a link's start- and end-nodes
|
/// 节点和管段索引是从1开始的连续整数
|
/// 管段起始和终止节点定义在EPANETH输入文件中。没有考虑管段的实际流向
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="index">管段索引</param>
|
/// <param name="fnode">管段起始节点索引</param>
|
/// <param name="tnode">管段终止节点索引</param>
|
/// <returns>返回错误代号</returns>
|
[DllImport(DllName, EntryPoint = "EN_getlinknodes", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_getlinknodes(IntPtr ph, int index, ref int fnode, ref int tnode);
|
|
/// <summary>
|
/// Retrieves a property value for a link
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="index">管段索引,管段索引是从1开始的连续整数</param>
|
/// <param name="property">参数代码</param>
|
/// <param name="value">参数值</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功</returns>
|
[DllImport(DllName, EntryPoint = "EN_getlinkvalue", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_getlinkvalue(IntPtr ph, int index, int property, ref double value);
|
|
/// <summary>
|
/// 设置管段属性值
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="index">管段索引,管段索引是从1开始的连续整数</param>
|
/// <param name="property">参数代码</param>
|
/// <param name="value">参数值</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功</returns>
|
[DllImport(DllName, EntryPoint = "EN_setlinkvalue", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_setlinkvalue(IntPtr ph, int index, int property, double value);
|
|
|
#endregion
|
|
#region 水力
|
|
/// <summary>
|
/// Runs a complete hydraulic simulation with results for all time periods written to a temporary hydraulics file
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功</returns>
|
[DllImport(DllName, EntryPoint = "EN_solveH", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_solveH(IntPtr ph);
|
|
/// <summary>
|
/// 初始化逐步式水力求解器。
|
/// 【使用条件】仅在手动分步分析时调用(与 EN_initH/EN_runH/EN_nextH 配合使用)。
|
/// 【禁止调用】若已调用 EN_solveH 或 EN_usehydfile,不可再调用此函数。
|
/// </summary>
|
[DllImport(DllName, EntryPoint = "EN_openH", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_openH(IntPtr ph);
|
|
/// <summary>
|
/// 初始化逐步分析的水力状态。
|
/// 【使用条件】必须在 EN_openH 后调用,且每次分析仅调用一次。
|
/// 【参数】saveFlag=0 表示不保存中间结果,1 表示保存。
|
/// </summary>
|
[DllImport(DllName, EntryPoint = "EN_initH", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_initH(IntPtr ph, int saveFlag);
|
|
/// <summary>
|
/// 计算当前时间步的水力结果。
|
/// 【使用条件】必须在 EN_initH 后调用,循环中与 EN_nextH 配合。
|
/// 【输出】t 返回当前模拟时间(秒)。
|
/// </summary>
|
[DllImport(DllName, EntryPoint = "EN_runH", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_runH(IntPtr ph, ref long t);
|
|
/// <summary>
|
/// 推进到下一个时间步。
|
/// 【使用条件】必须在 EN_runH 后调用。
|
/// 【输出】tstep=0 表示分析结束,否则为下一时间步长(秒)。
|
/// </summary>
|
[DllImport(DllName, EntryPoint = "EN_nextH", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_nextH(IntPtr ph, ref long tstep);
|
|
/// <summary>
|
/// 关闭水力求解器并释放资源。
|
/// 【使用条件】仅在 EN_openH 后调用,且结束后必须调用。
|
/// 【注意】不可在 EN_solveH 或 EN_usehydfile 后调用。
|
/// </summary>
|
[DllImport(DllName, EntryPoint = "EN_closeH", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_closeH(IntPtr ph);
|
|
|
|
#endregion
|
|
#region 数量
|
|
/// <summary>
|
/// Retrieves the number of objects of a given type in a project
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="countCode">组件类型代码</param>
|
/// <param name="count">数量</param>
|
/// <returns>返回错误代码,整数类型,0 表示成功</returns>
|
[DllImport(DllName, EntryPoint = "EN_getcount", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_getcount(IntPtr ph, int countCode, ref int count);
|
|
#endregion
|
|
#region 错误
|
|
/// <summary>
|
/// Returns the text of an error message generated by an error code
|
/// </summary>
|
/// <param name="ph">句柄</param>
|
/// <param name="errcode">错误或者警告代码</param>
|
/// <param name="errmsg">对应于errcode的错误或者警告信息的文本</param>
|
/// <param name="maxLen">errmsg可以拥有的最大字符数</param>
|
/// <returns></returns>
|
[DllImport(DllName, EntryPoint = "EN_geterror", CharSet = CHARSet, CallingConvention = Convention)]
|
public static extern int EN_geterror(IntPtr ph, int errcode, StringBuilder errmsg, int maxLen);
|
|
#endregion
|
|
|
}
|
}
|