1
lixiaojun
2024-09-28 562f5485ca20eccca3c8a9c3ced8475d1019df26
Hydro/Yw.EPAnet.Calcu.Core/04-Inp/InpInteropHelper.cs
@@ -1,11 +1,6 @@
using Hydro.CommonBase;
using System.Diagnostics.Metrics;
using System.Drawing;
using System.Text;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Xml.Linq;
//using Hydro.CommonBase;
namespace Yw.EPAnet
{
@@ -22,7 +17,7 @@
        {
            string tempString = "";
            var tempPath = Path.Combine(Directory.GetCurrentDirectory(), @"template\template.inp");
            if (!File.Exists(tempPath))
            {
                throw new Exception("模板文件不存在," + tempPath);
@@ -58,8 +53,8 @@
            net.Junctions.ForEach(o =>
            {
                var pTemp = o.DemandPattern;
                if (string.IsNullOrEmpty(pTemp) || pTemp == ";" || pTemp=="_") pTemp = "";
                if (string.IsNullOrEmpty(pTemp) || pTemp == ";" || pTemp == "_") pTemp = "";
                junctionStringBuilder.AppendLine($"{o.Id}\t{o.Elev}\t{o.Demand}\t{pTemp}\t;\t" + $"0\tJunction");
                coorStringBuilder.AppendLine(o.Id + "    " + o.Position.X + "    " + o.Position.Y);
@@ -77,7 +72,7 @@
                var pTemp = o.DemandPattern;
                if (string.IsNullOrEmpty(pTemp) || pTemp == ";" || pTemp == "_") pTemp = "";
                junctionStringBuilder.AppendLine($"{o.Id}\t{o.Elev}\t{o.Demand}\t{pTemp}\t;\t" + $"0\tNozzle\t{o.Coefficient}");
                emitterStringBuilder.Append(o.Id + "    " + o.Coefficient);
                emitterStringBuilder.AppendLine(o.Id + "    " + o.Coefficient);
                coorStringBuilder.AppendLine(o.Id + "    " + o.Position.X + "    " + o.Position.Y);
            });
@@ -101,8 +96,9 @@
            net.Tanks.ForEach(o =>
            {
                tankStringBuilder.AppendLine($"{o.Id}\t{o.PoolElev}\t{o.InitLevel}\t{o.MinLevel}\t{o.MaxLevel}\t{o.Diameter}\t{o.MinVol}\t{o.VolCurve}\t{o.Overflow}\t;\t");// + $"0");
                coorStringBuilder.AppendLine(o.Id + "    " + o.Position.X+"    "+o.Position.Y);
                // tankStringBuilder.AppendLine($"{o.Id}\t{o.PoolElev}\t{o.InitLevel}\t{o.MinLevel}\t{o.MaxLevel}\t{o.Diameter}\t{o.MinVol}\t{o.VolCurve}\t{o.Overflow}\t;\t");// + $"0");
                tankStringBuilder.AppendLine($"{o.Id}\t{o.PoolElev}\t{o.InitLevel}\t{o.MinLevel}\t{o.MaxLevel}\t{o.Diameter}\t{o.MinVol}\t{o.VolCurve}\t;\t");// + $"0");
                coorStringBuilder.AppendLine(o.Id + "    " + o.Position.X + "    " + o.Position.Y);
            });
            string tankString = tankStringBuilder.ToString();
@@ -113,11 +109,13 @@
            net.Pipes.ForEach(o =>
            {
                if (o.Roughness == 0) o.Roughness = 110;
                string statusString = o.LinkStatus == LinkStatus.Closed ? "CLOSED" : "";
                string statusString = o.LinkStatus == PipeStatus.Closed ? "CLOSED" : "";
                pipeStringBuilder.AppendLine($"{o.Id}\t{o.StartNode.Id}\t{o.EndNode.Id}\t{o.Length}\t{o.Diameter}\t{o.Roughness}\t{o.MinorLoss}\t{statusString}\t;\t");// + $"{p.Level}");
                if (o.LinkStatus!=LinkStatus.Open)
                if (o.LinkStatus != PipeStatus.Open)
                {
                    statusStringBuilder.AppendLine(o.Id + "\t" + statusString);
                }
            });
            string pipeString = pipeStringBuilder.ToString();
@@ -129,20 +127,20 @@
            net.Valves.ForEach(o =>
            {
                valveStringBuilder.AppendLine($"{o.Id}\t{o.StartNode.Id}\t{o.EndNode.Id}\t{o.Diameter:F4}\t{o.ValveType}\t{o.ValveSetting}\t{o.MinorLoss:F4}\t;\t");// + $"0");
                if (!string.IsNullOrEmpty(o.LinkStatus ))
                if (!string.IsNullOrEmpty(o.LinkStatus))
                    statusStringBuilder.AppendLine(o.Id + "\t" + o.LinkStatus);
            });
            string valveString = valveStringBuilder.ToString();
            StringBuilder pumpStringBuilder = new StringBuilder();
            pumpStringBuilder.AppendLine(";ID                 Node1              Node2              Diameter       Type   Setting        MinorLoss  ");
            pumpStringBuilder.AppendLine(";ID                 Node1              Node2              Parameters  ");
            net.Pumps.ForEach(o =>
            {
                pumpStringBuilder.AppendLine($"{o.Id}\t{o.StartNode.Id}\t{o.EndNode.Id}\tHead\t{o.CurveQH}\tSPEED\t{o.SpeedRatio}\t;\t");// + $"0");
                if (!string.IsNullOrEmpty(o.LinkStatus))
                    statusStringBuilder.AppendLine(o.Id+"\t"+ o.LinkStatus);
                    statusStringBuilder.AppendLine(o.Id + "\t" + o.LinkStatus);
            });
            string pumpString = pumpStringBuilder.ToString();
            StringBuilder curveStringBuilder = new StringBuilder();
@@ -182,7 +180,12 @@
            net.Curves.ForEach(o =>
            {
                curveStringBuilder.AppendLine(o.ToString());
                var curvePtList = o.CurveData?.OrderBy(x => x.X).ToList();
                foreach (var curvePt in curvePtList)
                {
                    curveStringBuilder.AppendLine($"{o.Id}  {curvePt.X} {curvePt.Y}");
                }
                //curveStringBuilder.AppendLine(o.ToString());
            });
            string curveString = curveStringBuilder.ToString();
            string coorString = coorStringBuilder.ToString();
@@ -202,14 +205,14 @@
            output = ReplaceContent(output, "STATUS", statusString);
            return output;
        }
        private static string ReplaceContent(string text, string content, string replaceString)
        {
@@ -268,7 +271,7 @@
                        string s = line.Trim('\t').Trim(' ');
                        if (s.Length == 0 || s[0] == ';') continue;
                        line = line.Replace("\t\t", "\t_\t").Replace("\t \t", "\t_\t");
                        Parts parts = new Parts(line.Split(new char[] { '\t', ' ', ';' }, StringSplitOptions.RemoveEmptyEntries));
                        InpParts parts = new InpParts(line.Split(new char[] { '\t', ' ', ';' }, StringSplitOptions.RemoveEmptyEntries));
                        switch (section)
                        {
                            case "JUNCTIONS":
@@ -370,7 +373,7 @@
                                {
                                    InpPipe p = new InpPipe();
                                    p.Id = parts[0];
                                    p.Node1 = parts[1] ;
                                    p.Node1 = parts[1];
                                    p.Node2 = parts[2];
                                    float length;
                                    if (float.TryParse(parts[3], out length))
@@ -384,7 +387,7 @@
                                    float minorLoss;
                                    if (float.TryParse(parts[6], out minorLoss))
                                        p.MinorLoss = minorLoss;
                                    p.LinkStatus = parts.Length > 7 ? LinkStatus.Closed : LinkStatus.Open;
                                    p.LinkStatus = parts.Length > 7 ? PipeStatus.Closed : PipeStatus.Open;
                                    //int level;
                                    //if (int.TryParse(parts[8], out level))
                                    //    p.Level = level;
@@ -408,7 +411,7 @@
                                    float minorLoss;
                                    if (float.TryParse(parts[6], out minorLoss))
                                        valve.MinorLoss = minorLoss;
                                    net.Valves.Add(valve);
                                }
                                break;
@@ -429,12 +432,12 @@
                }
                sr.Close();
                #region 优化方案
                int k1 = 0;
                int k2 = 0;
                var Nodes= net.GetAllNodes();
                var Nodes = net.GetAllNodes();
                var Links = net.GetAllLinks();
                Nodes.Sort((a, b) => string.Compare(a.Id, b.Id));
                points.Sort((a, b) => string.Compare(a.Id, b.Id));
@@ -457,7 +460,7 @@
                        //throw new Exception($"未找到Node[{J.Id}]的坐标");
                    }
                    J.Position=new Position2d();
                    J.Position = new Position2d();
                    J.Position.X = coor.Position.X;
                    J.Position.Y = coor.Position.Y;
@@ -488,7 +491,7 @@
                        //throw new Exception($"未找到Link[{p.Id}]的起始节点[{((IInpParser)p).Node1}]");
                    }
                    p.StartNode = J;
                    if (J.Links==null) J.Links = new List<ILink>();
                    if (J.Links == null) J.Links = new List<ILink>();
                    J.Links.Add(p);
                    k2++;
                }