using IStation.Epanet.Analysis; using IStation.Epanet.Enums; using System.Text; using Yw; namespace IStation.Epanet { /// /// 水力模型调度 /// public class ScheduleHelper { /// /// 延时水利分析 /// /// inp文件 /// 输出数据 /// public static string Analysis(string filePath, out Output output) { output = new Output(); if (!File.Exists(filePath)) { return $"文件不存在!"; } var err = EpanetMethods.ENopen(filePath, "", ""); if (err != 0) { return $"ENopen:{new EnException(err).Message}!"; } int tstep = 0; EpanetMethods.ENopenH(); EpanetMethods.ENinitH(0); do { const int MAXID = 31; var idBuild = new StringBuilder(MAXID); var jsonBuild = new StringBuilder(); EpanetMethods.ENrunH(out int t); EpanetMethods.ENgetcount(CountType.Node, out int nodeCount); EpanetMethods.ENgetcount(CountType.Link, out int linkCount); for (int i = 1; i <= nodeCount; i++) { if (EpanetMethods.ENgetnodeid(i, idBuild) != 0) continue; jsonBuild.Clear(); jsonBuild.Append("{"); foreach (NodeValue f in Enum.GetValues(typeof(NodeValue))) { EpanetMethods.ENgetnodevalue(i, f, out float v); jsonBuild.Append($"\"{f}\":\"{v}\","); } jsonBuild.Remove(jsonBuild.Length - 1, 1); jsonBuild.Append("}"); EpanetMethods.ENgetnodetype(i, out NodeType type); var outNode = JsonHelper.Json2Object(jsonBuild.ToString()); outNode.NodeType = type; outNode.ID = idBuild.ToString(); outNode.Time = TimeSpan.FromSeconds(t); output.Nodes.Add(outNode); } for (int i = 1; i <= linkCount; i++) { if (EpanetMethods.ENgetlinkid(i, idBuild) != 0) continue; jsonBuild.Clear(); jsonBuild.Append("{"); foreach (LinkValue f in Enum.GetValues(typeof(LinkValue))) { EpanetMethods.ENgetlinkvalue(i, f, out float v); jsonBuild.Append($"\"{f}\":\"{v}\","); } jsonBuild.Remove(jsonBuild.Length - 1, 1); jsonBuild.Append("}"); EpanetMethods.ENgetlinktype(i, out LinkType type); var outLink = JsonHelper.Json2Object(jsonBuild.ToString()); outLink.LinkType = type; outLink.ID = idBuild.ToString(); outLink.Time = TimeSpan.FromSeconds(t); output.Links.Add(outLink); } EpanetMethods.ENnextH(out tstep); } while (tstep > 0); EpanetMethods.ENcloseH(); return string.Empty; } /// /// 单时刻水利分析 /// /// inp文件 /// 时刻 /// 输出数据 /// public static string Analysis(string filePath, TimeSpan timeSpan, out Output output) { output = new Output(); if (!File.Exists(filePath)) { return $"文件不存在!"; } var err = EpanetMethods.ENopen(filePath, "", ""); if (err != 0) { return $"ENopen:{new EnException(err).Message}!"; } int tstep = 0; EpanetMethods.ENopenH(); EpanetMethods.ENinitH(0); do { const int MAXID = 31; var idBuild = new StringBuilder(MAXID); var jsonBuild = new StringBuilder(); EpanetMethods.ENrunH(out int t); if (t == timeSpan.TotalSeconds) { EpanetMethods.ENgetcount(CountType.Node, out int nodeCount); EpanetMethods.ENgetcount(CountType.Link, out int linkCount); for (int i = 1; i <= nodeCount; i++) { if (EpanetMethods.ENgetnodeid(i, idBuild) != 0) continue; jsonBuild.Clear(); jsonBuild.Append("{"); foreach (NodeValue f in Enum.GetValues(typeof(NodeValue))) { EpanetMethods.ENgetnodevalue(i, f, out float v); jsonBuild.Append($"\"{f}\":\"{v}\","); } jsonBuild.Remove(jsonBuild.Length - 1, 1); jsonBuild.Append("}"); EpanetMethods.ENgetnodetype(i, out NodeType type); var outNode = JsonHelper.Json2Object(jsonBuild.ToString()); outNode.NodeType = type; outNode.ID = idBuild.ToString(); outNode.Time = TimeSpan.FromSeconds(t); output.Nodes.Add(outNode); } for (int i = 1; i <= linkCount; i++) { if (EpanetMethods.ENgetlinkid(i, idBuild) != 0) continue; jsonBuild.Clear(); jsonBuild.Append("{"); foreach (LinkValue f in Enum.GetValues(typeof(LinkValue))) { EpanetMethods.ENgetlinkvalue(i, f, out float v); jsonBuild.Append($"\"{f}\":\"{v}\","); } jsonBuild.Remove(jsonBuild.Length - 1, 1); jsonBuild.Append("}"); EpanetMethods.ENgetlinktype(i, out LinkType type); var outLink = JsonHelper.Json2Object(jsonBuild.ToString()); outLink.LinkType = type; outLink.ID = idBuild.ToString(); outLink.Time = TimeSpan.FromSeconds(t); output.Links.Add(outLink); } } EpanetMethods.ENnextH(out tstep); } while (tstep > 0); EpanetMethods.ENcloseH(); return string.Empty; } /// /// 单时刻水利分析 /// /// inp文件 /// 时刻 /// 输入数据 /// 输出数据 /// public static string Analysis(string filePath, TimeSpan timeSpan, Input input, out Output output) { output = new Output(); if (!File.Exists(filePath)) { return $"文件不存在!"; } var err = EpanetMethods.ENopen(filePath, "", ""); if (err != 0) { return $"ENopen:{new EnException(err).Message}!"; } const int MAXID = 31; var idBuild = new StringBuilder(MAXID); var jsonBuild = new StringBuilder(); EpanetMethods.ENgetcount(CountType.Node, out int nodeCount); EpanetMethods.ENgetcount(CountType.Link, out int linkCount); EpanetMethods.ENopenH(); EpanetMethods.ENinitH(0); if (input.Links != null && input.Links.Any()) { foreach (var link in input.Links) { var i = link.Index; EpanetMethods.ENsetlinkvalue(i, LinkValue.Status, link.InitStatus); EpanetMethods.ENsetlinkvalue(i, LinkValue.Setting, link.InitSetting); } } EpanetMethods.ENsolveH(); for (int i = 1; i <= nodeCount; i++) { if (EpanetMethods.ENgetnodeid(i, idBuild) != 0) continue; jsonBuild.Clear(); jsonBuild.Append("{"); foreach (NodeValue f in Enum.GetValues(typeof(NodeValue))) { EpanetMethods.ENgetnodevalue(i, f, out float v); jsonBuild.Append($"\"{f}\":\"{v}\","); } jsonBuild.Remove(jsonBuild.Length - 1, 1); jsonBuild.Append("}"); EpanetMethods.ENgetnodetype(i, out NodeType type); var outNode = JsonHelper.Json2Object(jsonBuild.ToString()); outNode.NodeType = type; outNode.Index = i; outNode.ID = idBuild.ToString(); output.Nodes.Add(outNode); } for (int i = 1; i <= linkCount; i++) { if (EpanetMethods.ENgetlinkid(i, idBuild) != 0) continue; jsonBuild.Clear(); jsonBuild.Append("{"); foreach (LinkValue f in Enum.GetValues(typeof(LinkValue))) { EpanetMethods.ENgetlinkvalue(i, f, out float v); jsonBuild.Append($"\"{f}\":\"{v}\","); } jsonBuild.Remove(jsonBuild.Length - 1, 1); jsonBuild.Append("}"); EpanetMethods.ENgetlinktype(i, out LinkType type); var outLink = JsonHelper.Json2Object(jsonBuild.ToString()); outLink.LinkType = type; outLink.Index = i; outLink.ID = idBuild.ToString(); output.Links.Add(outLink); } return string.Empty; } /// /// 单时刻水利分析 /// /// inp文件 /// 时刻 /// 输入数据 /// 输出数据 /// public static string Analysis_bak(string filePath, TimeSpan timeSpan, Input input, out Output output) { output = new Output(); if (!File.Exists(filePath)) { return $"文件不存在!"; } var err = EpanetMethods.ENopen(filePath, "", ""); if (err != 0) { return $"ENopen:{new EnException(err).Message}!"; } const int MAXID = 31; var idBuild = new StringBuilder(MAXID); var jsonBuild = new StringBuilder(); EpanetMethods.ENgetcount(CountType.Node, out int nodeCount); EpanetMethods.ENgetcount(CountType.Link, out int linkCount); if (input != null) { if (input.Links != null && input.Links.Any()) { for (int i = 1; i <= linkCount; i++) { if (EpanetMethods.ENgetlinkid(i, idBuild) != 0) continue; EpanetMethods.ENgetlinktype(i, out LinkType type); if (type != LinkType.Pump) continue; var inputLink = input.Links.Find(x => x.ID == idBuild.ToString()); if (inputLink != null) { EpanetMethods.ENgetlinkvalue(i, LinkValue.Diameter, out float diameter); EpanetMethods.ENgetlinkvalue(i, LinkValue.Length, out float length); EpanetMethods.ENgetlinkvalue(i, LinkValue.Roughness, out float roughness); EpanetMethods.ENgetlinkvalue(i, LinkValue.MinorLoss, out float minorLoss); EpanetMethods.ENgetlinkvalue(i, LinkValue.InitSetting, out float initSetting); EpanetMethods.ENgetlinkvalue(i, LinkValue.Kbulk, out float kbulk); EpanetMethods.ENgetlinkvalue(i, LinkValue.Kwall, out float kwall); inputLink.Index = i; inputLink.Diameter = diameter; inputLink.Length = length; inputLink.Roughness = roughness; inputLink.MinorLoss = minorLoss; //inputLink.InitStatus = rhs.InitStatus; inputLink.InitSetting = inputLink.InitSetting; inputLink.Kbulk = kbulk; inputLink.Kwall = kwall; } } foreach (var link in input.Links) { var i = link.Index; EpanetMethods.ENsetlinkvalue(i, LinkValue.Diameter, link.Diameter); EpanetMethods.ENsetlinkvalue(i, LinkValue.Length, link.Length); EpanetMethods.ENsetlinkvalue(i, LinkValue.Roughness, link.Roughness); EpanetMethods.ENsetlinkvalue(i, LinkValue.MinorLoss, link.MinorLoss); EpanetMethods.ENsetlinkvalue(i, LinkValue.InitStatus, link.InitStatus); EpanetMethods.ENsetlinkvalue(i, LinkValue.InitSetting, 0); EpanetMethods.ENsetlinkvalue(i, LinkValue.Kbulk, link.Kbulk); EpanetMethods.ENsetlinkvalue(i, LinkValue.Kwall, link.Kwall); } } if (input.Nodes != null && input.Nodes.Any()) { for (int i = 1; i <= nodeCount; i++) { if (EpanetMethods.ENgetnodeid(i, idBuild) != 0) continue; var id = idBuild.ToString(); var inputNode = input.Nodes.Find(x => x.ID == id); if (inputNode != null) { EpanetMethods.ENgetnodevalue(i, NodeValue.Elevation, out float elevation); EpanetMethods.ENgetnodevalue(i, NodeValue.Pattern, out float pattern); EpanetMethods.ENgetnodevalue(i, NodeValue.Emitter, out float emitter); inputNode.Index = i; inputNode.Elevation = elevation; inputNode.Pattern = pattern; inputNode.Emitter = emitter; } } foreach (var node in input.Nodes) { var i = node.Index; EpanetMethods.ENsetnodevalue(i, NodeValue.Elevation, node.Elevation); EpanetMethods.ENsetnodevalue(i, NodeValue.BaseDemand, node.BaseDemand); EpanetMethods.ENsetnodevalue(i, NodeValue.Pattern, node.Pattern); EpanetMethods.ENsetnodevalue(i, NodeValue.Emitter, node.Emitter); } } } int tstep = 0; EpanetMethods.ENopenH(); EpanetMethods.ENinitH(0); do { /* EpanetMethods.ENsetlinkvalue(177, LinkValue.Status, 0); EpanetMethods.ENsetlinkvalue(177, LinkValue.Setting, 0); */ EpanetMethods.ENrunH(out int t); //泵计算需要在延时循环内 /*EpanetMethods.ENsetlinkvalue(177, LinkValue.Status, 0); EpanetMethods.ENsetlinkvalue(177, LinkValue.Setting, 0); */ if (input.Links != null && input.Links.Any()) { foreach (var link in input.Links) { var i = link.Index; EpanetMethods.ENsetlinkvalue(i, LinkValue.Status, link.InitStatus); EpanetMethods.ENsetlinkvalue(i, LinkValue.Setting, link.InitSetting); } } if (t == timeSpan.TotalSeconds) { for (int i = 1; i <= nodeCount; i++) { if (EpanetMethods.ENgetnodeid(i, idBuild) != 0) continue; jsonBuild.Clear(); jsonBuild.Append("{"); foreach (NodeValue f in Enum.GetValues(typeof(NodeValue))) { EpanetMethods.ENgetnodevalue(i, f, out float v); jsonBuild.Append($"\"{f}\":\"{v}\","); } jsonBuild.Remove(jsonBuild.Length - 1, 1); jsonBuild.Append("}"); EpanetMethods.ENgetnodetype(i, out NodeType type); var outNode = JsonHelper.Json2Object(jsonBuild.ToString()); outNode.NodeType = type; outNode.ID = idBuild.ToString(); outNode.Time = TimeSpan.FromSeconds(t); output.Nodes.Add(outNode); } for (int i = 1; i <= linkCount; i++) { if (EpanetMethods.ENgetlinkid(i, idBuild) != 0) continue; jsonBuild.Clear(); jsonBuild.Append("{"); foreach (LinkValue f in Enum.GetValues(typeof(LinkValue))) { EpanetMethods.ENgetlinkvalue(i, f, out float v); jsonBuild.Append($"\"{f}\":\"{v}\","); } jsonBuild.Remove(jsonBuild.Length - 1, 1); jsonBuild.Append("}"); EpanetMethods.ENgetlinktype(i, out LinkType type); var outLink = JsonHelper.Json2Object(jsonBuild.ToString()); outLink.LinkType = type; outLink.ID = idBuild.ToString(); outLink.Time = TimeSpan.FromSeconds(t); output.Links.Add(outLink); } } EpanetMethods.ENnextH(out tstep); } while (tstep > 0); EpanetMethods.ENcloseH(); return string.Empty; } } }