duheng
2024-11-27 01d504cdbc69d1ea3c98e49e820ab9d94255ede8
Merge branch 'master' of http://47.103.154.90:83/r/HStation/XHS.V1.0
已修改4个文件
245 ■■■■ 文件已修改
Desktop/HStation.Xhs.Hydro.Test.Core/Form3.Designer.cs 51 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Desktop/HStation.Xhs.Hydro.Test.Core/Form3.cs 145 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkPathAnalyseExtensions.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Hydro/Yw.EPAnet.Calcu.Core/04-Inp/InpInteropHelper.cs 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Desktop/HStation.Xhs.Hydro.Test.Core/Form3.Designer.cs
@@ -36,6 +36,9 @@
            toolStripSeparator = new System.Windows.Forms.ToolStripSeparator();
            退出XToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            工具TToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            简单计算ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            局部损失计算ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
            下游路径分析ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            沿程纵断面分析ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            帮助HToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
@@ -44,6 +47,7 @@
            搜索SToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator();
            关于AToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
            propertyGrid1 = new System.Windows.Forms.PropertyGrid();
            menuStrip1.SuspendLayout();
            SuspendLayout();
            // 
@@ -56,7 +60,7 @@
            map.MapCenter = (Yw.WinFrmUI.Q3d.PointF3D)resources.GetObject("map.MapCenter");
            map.mapOption = (Yw.WinFrmUI.Q3d.MapDimensions)resources.GetObject("map.mapOption");
            map.Name = "map";
            map.Size = new System.Drawing.Size(800, 425);
            map.Size = new System.Drawing.Size(927, 528);
            map.TabIndex = 0;
            map.zoom = 0.1F;
            // 
@@ -65,7 +69,7 @@
            menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { 文件FToolStripMenuItem, 工具TToolStripMenuItem, 帮助HToolStripMenuItem });
            menuStrip1.Location = new System.Drawing.Point(0, 0);
            menuStrip1.Name = "menuStrip1";
            menuStrip1.Size = new System.Drawing.Size(800, 25);
            menuStrip1.Size = new System.Drawing.Size(927, 25);
            menuStrip1.TabIndex = 1;
            menuStrip1.Text = "menuStrip1";
            // 
@@ -82,28 +86,47 @@
            打开OToolStripMenuItem.ImageTransparentColor = System.Drawing.Color.Magenta;
            打开OToolStripMenuItem.Name = "打开OToolStripMenuItem";
            打开OToolStripMenuItem.ShortcutKeys = System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.O;
            打开OToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
            打开OToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
            打开OToolStripMenuItem.Text = "打开(&O)";
            打开OToolStripMenuItem.Click += 打开OToolStripMenuItem_Click;
            // 
            // toolStripSeparator
            // 
            toolStripSeparator.Name = "toolStripSeparator";
            toolStripSeparator.Size = new System.Drawing.Size(177, 6);
            toolStripSeparator.Size = new System.Drawing.Size(162, 6);
            // 
            // 退出XToolStripMenuItem
            // 
            退出XToolStripMenuItem.Name = "退出XToolStripMenuItem";
            退出XToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
            退出XToolStripMenuItem.Size = new System.Drawing.Size(165, 22);
            退出XToolStripMenuItem.Text = "退出(&X)";
            退出XToolStripMenuItem.Click += 退出XToolStripMenuItem_Click;
            // 
            // 工具TToolStripMenuItem
            // 
            工具TToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 下游路径分析ToolStripMenuItem, 沿程纵断面分析ToolStripMenuItem });
            工具TToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { 简单计算ToolStripMenuItem, 局部损失计算ToolStripMenuItem, toolStripSeparator1, 下游路径分析ToolStripMenuItem, 沿程纵断面分析ToolStripMenuItem });
            工具TToolStripMenuItem.Name = "工具TToolStripMenuItem";
            工具TToolStripMenuItem.Size = new System.Drawing.Size(59, 21);
            工具TToolStripMenuItem.Text = "工具(&T)";
            //
            // 简单计算ToolStripMenuItem
            //
            简单计算ToolStripMenuItem.Name = "简单计算ToolStripMenuItem";
            简单计算ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
            简单计算ToolStripMenuItem.Text = "简单计算";
            简单计算ToolStripMenuItem.Click += 简单计算ToolStripMenuItem_Click;
            //
            // 局部损失计算ToolStripMenuItem
            //
            局部损失计算ToolStripMenuItem.Name = "局部损失计算ToolStripMenuItem";
            局部损失计算ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
            局部损失计算ToolStripMenuItem.Text = "局部损失计算";
            局部损失计算ToolStripMenuItem.Click += 局部损失计算ToolStripMenuItem_Click;
            //
            // toolStripSeparator1
            //
            toolStripSeparator1.Name = "toolStripSeparator1";
            toolStripSeparator1.Size = new System.Drawing.Size(177, 6);
            // 
            // 下游路径分析ToolStripMenuItem
            // 
