ningshuxia
2025-04-25 e372b432b52bedf58b7d3bd80bd679ae9c3cecb3
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
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);
        }
 
 
    }
}