using System.Text;
|
|
namespace Yw.EPAnet
|
{
|
/// <summary>
|
/// 管网计算拓展
|
/// </summary>
|
public static class NetworkCalcuExtensions
|
{
|
/// <summary>
|
/// 计算
|
/// </summary>
|
public static CalcuResult Calcu(this Network network)
|
{
|
var result = new CalcuResult();
|
|
//Null验证
|
if (network == null)
|
{
|
result.Succeed = false;
|
return result;
|
}
|
|
//获取系统临时文件目录,创建inp临时文件
|
var inpFilePath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N") + ".inp");
|
var inpString = network.ToInpString();
|
File.WriteAllText(inpFilePath, inpString);
|
|
//加载管网
|
var epanet = new EPAcore.Core.HydraulicCore(true);
|
var errOpen = epanet.open(inpFilePath, "", "");
|
if (errOpen != 0)
|
{
|
var sbmsg = new StringBuilder();
|
epanet.geterror(errOpen, sbmsg, 256);
|
result.Succeed = false;
|
result.FailedList.Add(new CalcuFailed()
|
{
|
Code = errOpen,
|
Message = $"加载管网失败,{sbmsg}"
|
});
|
return result;
|
}
|
|
//水力计算
|
var errCalcu = epanet.solveH();
|
if (errCalcu != 0)
|
{
|
var sbmsg = new StringBuilder();
|
epanet.geterror(errCalcu, sbmsg, 256);
|
result.Succeed = false;
|
result.FailedList.Add(new CalcuFailed()
|
{
|
Code = errCalcu,
|
Message = $"管网计算失败,{sbmsg}"
|
});
|
return result;
|
}
|
|
int nodeCount = 0;
|
int linkCount = 0;
|
epanet.GetCount(eCountType.Node, ref nodeCount);
|
epanet.GetCount(eCountType.Link, ref linkCount);
|
|
const int MAXID = 31;
|
|
var sb = new StringBuilder(MAXID);
|
|
for (int i = 1; i <= nodeCount; i++)
|
{
|
epanet.getnodeid(i, sb);
|
var arr = new string[] { "Press", "Head", "Demand" }; //System.Enum.GetValues(typeof(HydraulicModel.NodeValueType));
|
var arrnum = new int[] { 10, 11, 9 };
|
var resultNode = new CalcuNode()
|
{
|
Id = sb.ToString(),
|
};
|
for (var j = 0; j < arr.Length; j++)
|
{
|
float v = 0;
|
var t = (EPAcore.Core.NodeValueType)j;
|
epanet.getnodevalue(i, arrnum[j], ref v);
|
switch (arr[j])
|
{
|
case "Press":
|
resultNode.Press = v;
|
break;
|
case "Head":
|
resultNode.Head = v;
|
break;
|
case "Demand":
|
resultNode.Demand = v;
|
break;
|
}
|
}
|
result.NodeList.Add(resultNode);
|
}
|
|
for (int i = 1; i <= linkCount; i++)
|
{
|
epanet.getlinkid(i, sb);
|
//var arr = System.Enum.GetValues(typeof(HydraulicModel.LinkValueType));
|
var arr = new string[] { "Flow", "Velocity", "Headloss" }; //System.Enum.GetValues(typeof(HydraulicModel.NodeValueType));
|
var arrnum = new int[] { 8, 9, 10 };
|
var resultLink = new CalcuLink()
|
{
|
Id = sb.ToString(),
|
};
|
for (var j = 0; j < arr.Length; j++)
|
{
|
float v = 0;
|
var t = (EPAcore.Core.NodeValueType)j;
|
epanet.getnodevalue(i, arrnum[j], ref v);
|
switch (arr[j])
|
{
|
case "Flow":
|
resultLink.Flow = v;
|
break;
|
case "Velocity":
|
resultLink.Velocity = v;
|
break;
|
case "Headloss":
|
resultLink.Headloss = v;
|
break;
|
}
|
}
|
result.LinkList.Add(resultLink);
|
}
|
return result;
|
}
|
|
|
}
|
}
|