@@ -117,6 +140,7 @@
            沿程纵断面分析ToolStripMenuItem.Name = "沿程纵断面分析ToolStripMenuItem";
            沿程纵断面分析ToolStripMenuItem.Size = new System.Drawing.Size(180, 22);
            沿程纵断面分析ToolStripMenuItem.Text = "沿程纵断面分析";
            沿程纵断面分析ToolStripMenuItem.Click += 沿程纵断面分析ToolStripMenuItem_Click;
            // 
            // 帮助HToolStripMenuItem
            // 
@@ -154,11 +178,20 @@
            关于AToolStripMenuItem.Size = new System.Drawing.Size(125, 22);
            关于AToolStripMenuItem.Text = "关于(&A)...";
            // 
            // propertyGrid1
            //
            propertyGrid1.Dock = System.Windows.Forms.DockStyle.Right;
            propertyGrid1.Location = new System.Drawing.Point(683, 25);
            propertyGrid1.Name = "propertyGrid1";
            propertyGrid1.Size = new System.Drawing.Size(244, 528);
            propertyGrid1.TabIndex = 2;
            //
            // Form3
            // 
            AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
            AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            ClientSize = new System.Drawing.Size(800, 450);
            ClientSize = new System.Drawing.Size(927, 553);
            Controls.Add(propertyGrid1);
            Controls.Add(map);
            Controls.Add(menuStrip1);
            MainMenuStrip = menuStrip1;
@@ -188,5 +221,9 @@
        private System.Windows.Forms.ToolStripMenuItem 关于AToolStripMenuItem;
        private System.Windows.Forms.ToolStripMenuItem 下游路径分析ToolStripMenuItem;
        private System.Windows.Forms.ToolStripMenuItem 沿程纵断面分析ToolStripMenuItem;
        private System.Windows.Forms.PropertyGrid propertyGrid1;
        private System.Windows.Forms.ToolStripMenuItem 简单计算ToolStripMenuItem;
        private System.Windows.Forms.ToolStripMenuItem 局部损失计算ToolStripMenuItem;
        private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
    }
}
Desktop/HStation.Xhs.Hydro.Test.Core/Form3.cs
@@ -10,16 +10,17 @@
using Yw.WinFrmUI.Q3d;
using Yw.EPAnet;
using System.IO;
using Newtonsoft.Json;
namespace Hydro.ClientTool
{
    public partial class Form3 : Form
    {
        public NetworkViewModel _net { get; set; }
        public NetworkViewModel _viewnet { get; set; }
        public Network _network { get; set; }
        public Dictionary<string, Node> dictNodes { get; set; }
        public Dictionary<string, Link> dictLinks { get; set; }
        public Form3()
        {
            InitializeComponent();
@@ -29,15 +30,63 @@
        {
            //打开文件对话框,选择inp类型的文件
            var ofd = new OpenFileDialog();
            ofd.Filter = "inp文件|*.inp";
            ofd.Filter = "json文件|*.json|inp文件|*.inp";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                //string inptxt = File.ReadAllText(ofd.FileName);
                _network = InpInteropHelper.FromInpString(ofd.FileName);
                //如果是inp文件,调用InpInteropHelper.FromInpString方法,将inp文件转换为Network对象
                //如果是json文件,直接调用JsonConvert.DeserializeObject方法,将json文件转换为Network对象
                if (ofd.FileName.EndsWith(".inp"))
                    //_network = InpInteropHelper.FromInpString(ofd.FileName);
                    _network = InpInteropHelper.FromInpString(ofd.FileName);
                else
                {
                    string inptxt = File.ReadAllText(ofd.FileName);
                    _network = JsonConvert.DeserializeObject<Network>(inptxt);
                    //_network.GetAllNodes().ForEach(n =>
                    //{
                    //    n.Links = new List<Link>();
                    //});
                    dictNodes = _network.GetAllNodes().ToDictionary(n => n.Id);
                    _network.GetAllLinks().ForEach(l =>
                    {
                        l.StartNode = dictNodes[l.StartNode.Id];
                        l.EndNode = dictNodes[l.EndNode.Id];
                _net = ConvertNetworkToNetworkViewModel(_network);
                map.SetData(_net);
                    });
                    dictLinks = _network.GetAllLinks().ToDictionary(l => l.Id);
                    _network.GetAllLinks().ForEach(l =>
                    {
                        if (l.StartNode.Links == null) l.StartNode.Links = new List<Link>();
                        if (l.EndNode.Links == null) l.EndNode.Links = new List<Link>();
                        l.StartNode.Links.Add(l);
                        l.EndNode.Links.Add(l);
                    });
                }
                _viewnet = ConvertNetworkToNetworkViewModel(_network);
                map.SetData(_viewnet);
                map.SelectedObjectsChanged += (oo, ee) =>
                {
                    if (map.selectedObjs.Count > 1)
                    {
                        propertyGrid1.SelectedObjects = map.selectedObjs.ToArray();
                    }
                    else if (map.selectedObjs.Count == 1)
                    {
                        propertyGrid1.SelectedObject = map.selectedObjs[0];
                    }
                    else
                    {
                        propertyGrid1.SelectedObject = null;
                    }
                };
            }
@@ -59,7 +108,7 @@
                        Length = (float)pipe.Length,
                        Diameter = (float)pipe.Diameter,
                        Roughness = (float)pipe.Roughness,
                        Status = (ObjectEnum.StatusType)Enum.Parse(typeof(ObjectEnum.StatusType), pipe.LinkStatus.ToUpper()),
                        Status = pipe.LinkStatus == null ? ObjectEnum.StatusType.DEFAULT : (ObjectEnum.StatusType)Enum.Parse(typeof(ObjectEnum.StatusType), pipe.LinkStatus.ToUpper()),
                    });
                }
                else if (l is Pump)
