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
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
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
 
 
    }
}