qinjie
2023-12-19 15d15d24fbccb9b70a305b46b71453b2ab1a720e
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
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
#define EPA2_2  //EPA2_0
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
 
 
namespace HydraulicModel
{
 
    class EpanetBase2_2
    {
 
        const string DLLName = "epanet2.2.dll";//"epanet2.2.dll"
                                               //{ These are codes used by the DLL functions }
 
 
 
 
 
 
        #region 节点
        //        获取节点参数值
        [DllImport(DLLName)]
        public static extern int ENgetnodevalue22(int projectID, int index, int paramcode, ref float value);
        //        获取节点类型
        [DllImport(DLLName)]
        public static extern int ENgetnodetype22(int projectID, int index, ref int typecode);
        //        获取节点编号
        [DllImport(DLLName)]
        public static extern int ENgetnodeindex22(int projectID, string nodeid, ref int nodeindex);
 
        //        获取节点        id
        [DllImport(DLLName)]
        public static extern int ENgetnodeid22(int projectID, int index, StringBuilder id); 
        [DllImport(DLLName)]
        public static extern int ENgetnodecomment22(int projectID, int index, StringBuilder id);
        [DllImport(DLLName)]
        public static extern int ENaddnode22(int projectID, string id, int nodeType, ref int index);
 
        [DllImport(DLLName)]
        public static extern int  ENgetcoord22(int projectID, int index,ref double x,ref double y);
        [DllImport(DLLName)]
        public static extern int  ENsetcoord22(int projectID, int index, double x, double y);
 
        //        设置节点参数
        [DllImport(DLLName)]
        public static extern int ENsetnodevalue22(int projectID, int index, int paramcode, float value);
        #endregion
 
        #region 管段
 
        //        设置管段参数
        [DllImport(DLLName)]
        public static extern int ENsetlinkvalue22(int projectID, int index, int paramcode, float value);
 
        //        获取管段        id
        [DllImport(DLLName)]
 
        public static extern int ENgetlinkid22(int projectID, int index, StringBuilder id);
        [DllImport(DLLName)]
 
        public static extern int ENgetlinkcomment22(int projectID, int index, StringBuilder id);
        //        获取管段        id
        [DllImport(DLLName)]
 
        public static extern int ENgetlinkindex22(int projectID, string id, ref int index);
        //        获取管段节点
        [DllImport(DLLName)]
        public static extern int ENgetlinknodes22(int projectID, int index, ref int fromnode, ref int tonode);
 
 
        //        获得管段参数
        [DllImport(DLLName)]
        public static extern int ENgetlinkvalue22(int projectID, int index, int paramcode, ref float value);
 
        //        设置管段类型
        [DllImport(DLLName)]
        public static extern int ENgetlinktype22(int projectID, int index, ref int typecode);
        //        增加管线
        [DllImport(DLLName)]
        public static extern int ENaddlink22(int projectID,string id, int linkType,string fromNode,string toNode,ref int index);
 
   
        #endregion
 
        #region 模式
        //          获取模式id
        [DllImport(DLLName)]
        public static extern int ENgetpatternindex22(int projectID, string patternID, ref int patternindex);
 
 
        //        增加新的时间模式
        [DllImport(DLLName)]
        public static extern int ENaddpattern22(int projectID, string patternID);
        //        设置时间模式的值
        [DllImport(DLLName)]
        public static extern int ENsetpatternvalue22(int projectID, int index, int period, float value);
 
       
 
        public static int ENsetpatternvalue_ex(int projectID, string patternID, int period, float value)
        {
            int err = 0;
            int patternid = 0;
            err=ENgetpatternindex22(projectID, patternID, ref patternid);
            if (err > 0) return err;
            if (patternid==0)
            {
                err=ENaddpattern22(projectID, patternID);
                if (err > 0) return err;
                err = ENgetpatternindex22(projectID, patternID, ref patternid);
                if (err > 0) return err;
 
            }
            return ENsetpatternvalue22(projectID, patternid, period, value);
        }
 
 
 
        [DllImport(DLLName)]
        public static extern int ENsetpattern22(int projectID, int index, float[] values, int n);
 
        /// <summary>
        /// 加强版添加模式,如果模式名称不存在,则自动新增模式;新增完后,自定绑定节点
        /// </summary>
        /// <param name="projectID"></param>
        /// <param name="nodeID"></param>
        /// <param name="patternID"></param>
        /// <param name="values"></param>
        /// <returns></returns>
        public static int ENsetpatternvalue_ex(int projectID,string nodeID, string patternID, double[] values)
        {
            int err = 0;
            int patternid = 0;
            err = ENgetpatternindex22(projectID, patternID, ref patternid);
            
            if (err > 0 || patternid == 0)
            {
                err = ENaddpattern22(projectID, patternID);
                if (err > 0) return err;
                err = ENgetpatternindex22(projectID, patternID, ref patternid);
                if (err > 0) return err;
            }
 
            float[] v = values.Select(f => (float)f).ToArray();
            err = ENsetpattern22(projectID, patternid, v, values.Length);
            if (err > 0) return err;
            int nodeindex = 0;
            err = ENgetnodeindex22 (projectID,nodeID,ref nodeindex);
            if (err > 0) return err;
            err = ENsetnodevalue22(projectID, nodeindex, Epanet.Const_class.Const_Node.EN_PATTERN, patternid);
            return err;
        }
 
 
        [DllImport(DLLName)]
        public static extern int ENsetcurve22(int projectID, int index, float[] Xvalues, float[] Yvalues, int n);
        
        
 
 
 
