Desktop/HStation.Xhs.Hydro.Test.Core/Form3.Designer.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Desktop/HStation.Xhs.Hydro.Test.Core/Form3.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Hydro/Yw.EPAnet.Calcu.Core/03-calcu/NetworkPathAnalyseExtensions.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Hydro/Yw.EPAnet.Calcu.Core/04-Inp/InpInteropHelper.cs | ●●●●● 补丁 | 查看 | 原始文档 | 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];