lixiaojun
2025-03-12 a48cd440205c38e14e5f270168c1ed9f2ba1ab79
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
namespace Yw.Epanet
{
    /// <summary>
    /// 交互封装
    /// 定义程序集导入方法
    /// </summary>
    internal class InteropWrapper
    {
        //需要确保为2.2版本
        private const string DllName = "epanet2.dll";
        //String charset of epanet dll methods
        private const CharSet CHARSet = CharSet.Ansi;
        //Epanet dll calling convention
        private const CallingConvention Convention = CallingConvention.StdCall;
        //String type of epanet dll 
        private const UnmanagedType LPStr = UnmanagedType.LPStr;
 
        #region 打开与关闭
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENopen 函数(打开工具箱,为了分析特定配水系统)
        /// 在使用任何其它工具箱函数以前,必须调用ENopen (除了ENepanet)
        /// </summary>
        /// <param name="inpFile">EPANETH输入文件名</param>
        /// <param name="rptFile">输出报告文件名</param>
        /// <param name="outFile">可选二进制输出文件名,如果不需要保存EPANETH的二进制输出文件,outFile可以为空字符串("")</param>
        /// <returns>返回错误代码</returns>
        [DllImport(DllName, EntryPoint = "ENopen", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENopen(string inpFile, string rptFile, string outFile);
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENclose 函数,用于关闭模型
        /// 关闭工具箱系统(包括所有正在处理的文件)
        /// 当完成所有处理之后,必须调用Enclose,即使遇到错误状况
        /// </summary>
        /// <returns>返回错误代码</returns>
        [DllImport(DllName, EntryPoint = "ENclose", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENclose();
 
        #endregion
 
        #region 节点
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENgetnodeindex 函数,用于检索具有指定ID的节点索引
        /// </summary>
        /// <param name="id">节点的 ID 字符串(如 "JUNCTION-1")</param>
        /// <param name="index">节点索引,节点索引是从1开始的连续整数</param>
        /// <returns>返回错误代码,整数类型,0 表示成功,非 0 表示错误(如节点不存在)常见错误码:201:节点 ID 不存在。202:模型未正确初始化</returns>
        [DllImport(DllName, EntryPoint = "ENgetnodeindex", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgetnodeindex(string id, ref int index);
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENgetnodeid 函数,用于检索指定节点索引的节点ID标签
        /// </summary>
        /// <param name="index">节点索引,节点索引是从1开始的连续整数</param>
        /// <param name="id">节点的 ID 字符串(如 "JUNCTION-1")</param>
        /// <returns>返回错误代码,整数类型,0 表示成功,非 0 表示错误(如索引越界)</returns>
        [DllImport(DllName, EntryPoint = "ENgetnodeid", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgetnodeid(int index, ref StringBuilder id);
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENgetnodetype 函数,用于检索指定节点索引的节点类型代码
        /// </summary>
        /// <param name="index">节点索引,节点索引是从1开始的连续整数</param>
        /// <param name="typeCode">节点类型代码</param>
        /// <returns>返回错误代码,整数类型,0 表示成功</returns>
        [DllImport(DllName, EntryPoint = "ENgetnodetype", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgetnodetype(int index, ref int typeCode);
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENgetnodevalue 函数,用于获取节点参数值
        /// </summary>
        /// <param name="index">节点索引,节点索引是从1开始的连续整数</param>
        /// <param name="paramCode">参数代码</param>
        /// <param name="value">参数值</param>
        /// <returns>返回错误代码,整数类型,0 表示成功</returns>
        [DllImport(DllName, EntryPoint = "ENgetnodevalue", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgetnodevalue(int index, int paramCode, ref float value);
 
        #endregion
 
        #region 管段
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENgetlinkindex 函数,用于检索具有指定ID的管段索引
        /// </summary>
        /// <param name="id">管段的 ID 字符串</param>
        /// <param name="index">管段索引,管段索引是从1开始的连续整数</param>
        /// <returns>返回错误代码,整数类型,0 表示成功,非 0 表示错误(如管段不存在)常见错误码:201:管段 ID 不存在。202:模型未正确初始化</returns>
        [DllImport(DllName, EntryPoint = "ENgetlinkindex", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgetlinkindex(string id, ref int index);
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENgetlinkid 函数,用于检索指定管段索引的管段ID标签
        /// </summary>
        /// <param name="index">管段索引,管段索引是从1开始的连续整数</param>
        /// <param name="id">管段的 ID 字符串</param>
        /// <returns>返回错误代码,整数类型,0 表示成功,非 0 表示错误(如索引越界)</returns>
        [DllImport(DllName, EntryPoint = "ENgetlinkid", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgetlinkid(int index, ref StringBuilder id);
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENgetlinktype 函数,用于检索指定管段索引的管段类型代码
        /// </summary>
        /// <param name="index">管段索引,管段索引是从1开始的连续整数</param>
        /// <param name="typeCode">管段类型代码</param>
        /// <returns>返回错误代码,整数类型,0 表示成功</returns>
        [DllImport(DllName, EntryPoint = "ENgetlinktype", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgetlinktype(int index, ref int typeCode);
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENgetlinknodes 函数,用于检索指定管段端点节点的索引
        /// 节点和管段索引是从1开始的连续整数
        /// 管段起始和终止节点定义在EPANETH输入文件中。没有考虑管段的实际流向
        /// </summary>
        /// <param name="index">管段索引</param>
        /// <param name="fnode">管段起始节点索引</param>
        /// <param name="tnode">管段终止节点索引</param>
        /// <returns>返回错误代号</returns>
        [DllImport(DllName, EntryPoint = "ENgetlinknodes", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgetlinknodes(int index, ref int fnode, ref int tnode);
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENgetlinkvalue 函数,用于获取管段参数值
        /// </summary>
        /// <param name="index">管段索引,管段索引是从1开始的连续整数</param>
        /// <param name="paramCode">参数代码</param>
        /// <param name="value">参数值</param>
        /// <returns>返回错误代码,整数类型,0 表示成功</returns>
        [DllImport(DllName, EntryPoint = "ENgetlinkvalue", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgetlinkvalue(int index, int paramCode, ref float value);
 
        #endregion
 
        #region 水力
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENsolveH 函数,用于求解水力模型
        /// </summary>
        /// <returns>返回错误代码,整数类型,0 表示成功</returns>
        [DllImport(DllName, EntryPoint = "ENsolveH", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENsolveH();
 
        #endregion
 
        #region 数量
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENsolveH 函数,用于检索指定类型的管网组件数量
        /// </summary>
        /// <param name="countCode">组件类型代码</param>
        /// <param name="count">数量</param>
        /// <returns>返回错误代码,整数类型,0 表示成功</returns>
        [DllImport(DllName, EntryPoint = "ENgetcount", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgetcount(int countCode, ref int count);
 
        #endregion
 
        #region 错误
 
        /// <summary>
        /// 引入 epanet2.dll 中的 ENsolveH 函数,用于检索与特定错误或者警告代码相关的信息文本
        /// </summary>
        /// <param name="errcode">错误或者警告代码</param>
        /// <param name="errmsg">对应于errcode的错误或者警告信息的文本</param>
        /// <param name="maxLen">errmsg可以拥有的最大字符数</param>
        /// <returns></returns>
        [DllImport(DllName, EntryPoint = "ENgeterror", CharSet = CHARSet, CallingConvention = Convention)]
        public static extern int ENgeterror(int errcode, ref StringBuilder errmsg, int maxLen);
 
        #endregion
 
 
 
 
    }
}