From 970022ca59c5c22cf572c458c01e0328be85a253 Mon Sep 17 00:00:00 2001 From: cloudflight <cloudflight@126.com> Date: 星期六, 08 六月 2024 12:01:03 +0800 Subject: [PATCH] Merge branch 'master' of http://47.103.154.90:83/r/Yw/Hydro.V1.1 --- Hydraulic/Hydro.MapView/MapViewNetWork2Inp.cs | 211 ++++++++++++++++++++-------------------------------- 1 files changed, 83 insertions(+), 128 deletions(-) diff --git a/Hydraulic/Hydro.MapView/MapViewNetWork2Inp.cs b/Hydraulic/Hydro.MapView/MapViewNetWork2Inp.cs index a5184e6..47d98b3 100644 --- a/Hydraulic/Hydro.MapView/MapViewNetWork2Inp.cs +++ b/Hydraulic/Hydro.MapView/MapViewNetWork2Inp.cs @@ -1,5 +1,6 @@ 锘縰sing Hydro.Core.Model; using Hydro.MapView.Common; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Drawing; @@ -13,12 +14,12 @@ using static Hydro.Core.ObjectEnum; using static Hydro.MapView.RepeaterViewModel; using static System.Math; + namespace Hydro.MapView { - partial class MapViewNetWork + public partial class MapViewNetWork { - - public bool BuildFromInp(string filePath, bool use_old=false) + public bool BuildFromInp(string filePath, bool use_old = false) { this.use_old = use_old; if (this.use_old) @@ -33,8 +34,6 @@ { Nodes = new NodeViewModelList(); Links = new LinkViewModelList(); - - string line; string section = ""; @@ -58,14 +57,17 @@ { NodeViewModel j = null; if (parts[-2] == "Meter") - j = new MeterViewModel(); + { + var m = new MeterViewModel(); + m.DlTemplateID = parts.ToString(-4, ""); + j = m; + } else if (parts[-2] == "Nozzle") { var n = new NozzleViewModel(); j = n; n.FlowCoefficient = parts.ToFloat(-4, 0); } - else j = new JunctionViewModel(); @@ -76,10 +78,11 @@ j.PatternID = parts.ToString(3, null); if (j.PatternID == "NONE") j.PatternID = null; j.Level = parts.ToInt(-1, 0); - + Nodes.Add(j); } break; + case "RESERVOIRS": { ReservoirViewModel r = new ReservoirViewModel(); @@ -92,6 +95,7 @@ Nodes.Add(r); } break; + case "TANKS": { TankViewModel tank = new TankViewModel(); @@ -109,9 +113,9 @@ Nodes.Add(tank); } break; + case "PIPES": { - if (parts[-2] == "Repeater") { RepeaterViewModel repeater = new RepeaterViewModel(); @@ -151,12 +155,9 @@ p.MinorLoss = parts.ToFloat(6, 0); p.Status = StringToStatus(parts.ToString(7, "OPEN")); - - p.Level = parts.ToInt(-1, 0); Links.Add(p); } - } break; @@ -177,6 +178,7 @@ Links.Add(valve); } break; + case "PUMPS": { PumpViewModel pump = new PumpViewModel(); @@ -196,6 +198,7 @@ case "HEAD": pump.HeadCurve = parts.ToString(index + 1, "PumpDefault"); break; + case "SPEED": pump.褰撳墠杞�� = parts.ToFloat(index + 1, 0); break; @@ -208,6 +211,7 @@ Links.Add(pump); } break; + case "CURVES": { string ID = parts.ToString(0, ""); @@ -219,6 +223,7 @@ dict_dataset[ID]._data.Add(new PointF(parts.ToFloat(1, 0), parts.ToFloat(2, 0))); } break; + case "COORDINATES": { string id = parts[0]; @@ -230,6 +235,7 @@ } } break; + case "STATUS": { LinkViewModel link = Links.Find(l => l.ID == parts.ToString(0, null)); @@ -238,16 +244,14 @@ } break; } - if (o!=null) + if (o != null) { - o.Tags =new TagList( parts.ToString(-3, null)); + o.Tags = new TagList(parts.ToString(-3, null)); } - } } sr.Close(); - if (!dict_dataset.ContainsKey("GPVDefault")) { var data = new Dataset("GPVDefault", null); @@ -257,7 +261,6 @@ new PointF(100,0), }; dict_dataset.Add("GPVDefault", data); - } if (!dict_dataset.ContainsKey("PumpDefault")) { @@ -292,9 +295,6 @@ new PointF(750f ,31.44f), new PointF(777.7777778f ,30.37f), new PointF(805.5555556f ,29.27f), - - - }; dict_dataset.Add("PumpDefault", data); } @@ -315,7 +315,6 @@ { k2++; if (k2 < points.Count) coor = points[k2]; - } if (k2 == points.Count) { @@ -325,49 +324,66 @@ J.Y = coor.Position.Y; k1++; - - - } BuildRelation(); return true; } - - } - StatusType StringToStatus(string status) - { + private StatusType StringToStatus(string status) + { switch (status) { case "CLOESD": case "0": return StatusType.CLOSED; break; + case "OPEN": case "1": return StatusType.OPEN; break; + case "ACTIVE": return StatusType.ACTIVE; break; + default: return StatusType.DEFAULT; break; } } + + /// <summary> + /// 涓嬫媺鏂囨湰妗嗚浆鎹负鏄剧ず鍐呭 + /// </summary> + /// <param name="id"></param> + /// <returns></returns> + public string ToDisplyName(string id) + { + if (string.IsNullOrEmpty(id)) + return null; + var filePath = Path.Combine(Directory.GetCurrentDirectory(), "Data\\WaterEquivalent.Json"); + List<EquivalentTemplateModel> equivalentTemplateModels = new List<EquivalentTemplateModel>(); + if (File.Exists(filePath)) + { + var json = File.ReadAllText(filePath); + if (!string.IsNullOrEmpty(json)) + { + equivalentTemplateModels = JsonConvert.DeserializeObject<List<EquivalentTemplateModel>>(json); + } + } + return equivalentTemplateModels.Where(x => x.ID == Convert.ToInt64(id)).FirstOrDefault().Name; + } + public void BuildRelation() { - - //璇诲彇鍧愭爣 int k1 = 0;//琛ㄧず绠$嚎绱㈠紩 int k2 = 0;//琛ㄧず鑺傜偣绱㈠紩 Nodes.Sort((a, b) => string.Compare(a.ID, b.ID)); - - //寤虹珛鐐圭嚎鍏崇郴閾捐〃StartNode锛屽厛灏嗙绾夸互Node1锛堣妭鐐�1鐨処D锛夋帓搴忥紝鍐嶅皢Nodes鎸塈D鎺掑簭锛屽缓绔嬩袱涓父鏍噆1銆乲2锛屾鍚戜竴娆″惊鐜紝寤虹珛閾捐〃鍏崇郴 //鏃堕棿澶嶆潅搴� O(n) @@ -383,7 +399,6 @@ { k2++; if (k2 < Nodes.Count) J = Nodes[k2]; - } if (k2 == Nodes.Count) { @@ -417,7 +432,6 @@ } if (k2 == Nodes.Count) { - k2 = k0; k1++; p.Visible = false; @@ -434,10 +448,7 @@ //while (valveNodes.Count>0) //{ - //} - - foreach (ValveNodeViewModel vn in valveNodes.ToList()) { @@ -473,8 +484,6 @@ Nodes.Remove(vn); } - - foreach (PumpNodeViewModel pn in pumpNodes.ToList()) { if (pn.Links.Count != 2) continue; @@ -483,7 +492,6 @@ LinkViewModel temp0 = pn.Links[0] as LinkViewModel; pn.Links.RemoveAt(0); pn.Links.Add(temp0); - } var junc1 = AddJunction("S__" + pn.ID, pn.Position, pn.Elev); if (pn.Links[0].StartNode.ID == pn.ID) @@ -522,7 +530,6 @@ if (dict_dataset == null) { dict_dataset = new Dictionary<string, Dataset>(); - } pumps.ForEach(p => { @@ -549,7 +556,6 @@ pump.Datasets["娴侀噺鎵▼鏇茬嚎"] = ds; } ds.pump = pump; - } if (!pump.Datasets.ContainsKey("娴侀噺鎵▼鏇茬嚎")) @@ -568,7 +574,6 @@ Hash_ID = new HashSet<string>(); Nodes.ForEach(o => Hash_ID.Add(o.ID)); Links.ForEach(o => Hash_ID.Add(o.ID)); - } public bool loadInpFile_old(string filePath) @@ -583,10 +588,9 @@ //tanks = new List<Tank>(); //meters = new List<Meter>(); - Links =new LinkViewModelList(); + Links = new LinkViewModelList(); //valves = new List<Valve>(); //repeaters = new List<Repeater>(); - string line; string section = ""; @@ -632,9 +636,9 @@ j.Level = level; Nodes.Add(j); - } break; + case "RESERVOIRS": { ReservoirViewModel r = new ReservoirViewModel(); @@ -649,6 +653,7 @@ Nodes.Add(r); } break; + case "TANKS": { TankViewModel tank = new TankViewModel(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]); @@ -708,6 +713,7 @@ Links.Add(valve); } break; + case "REPEATERS": { RepeaterViewModel repeater = new RepeaterViewModel(); @@ -736,6 +742,7 @@ Links.Add(repeater); } break; + case "COORDINATES": { string id = parts[0]; @@ -768,7 +775,6 @@ { k2++; if (k2 < points.Count) coor = points[k2]; - } if (k2 == points.Count) { @@ -778,12 +784,7 @@ J.Y = coor.Position.Y; k1++; - - - } - - //寤虹珛鐐圭嚎鍏崇郴閾捐〃StartNode锛屽厛灏嗙绾夸互Node1锛堣妭鐐�1鐨処D锛夋帓搴忥紝鍐嶅皢Nodes鎸塈D鎺掑簭锛屽缓绔嬩袱涓父鏍噆1銆乲2锛屾鍚戜竴娆″惊鐜紝寤虹珛閾捐〃鍏崇郴 //鏃堕棿澶嶆潅搴� O(n) @@ -798,7 +799,6 @@ { k1++; if (k1 < Nodes.Count) J = Nodes[k1]; - } if (k1 == Nodes.Count) { @@ -822,7 +822,7 @@ while (J.ID != p.Node2 && k1 < Nodes.Count) { k1++; - if (k1 < Nodes.Count) J =Nodes[k1]; + if (k1 < Nodes.Count) J = Nodes[k1]; } if (k1 == Nodes.Count) { @@ -832,28 +832,26 @@ if (J.MaxDiameter < p.Diameter) J.MaxDiameter = p.Diameter; J.Links.Add(p); k2++; - } - return true; } - - } + public void ClearMinorLoss() { Links.ForEach(l => l.MinorLoss = 0); } + public void CalcLinkMinorLoss() { Links.ForEach(l => l.MinorLoss = 0); - Nodes.ForEach(n => + Nodes.ForEach(n => { - var links_Down= n.ViewLinks.FindAll(l=>l.StartNode==n ?l.EN_FLOW>0:l.EN_FLOW<0); + var links_Down = n.ViewLinks.FindAll(l => l.StartNode == n ? l.EN_FLOW > 0 : l.EN_FLOW < 0); var links_Up = n.ViewLinks.FindAll(l => l.StartNode == n ? l.EN_FLOW < 0 : l.EN_FLOW > 0); /*涓や晶鍧囪繛鎺ヤ竴涓绾�*/ - if (links_Down.Count==1 && links_Up.Count==1) + if (links_Down.Count == 1 && links_Up.Count == 1) { var link_Down = links_Down[0]; var link_Up = links_Up[0]; @@ -864,12 +862,10 @@ link_Up.MinorLoss += minorLoss; } /*涓婃父绠$嚎涓�1鏍癸紝涓嬫父绠$嚎涓哄涓�*/ - if (links_Up.Count == 1 && links_Down.Count>1) + if (links_Up.Count == 1 && links_Down.Count > 1) { - var link_Up = links_Up[0]; - //璁$畻涓や釜绠$嚎鐨勫す瑙掞紝鏍规嵁澶硅璁$畻鎹熷け绯绘暟 foreach (var link_Down in links_Down) { @@ -879,15 +875,12 @@ minorLoss += GetChangeDiameterMinorLoss(link_Down, link_Up); link_Down.MinorLoss += minorLoss; } - } /*涓嬫父绠$嚎涓�1鏍癸紝涓婃父绠$嚎涓哄涓�*/ if (links_Up.Count > 1 && links_Down.Count == 1) { var link_Down = links_Down[0]; - - //璁$畻涓や釜绠$嚎鐨勫す瑙掞紝鏍规嵁澶硅璁$畻鎹熷け绯绘暟 foreach (var link_Up in links_Up) @@ -898,20 +891,16 @@ minorLoss += GetChangeDiameterMinorLoss(link_Down, link_Up); link_Up.MinorLoss += minorLoss; } - } /*涓嬫父绠$嚎涓哄涓紝涓婃父绠$嚎涓哄涓�*/ if (links_Up.Count > 1 && links_Down.Count > 1) { - - - var UpCount= links_Up.Count; + var UpCount = links_Up.Count; //璁$畻涓や釜绠$嚎鐨勫す瑙掞紝鏍规嵁澶硅璁$畻鎹熷け绯绘暟 foreach (var link_Up in links_Up) { - foreach (var link_Down in links_Down) { var angle = GetAngle(link_Down, link_Up); @@ -920,60 +909,50 @@ minorLoss += GetChangeDiameterMinorLoss(link_Down, link_Up); link_Up.MinorLoss += minorLoss / UpCount; } - } - } - - - }); } + private static float GetChangeDiameterMinorLoss(LinkViewModel link_Down, LinkViewModel link_Up) { - var Diameter_Down = link_Down.Diameter; + var Diameter_Down = link_Down.Diameter; var Diameter_Up = link_Up.Diameter; //璁$畻涓や釜绠$嚎鍙樺緞鐨勬崯澶辩郴鏁� var minorLoss = 0f; - if(Diameter_Down>=Diameter_Up)//绐佺劧鍙樼矖 + if (Diameter_Down >= Diameter_Up)//绐佺劧鍙樼矖 { - minorLoss = (float)Pow(1 - Diameter_Up/ Diameter_Down,2); + minorLoss = (float)Pow(1 - Diameter_Up / Diameter_Down, 2); } else//绐佺劧鍙樼粏 { minorLoss = 0.5f * (1 - Diameter_Down / Diameter_Up); } - + return minorLoss; } + private static double GetAngle(LinkViewModel link_Down, LinkViewModel link_Up) { - //涓や釜绠$嚎link_Down,link_Up鐨勫悜閲� - Vector3D vector_Down = new Vector3D(link_Down.EndNode.X - link_Down.StartNode.X, link_Down.EndNode.Y - link_Down.StartNode.Y, link_Down.EndNode.Elev- link_Down.StartNode.Elev); - Vector3D vector_Up=new Vector3D(link_Up.EndNode.X - link_Up.StartNode.X, link_Up.EndNode.Y - link_Up.StartNode.Y, link_Up.EndNode.Elev - link_Up.StartNode.Elev); + Vector3D vector_Down = new Vector3D(link_Down.EndNode.X - link_Down.StartNode.X, link_Down.EndNode.Y - link_Down.StartNode.Y, link_Down.EndNode.Elev - link_Down.StartNode.Elev); + Vector3D vector_Up = new Vector3D(link_Up.EndNode.X - link_Up.StartNode.X, link_Up.EndNode.Y - link_Up.StartNode.Y, link_Up.EndNode.Elev - link_Up.StartNode.Elev); //鑾峰彇涓や釜鍚戦噺vector_Down,vector_Up鐨勭┖闂村す瑙� if (vector_Down.Length == 0 || vector_Up.Length == 0) return 0; else return Vector3D.CalculateAngle(vector_Down, vector_Up); - - - - - } - + private static float GetMinorLossByAngle(double angle) { double minorLoss; - minorLoss=0.946 * Pow(Sin(Abs(angle) / 2),2)+2.05* Pow(Sin(Abs(angle) / 2),4); + minorLoss = 0.946 * Pow(Sin(Abs(angle) / 2), 2) + 2.05 * Pow(Sin(Abs(angle) / 2), 4); return (float)minorLoss; } public void BuildToInp(string filePath, string userCoorString = null, string sourcePath = null, bool isReplace = false) { - if (sourcePath == null) sourcePath = filePath; string tempString = ""; @@ -991,7 +970,6 @@ { tempString = File.ReadAllText(sourcePath); } - Dictionary<string, string> dictExchange = new Dictionary<string, string>() { {"{junctions}","{0}" }, @@ -1017,7 +995,7 @@ if (o is JunctionViewModel j) junctionStringBuilder.AppendLine(j.ToString() + $"{j.Level}\tJunction\t{o.Tags}"); else if (o is MeterViewModel m) - junctionStringBuilder.AppendLine(m.ToString() + $"{o.Level}\tMeter\t{o.Tags}"); + junctionStringBuilder.AppendLine(m.ToString() + $"{o.Level}\tMeter\t{o.Tags}\t{m.DlTemplateID}"); else if (o is NozzleViewModel no) junctionStringBuilder.AppendLine(no.ToString() + $"{o.Level}\tNozzle\t{o.Tags}\t{no.FlowCoefficient}"); }); @@ -1082,10 +1060,7 @@ }); string pumpString = pumpStringBuilder.ToString(); - StringBuilder curveStringBuilder = new StringBuilder(); - - //pumps.ForEach(o => //{ @@ -1093,22 +1068,20 @@ // curveStringBuilder.AppendLine(o.Datasets["娴侀噺鎵▼鏇茬嚎"].ToString()); //}); curveStringBuilder.AppendLine(@";ID X-Value Y-Value -;HEADLOSS: - GPVDefault 0 0 +;HEADLOSS: + GPVDefault 0 0 GPVDefault 100 0 "); if (dict_dataset != null) curveStringBuilder.AppendLine(";PUMP: "); - foreach (var kp in dict_dataset) - { - curveStringBuilder.AppendLine(kp.Value.ToString()); - } + foreach (var kp in dict_dataset) + { + curveStringBuilder.AppendLine(kp.Value.ToString()); + } string curveString = curveStringBuilder.ToString(); - StringBuilder coorStringBuilder = new StringBuilder(); if (userCoorString == null) { - coorStringBuilder.AppendLine(";Node X-Coord Y-Coord"); Nodes.ForEach(o => coorStringBuilder.AppendLine(o.ToCoorString())); } @@ -1117,36 +1090,20 @@ coorStringBuilder.Append(userCoorString); } - - string coorString = coorStringBuilder.ToString(); string output = ""; - - - - StringBuilder emitterStringBuilder = new StringBuilder(); emitterStringBuilder.AppendLine(";Junction \tCoefficient"); Nodes.ForEach(o => emitterStringBuilder.Append((o).ToEmitterString())); - - string emitterString = emitterStringBuilder.ToString(); - - - - StringBuilder statusStringBuilder = new StringBuilder(); statusStringBuilder.AppendLine(";ID \tStatus/Setting\r\n"); Links.ForEach(o => statusStringBuilder.Append(o.ToStatusString())); - - string statusString = statusStringBuilder.ToString(); - - output = tempString; @@ -1157,7 +1114,6 @@ output = replaceContent(output, "VALVES", valveString); output = replaceContent(output, "PUMPS", pumpString); output = replaceContent(output, "CURVES", curveString); - output = replaceContent(output, "COORDINATES", coorString); output = replaceContent(output, "EMITTERS", emitterString); @@ -1171,7 +1127,6 @@ string backupFileName = $"{Path.GetFileNameWithoutExtension(filePath)}_{DateTime.Now:yyyyMMddHHmmss}{Path.GetExtension(filePath)}"; string backupFilePath = Path.Combine(backupFolderPath, backupFileName); //if (File.Exists(filePath)) File.Copy(filePath, backupFilePath, true); - // 妫�鏌ユ枃浠舵槸鍚﹀瓨鍦� try @@ -1190,8 +1145,6 @@ private string replaceContent(string text, string content, string replaceString) { - - string str = replaceString; string replacedText = ReplaceCoordinatesSection(text, content, str); @@ -1220,8 +1173,8 @@ return replacedText; } - } + public class Vector3D { public double X { get; set; } @@ -1234,6 +1187,7 @@ Y = y; Z = z; } + public static double CalculateAngle(Vector3D v1, Vector3D v2) { // 璁$畻涓や釜鍚戦噺鐨勭偣绉� @@ -1251,12 +1205,13 @@ return angleInRadians; } + public double Length { get { - return Math.Sqrt( X * X + Y * Y + Z * Z); + return Math.Sqrt(X * X + Y * Y + Z * Z); } } } -} +} \ No newline at end of file -- Gitblit v1.9.3