qin
2025-03-19 342b10ed5f4ebbccf2d2868d211fbe91cf3e8d5d
WinFrmUI/Yw.WinFrmUI.Hydro.Q3d.Core/MapView/NetworkViewModel2Inp.cs
@@ -138,7 +138,290 @@
            Links.ForEach(o => Hash_ID.Add(o.ID));
        }
        public bool BuildFromInp(string filePath)
        {
            if (filePath == null || !File.Exists(filePath)) return false;
            List<Coor> points = new List<Coor>();
            dict_dataset = new Dictionary<string, Dataset>();
            StreamReader sr = new StreamReader(filePath);
            //try
            {
                Nodes = new NodeViewModelList();
                Links = new LinkViewModelList();
                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;
                        Parts parts = new Parts(line);
                        section = section.ToUpper();
                        IBaseViewModel o = null;
                        switch (section)
                        {
                            case "JUNCTIONS":
                                {
                                    NodeViewModel j = null;
                                    if (parts[-2] == "Meter")
                                    {
                                        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();
                                    o = j;
                                    j.ID = parts.ToString(0, null);
                                    j.Z = parts.ToFloat(1, 0);
                                    j.Demand = parts.ToFloat(2, 0);
                                    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();
                                    o = r;
                                    r.ID = parts.ToString(0, null);
                                    r.Head = parts.ToFloat(1, 0);
                                    r.PatternID = parts.ToString(2, null);
                                    r.Level = parts.ToInt(-1, 0);
                                    r.Z = parts.ToFloat(-2, 0);
                                    Nodes.Add(r);
                                }
                                break;
                            case "TANKS":
                                {
                                    TankViewModel tank = new TankViewModel();
                                    o = tank;
                                    tank.ID = parts.ToString(0, null);
                                    tank.Z = parts.ToFloat(1, 0);
                                    tank.InitLevel = parts.ToFloat(2, 0);
                                    tank.MinLevel = parts.ToFloat(3, 0);
                                    tank.MaxLevel = parts.ToFloat(4, 0);
                                    tank.Diameter = parts.ToFloat(5, 0);
                                    tank.MinVol = parts.ToFloat(6, 0);
                                    tank.VolCurve = parts.ToString(7, null);
                                    tank.Overflow = "";
                                    tank.Level = parts.ToInt(-1, 0);
                                    Nodes.Add(tank);
                                }
                                break;
                            case "VALVES":
                                {
                                    ValveViewModel valve = new ValveViewModel();
                                    o = valve;
                                    valve.ID = parts.ToString(0, null);
                                    // 取出Node1和Node2中的字母部分,例如“S201326593”被取出为“201326593”
                                    valve.Node1 = parts.ToString(1, null); // Regex.Replace(parts[1], "[^0-9]", "");
                                    valve.Node2 = parts.ToString(2, null); // Regex.Replace(parts[2], "[^0-9]", "");
                                    valve.Diameter = parts.ToFloat(3, 0);
                                    valve.Type = parts.ToString(4, null);
                                    valve.Setting = parts.ToString(5, null);
                                    valve.MinorLoss = parts.ToFloat(6, 0);
                                    valve.Level = parts.ToInt(-1, 0);
                                    Links.Add(valve);
                                }
                                break;
                            case "PUMPS":
                                {
                                    PumpViewModel pump = new PumpViewModel();
                                    o = pump;
                                    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); // 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.HeadCurve = parts.ToString(index + 1, "PumpDefault");
                                                break;
                                            case "SPEED":
                                                pump.当前转速 = parts.ToFloat(index + 1, 0);
                                                break;
                                        }
                                        index += 2;
                                    }
                                    //pump.Diameter = parts.ToFloat(3, 0);
                                    pump.Level = parts.ToInt(-1, 0);
                                    Links.Add(pump);
                                }
                                break;
                            case "CURVES":
                                {
                                    string ID = parts.ToString(0, "");
                                    if (!dict_dataset.ContainsKey(ID))
                                    {
                                        var ds = new Dataset(ID, null);
                                        dict_dataset.Add(ID, ds);
                                    }
                                    dict_dataset[ID]._data.Add(new PointF(parts.ToFloat(1, 0), parts.ToFloat(2, 0)));
                                }
                                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;
                            case "STATUS":
                                {
                                    LinkViewModel link = Links.Find(l => l.ID == parts.ToString(0, null));
                                    if (link != null)
                                        link.Status = StringToStatus(parts.ToString(1, "OPEN"));
                                }
                                break;
                        }
                        if (o != null)
                        {
                            // o.Tags = new TagList(parts.ToString(-3, null));
                        }
                    }
                }
                sr.Close();
                if (!dict_dataset.ContainsKey("GPVDefault"))
                {
                    var data = new Dataset("GPVDefault", null);
                    data.Data = new List<PointF>()
                    {
                        new PointF(0,0),
                        new PointF(100,0),
                    };
                    dict_dataset.Add("GPVDefault", data);
                }
                if (!dict_dataset.ContainsKey("PumpDefault"))
                {
                    var data = new Dataset("PumpDefault", null);
                    data.Data = new List<PointF>()
                    {
                        new PointF(0f            ,   45.38f),
                        new PointF(83.33333333f     ,45.25f),
                        new PointF(111.1111111f     ,45.12f),
                        new PointF(138.8888889f     ,44.96f),
                        new PointF(166.6666667f     ,44.76f),
                        new PointF(194.4444444f     ,44.52f),
                        new PointF(222.2222222f     ,44.24f),
                        new PointF(250f             ,43.92f),
                        new PointF(277.7777778f     ,43.56f),
                        new PointF(305.5555556f     ,43.17f),
                        new PointF(333.3333333f     ,42.73f),
                        new PointF(361.1111111f     ,42.25f),
                        new PointF(388.8888889f     ,41.74f),
                        new PointF(416.6666667f     ,41.18f),
                        new PointF(444.4444444f     ,40.58f),
                        new PointF(472.2222222f     ,39.95f),
                        new PointF(500f             ,39.28f),
                        new PointF(527.7777778f     ,38.56f),
                        new PointF(555.5555556f     ,37.81f),
                        new PointF(583.3333333f     ,37.02f),
                        new PointF(611.1111111f     ,36.19f),
                        new PointF(638.8888889f     ,35.32f),
                        new PointF(666.6666667f     ,34.41f),
                        new PointF(694.4444444f     ,33.46f),
                        new PointF(722.2222222f     ,32.47f),
                        new PointF(750f             ,31.44f),
                        new PointF(777.7777778f     ,30.37f),
                        new PointF(805.5555556f     ,29.27f),
                    };
                    dict_dataset.Add("PumpDefault", data);
                }
                //读取坐标
                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++;
                }
                BuildRelation();
                return true;
            }
        }
        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;
            }
        }
    }