@@ -71,7 +120,7 @@
                        Node1 = pump.StartNode.Id,
                        Node2 = pump.EndNode.Id,
                        HeadCurve = pump.CurveQH,
                        Status = (ObjectEnum.StatusType)Enum.Parse(typeof(ObjectEnum.StatusType), pump.LinkStatus.ToUpper()),
                        Status = pump.LinkStatus == null ? ObjectEnum.StatusType.DEFAULT : (ObjectEnum.StatusType)Enum.Parse(typeof(ObjectEnum.StatusType), pump.LinkStatus.ToUpper()),
                    });
                }
                else if (l is Valve)
@@ -84,7 +133,7 @@
                        Node2 = valve.EndNode.Id,
                        Diameter = (float)valve.Diameter,
                        Setting = valve.ValveSetting,
                        Status = (ObjectEnum.StatusType)Enum.Parse(typeof(ObjectEnum.StatusType), valve.LinkStatus.ToUpper()),
                        Status = valve.LinkStatus == null ? ObjectEnum.StatusType.DEFAULT : (ObjectEnum.StatusType)Enum.Parse(typeof(ObjectEnum.StatusType), valve.LinkStatus.ToUpper()),
                    });
                }
                else if (l is Exchanger)
@@ -190,7 +239,7 @@
        private void Form3_Load(object sender, EventArgs e)
        {
        }
@@ -200,6 +249,47 @@
            this.Close();
        }
        private void 简单计算ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            CalcuResult result = _network.Calcu(CalcuMode.Simple);
            //将计算结果建立node字典和link字典
            Dictionary<string, CalcuNode> dictNodes = result.NodeList.ToDictionary(n => n.Id);
            Dictionary<string, CalcuLink> dictLinks = result.LinkList.ToDictionary(l => l.Id);
            //将计算结果显示在_net中
            _viewnet.Links.ForEach(l =>
            {
                if (dictLinks.ContainsKey(l.ID))
                {
                    l.EN_FLOW = (float)dictLinks[l.ID].Flow;
                    l.EN_VELOCITY = (float)dictLinks[l.ID].Velocity;
                    l.EN_HEADLOSS = (float)dictLinks[l.ID].Headloss;
                }
            });
            _viewnet.Nodes.ForEach(n =>
            {
                if (dictNodes.ContainsKey(n.ID))
                {
                    n.EN_HEAD = (float)dictNodes[n.ID].Head;
                    n.EN_PRESSURE = (float)dictNodes[n.ID].Press;
                    n.EN_DEMAND = (float)dictNodes[n.ID].Demand;
                }
            });
        }
        private void 局部损失计算ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            var result = _network.Calcu(CalcuMode.MinorLoss);
        }
        private void 下游路径分析ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (_network == null)