        #endregion
 
        #region 计算控制
 
        //epanet        完全模拟函数
        [DllImport(DLLName)]
        public static extern int ENepanet22(int projectID, string f1, string f2, string f3, IntPtr vfunc);
        //        关闭管网文件
        [DllImport(DLLName)]
        public static extern int ENclose22(int projectID);
        //        关闭水力模拟系统,释放内存
        [DllImport(DLLName)]
        public static extern int ENcloseH22(int projectID);
        //        关闭水质模拟系统,释放内存
        [DllImport(DLLName)]
        public static extern int ENcloseQ22(int projectID);
        //        调用打开管网文件
        [DllImport(DLLName)]
        public static extern int ENopen22(int projectID, string f1, string f2, string f3);
        //        调用打开水力分析系统
        [DllImport(DLLName)]
        public static extern int ENopenH22(int projectID);
        //        调用打开水力分析系统
        [DllImport(DLLName)]
        public static extern int ENopenQ22(int projectID);
 
        /// <summary>
        /// 调用初始化水力计算系统
        /// </summary>
        /// <param name="saveflag">0-1标志,说明分析结果是否以均匀报告时段保存到EPANETH二进制输出文件。</param>
        /// <returns>返回错误编号,0表示无错误</returns>
        [DllImport(DLLName)]
        public static extern int ENinitH22(int projectID, int saveflag);
 
        //        调用运行水力计算
        [DllImport(DLLName)]
        public static extern int ENrunH22(int projectID, ref int t1);
        //        水力计算步长
        [DllImport(DLLName)]
        public static extern int ENnextH22(int projectID, ref int tstep1);
        //        调用初始化水质计算系统
        [DllImport(DLLName)]
        public static extern int ENinitQ22(int projectID, int saveflag);
        //        调用运行水力计算
        [DllImport(DLLName)]
        public static extern int ENrunQ22(int projectID, ref int t1);
        //        水力计算步长
        [DllImport(DLLName)]
        public static extern int ENnextQ22(int projectID, ref int tstep1);
 
 
 
        //        全部水力模拟
        [DllImport(DLLName)]
        public static extern int ENsolveH22(int projectID);
        //        全部水质模拟
        [DllImport(DLLName)]
        public static extern int ENsolveQ22(int projectID);
 
        //        生成报告
        [DllImport(DLLName)]
        public static extern int ENsaveH22(int projectID);
        #endregion
 
        #region 报告
        //        生成报告
        [DllImport(DLLName)]
        public static extern int ENreport22(int projectID);
        //        重置报告
        [DllImport(DLLName)]
        public static extern int ENresetreport22(int projectID);
 
        //        重置报告
        [DllImport(DLLName)]
        public static extern int ENsetreport22(int projectID, string x);
        #endregion
 
        #region 其他
 
 
        //        获取管网元件数
        [DllImport(DLLName)]
        public static extern int ENgetcount22(int projectID, int countcode, ref int count);
 
        //        获取错误信息
        [DllImport(DLLName)]
        public static extern int ENgeterror22(int projectID, int errcode, StringBuilder errmsg, int nchar);
 
        //  输出文件信息
        [DllImport(DLLName)]
        public static extern int ENsaveinpfile22(int projectID, string filename);
 
 
 
        //        获取简单控制状态的参数
        [DllImport(DLLName)]
        public static extern int ENgetcontrol22(int projectID, int cindex, ref int ctype, ref int index, ref
        float setting, ref int nindex, ref float level);
 
 
 
        //   设置选项
        [DllImport(DLLName)]
        public static extern int ENsetoption22(int projectID, int code, float v);
        //   设置选项
        [DllImport(DLLName)]
        public static extern int ENsetstatusreport22(int projectID, int code);
        //   设置选项
        [DllImport(DLLName)]
        public static extern int ENgetoption22(int projectID, int code,ref float v);
 
 
        //   设置选项
        [DllImport(DLLName)]
        public static extern int ENgettimeparam22(int projectID, int code,ref int v);
        //   设置水质类型
        [DllImport(DLLName)]
        public static extern int ENsetqualtype22(int projectID, int qualcode, string chemname,
                               string chemunits, string tracenode);
 
 
 
 
        #endregion
 
        //补充
        [DllImport(DLLName)]
        public static extern int ENsetinistatus22(int projectID, string id, string value);
 
        //补充
        [DllImport(DLLName)]
        public static extern int ENsetprojectreport22(int projectID, int value);
 
        ////补充
        //EN_Project p, int nodeIndex, int demandIndex,
         //                      double* baseDemand
        //补充
        [DllImport(DLLName)]
        public static extern int ENgetbasedemand22(int projectID, int nodeIndex, int demandIndex, out List<double> baseDemand);
        //                      
 
        //补充
        [DllImport(DLLName)]
        public static extern int ENgetdemandpattern22(int projectID, int nodeIndex, int demandIndex,
                                 out List<int> patIndex);
 
        //补充
        [DllImport(DLLName)]
        public static extern int ENgetTotalDemand22(int projectID, int p,out double value);
 
 
//int DLLEXPORT EN_getTotalDemand(EN_Project pr, int p, double *value)
        //
    }
 
 
 
 
}