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<Coor> points = new List<Coor>();
|
StreamReader sr = new StreamReader(filePath);
|
//try
|
{
|
Nodes = new List<Node>();
|
//reservoirs = new List<Reservoir>();
|
//tanks = new List<Tank>();
|
//meters = new List<Meter>();
|
|
Links = new List<Link>();
|
//valves = new List<Valve>();
|
//repeaters = new List<Repeater>();
|
|
|
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<Links.Count )
|
{
|
var p=Links[k2];
|
var J=Nodes[k1];
|
while (J.ID!=p.Node1 && k1 < Nodes.Count)
|
{
|
k1++;
|
if (k1 < Nodes.Count) J = Nodes[k1];
|
|
}
|
if (k1 == Nodes.Count)
|
{
|
throw new Exception($"未找到Link[{p.ID}]的起始节点[{p.Node1}]");
|
}
|
p.StartNode = J;
|
if (J.MaxDiameter < p.Diameter) J.MaxDiameter = p.Diameter;
|
J.Links.Add(p);
|
k2++;
|
}
|
|
//建立点线关系链表StartNode,先将管线以Node2(节点1的ID)排序,再将Nodes按ID排序,建立两个游标k1、k2,正向一次循环,建立链表关系
|
//时间复杂度 O(n)
|
Links.Sort((a, b) => 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;
|
//}
|
|
}
|
|
}
|
}
|