using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using static CloudWaterNetwork.Repeater; using System.Windows.Forms; using System.Drawing; namespace CloudWaterNetwork { public class Coor { public string ID; public PointF position; public Coor(string iD, PointF position) { ID = iD; this.position = position; } } partial class Network { public bool loadInpFile(string filePath) { if (filePath == null || !File.Exists(filePath)) return false; List points = new List(); StreamReader sr = new StreamReader(filePath); //try { Nodes = new List(); //reservoirs = new List(); //tanks = new List(); //meters = new List(); Links = new List(); //valves = new List(); //repeaters = new List(); string line; string section = ""; while ((line = sr.ReadLine()) != null) { if (line.Trim().StartsWith("[")) { section = line.TrimStart('[').TrimEnd(']'); } else { 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)); switch (section) { case "JUNCTIONS": { Node j = null; if (parts[4] == null || parts[4] == "" || parts[4] == "Junction") j = new Junction(); else if (parts[4] == "Meter") { j = new Meter(); meters.Add((Meter)j); } j.ID = parts[0]; float elev; if (float.TryParse(parts[1], out elev)) j.Elev = elev; float demand; if (float.TryParse(parts[2], out demand)) j.Demand = demand; j.Pattern = parts[3]; int level; if (int.TryParse(parts[5], out level)) j.Level = level; Nodes.Add(j); } break; case "RESERVOIRS": { Reservoir r = new Reservoir(); r.ID = parts[0]; float head; if (float.TryParse(parts[1], out head)) r.Head = head; r.Pattern = parts.Length > 2 ? parts[2] : ""; int level; if (int.TryParse(parts[3], out level)) r.Level = level; Nodes.Add(r); } break; case "TANKS": { Tank tank = new Tank(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]); int level; if (int.TryParse(parts[9], out level)) tank.Level = level; Nodes.Add(tank); } break; case "PIPES": { Pipe p = new Pipe(); p.ID = parts[0]; p.Node1 = parts[1]; p.Node2 = parts[2]; float length; if (float.TryParse(parts[3], out length)) p.Length = length; float diameter; if (float.TryParse(parts[4], out diameter)) p.Diameter = diameter; float roughness; if (float.TryParse(parts[5], out roughness)) p.Roughness = roughness; float minorLoss; if (float.TryParse(parts[6], out minorLoss)) p.MinorLoss = minorLoss; p.Status = parts.Length > 7 ? parts[7] : ""; int level; if (int.TryParse(parts[8], out level)) p.Level = level; Links.Add(p); } break; case "VALVES": { Valve valve = new Valve(); valve.ID = parts[0]; // 取出Node1和Node2中的字母部分,例如“S201326593”被取出为“201326593” valve.Node1 = parts[1]; // Regex.Replace(parts[1], "[^0-9]", ""); valve.Node2 = parts[2]; // Regex.Replace(parts[2], "[^0-9]", ""); float diameter; if (float.TryParse(parts[3], out diameter)) valve.Diameter = diameter; valve.Type = parts[4]; valve.Setting = parts[5]; float minorLoss; if (float.TryParse(parts[6], out minorLoss)) valve.MinorLoss = minorLoss; int level; if (int.TryParse(parts[7], out level)) valve.Level = level; Links.Add(valve); } break; case "REPEATERS": { Repeater repeater = new Repeater(); repeater.ID = parts[0]; repeater.Node1 = parts[1]; repeater.Node2 = parts[2]; // 取出Node1和Node2中的字母部分,例如“S201326593”被取出为“201326593” repeater.TemplateID = parts[3]; int repeatTimes; if (int.TryParse(parts[4], out repeatTimes)) repeater.RepeatTimes = repeatTimes; RepeatStatus status; if (Enum.TryParse(parts[5], out status)) repeater.Status = status; repeater.NetworkPreName = parts[6]; int networkPreStartNum; if (int.TryParse(parts[7], out networkPreStartNum)) repeater.NetworkPreStartNum = networkPreStartNum; bool networkIsAscNum; if (bool.TryParse(parts[8], out networkIsAscNum)) repeater.NetworkIsAscNum = networkIsAscNum; repeater.NetworkShowName = parts[9]; int level; if (int.TryParse(parts[10], out level)) repeater.Level = level; Links.Add(repeater); } break; case "COORDINATES": { string id = parts[0]; float x; float y; if (float.TryParse(parts[1], out x) && float.TryParse(parts[2], out y)) { points.Add(new Coor(id,new PointF( x, y))); } } break; } } } sr.Close(); //读取坐标 int k1 = 0; int k2 = 0; Nodes.Sort((a, b) => string.Compare(a.ID, b.ID)); points.Sort((a, b) => string.Compare(a.ID, b.ID)); k1 = 0; k2 = 0; while (k1 < Nodes.Count) { var J = Nodes[k1]; var coor = points[k2]; while (J.ID != coor.ID && k2 < points.Count) { k2++; if (k2 < points.Count) coor = points[k2]; } if (k2 == points.Count) { throw new Exception($"未找到Node[{J.ID}]的坐标"); } J.X = coor.position.X; J.Y = coor.position.Y; k1++; } //建立点线关系链表StartNode,先将管线以Node1(节点1的ID)排序,再将Nodes按ID排序,建立两个游标k1、k2,正向一次循环,建立链表关系 //时间复杂度 O(n) Links.Sort((a, b) => string.Compare(a.Node1, b.Node1)); k1 = 0; k2 = 0; while (k2 string.Compare(a.Node2, b.Node2)); k1 = 0; k2 = 0; while (k2 < Links.Count) { var p = Links[k2]; var J = Nodes[k1]; while (J.ID != p.Node2 && k1 < Nodes.Count) { k1++; if (k1 < Nodes.Count) J = Nodes[k1]; } if (k1 == Nodes.Count) { throw new Exception($"未找到Link[{p.ID}]的终止节点[{p.Node2}]"); } p.EndNode = J; if (J.MaxDiameter < p.Diameter) J.MaxDiameter = p.Diameter; J.Links.Add(p); k2++; } //Links.ForEach(p => //{ // Node J = Nodes.Find(j => j.ID == p.Node1); // if (J != null) // { // p.StartNode = J; // if (J.MaxDiameter < p.Diameter) J.MaxDiameter = p.Diameter; // } // J = Nodes.Find(j => j.ID == p.Node2); // if (J != null) // { // p.EndNode = J; // if (J.MaxDiameter < p.Diameter) J.MaxDiameter = p.Diameter; // } //}); return true; } //catch(Exception e) //{ // sr.Close(); // MessageBox.Show(e.Message,"读取失败"); // return false; //} } } }