@@ -207,16 +297,37 @@
                MessageBox.Show("请先打开文件");
                return;
            }
            if (map.selectedObjs.Count>0 && map.selectedObjs[0] is NodeViewModel node)
            if (map.selectedObjs.Count > 0 && map.selectedObjs[0] is NodeViewModel node)
            {
                var calcResult= _network.Calcu(CalcuMode.MinorLoss);
                var Snode=_network.GetAllNodes().FirstOrDefault(n=>n.Id== node.ID);
                var calcResult = _network.Calcu(CalcuMode.MinorLoss);
                var Snode = _network.GetAllNodes().FirstOrDefault(n => n.Id == node.ID);
                var links = _network.AnalyzeDownstreamPath(Snode, calcResult);
                map.SetSelectObj(links.Select(l=>l.Id).ToList());
                if (links == null || links.Count <= 0) return;
                map.SetSelectObj(links.Select(l => l.Id).ToList());
            }
        }
        private void 沿程纵断面分析ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (_network == null)
            {
                MessageBox.Show("请先打开文件");
                return;
            }
            if (map.selectedObjs.Count > 0 && map.selectedObjs[0] is NodeViewModel node)
            {
                var calcResult = _network.Calcu(CalcuMode.MinorLoss);
                var Snode = _network.GetAllNodes().FirstOrDefault(n => n.Id == node.ID);
                var links = _network.AnalyzeDownstreamPath(Snode, calcResult);
                if (links == null || links.Count <= 0) return;
                map.SetSelectObj(links.Select(l => l.Id).ToList());
                var result = _network.GetChartNodeByPathLinks(links, calcResult);
            }
        }
    }
}
Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkPathAnalyseExtensions.cs
@@ -169,10 +169,10 @@
            var dictNodes = calcuResult.NodeList.ToDictionary(p => p.Id);
            var visitedNodes = new HashSet<Node>();
            var nextLinks = startJunc.GetNextLinks(calcuResult.LinkList);
            if (nextLinks.Count <= 0) return nextLinks;
            if (nextLinks==null || nextLinks.Count <= 0) return nextLinks;
            var maxlink = nextLinks.OrderByDescending(o => Math.Abs(dictLinks[o.Id].Flow)).ToList()[0];
            return  network.TraversePipeNetworkALL(maxlink, visitedNodes, 1, true);
            var maxlink =  nextLinks.OrderByDescending(o => Math.Abs(dictLinks[o.Id].Flow)).ToList()[0];
            return  network.TraversePipeNetworkALL(maxlink, visitedNodes, 1, true, calcuResult);
        }
        
        /// <summary>
Hydro/Yw.EPAnet.Calcu.Core/04-Inp/InpInteropHelper.cs
@@ -446,10 +446,8 @@
                                    float minorLoss;
                                    if (float.TryParse(parts[6], out minorLoss))
                                        p.MinorLoss = minorLoss;
                                    p.LinkStatus = parts.Length > 7 ? PipeStatus.Closed : PipeStatus.Open;
                                    //int level;
                                    //if (int.TryParse(parts[8], out level))
                                    //    p.Level = level;
                                    p.LinkStatus = parts.Length > 7 ? (parts[7].ToUpper().Contains("CLOSE")? PipeStatus.Closed : PipeStatus.Open) : PipeStatus.Open;
                                    net.Pipes.Add(p);
                                }
                                break;
@@ -516,7 +514,44 @@
                                }
                                break;
                            case "PUMPS":
                                {
                                    InpPump pump = new InpPump();
                                    pump.Id = parts.ToString(0, null);
                                    // 取出Node1和Node2中的字母部分,例如“S201326593”被取出为“201326593”
                                    pump.Node1 = parts.ToString(1, null); // Regex.Replace(parts[1], "[^0-9]", "");
                                    pump.Node2 = parts.ToString(2, null);// parts.ToString(2, null); // Regex.Replace(parts[2], "[^0-9]", "");
                                    int index = 3;
                                    string label = null;
                                    while ((label = parts.ToString(index, null)) != null)
                                    {
                                        label = label.ToUpper();
                                        switch (label)
                                        {
                                            case "HEAD":
                                                pump.CurveQH = parts.ToString(index + 1, "PumpDefault");
                                                break;
                                            case "SPEED":
                                                pump.SpeedRatio = parts.ToFloat(index + 1, 0);
                                                break;
                                        }
                                        index += 2;
                                    }
                                    //pump.Diameter = parts.ToFloat(3, 0);
                                    pump.LinkStatus = "OPEN";
                                    net.Pumps.Add(pump);
                                }
                                break;
                            case "STATUS":
                                {
                                    Link link = net.GetAllLinks().Find(l => l.Id == parts.ToString(0, null));
                                    if (link != null)
                                        link.LinkStatus = parts[1];
                                }
                                break;
                            case "COORDINATES":
                                {
                                    string id = parts[0];