cloudflight
2024-06-08 531e9b2ccf0ddf87f776f43378650d5169292bcb
Hydraulic/Hydro.MapView/MapViewNetWork.cs
@@ -393,6 +393,7 @@
            pipe.Status = StatusType.DEFAULT;
            pipe.StartNode = node1;
            pipe.EndNode = node2;
            pipe.Length = -1;
@@ -618,7 +619,9 @@
            });
            if (ConnectNode!=null)
            {
                list.Add(AddPipe(ConnectNode, net.StartPoint));
                var l = AddPipe(ConnectNode, net.StartPoint);
                list.Add(l);
                Hash_ID.Add(l.ID);
            }
            //BuildRelation();
            return list;
@@ -861,6 +864,100 @@
            return list;
            //return new List<TimePoint>();
        }
        public List<TimePoint> WaterDistribution(string inpPath, string configPath = null,List<WaterEquivalentSettings> settings=null,double TotalDemand=-1)
        {
            if (TotalDemand<0)
            {
                throw new Exception("TotalDemand must be set");
            }
            WdnmoParam wdnmoParam = new WdnmoParam();
            int setID = 1;
            var SumCount= settings.Sum(s => s.Meters.Count);
            wdnmoParam.VarSets_Import = new List<vSet>();
            wdnmoParam.Vars_Import = new List<variable>();
            settings.ForEach(s =>
            {
                double CurrentDemand =  TotalDemand * s.Meters.Count/ SumCount ;
                vSet vset = new vSet();
                vset.ID = 10000 + setID;
                vset.Name = $"水表集合{setID}";
                vset.IndicatorType = "节点自由压力";
                vset.ObjectType = "节点";
                vset.defaultExpress = "最小值";
                vset.isNode = true;
                vset.IDs = s.Meters;
                wdnmoParam.VarSets_Import.Add(vset);
                variable var0= new variable();
                var0.ID = 20000 + setID;
                var0.Name = $"水量分配参数{setID}";
                var0.expressString = $"{CurrentDemand}:";
                s.waterEquivalents.WaterEquivalentCollection.ForEach(w =>
                {
                    for (int i=0;i< w.Count;i++)
                    {
                        //如果var0.expressString最后一个字符是冒号,说明是第一个,不需要加逗号
                        if (var0.expressString[var0.expressString.Length - 1] != ':')
                        {
                            var0.expressString += ",";
                        }
                        var0.expressString += $"{w.ID},{w.MinRatedFlow},{w.RatedFlow}";
                    }
                });
                var0.IndicatorType = "当量分配";
                var0.logicType = "水量分配";
                var0.modelObjectID = $"{{|{vset.Name}|}}";
                var0.expressType = "基准值(界面)";
                wdnmoParam.Vars_Import.Add(var0);
                setID++;
            });
            Nodes.ForEach(n =>
            {
                //if (n is JunctionViewModel || n is MeterViewModel || n is NozzleViewModel)
                {
                    wdnmoParam.ResultPoints.Add(new TimePoint { Key = $"Press_{n.ID}" });
                    wdnmoParam.ResultPoints.Add(new TimePoint { Key = $"Head_{n.ID}" });
                    wdnmoParam.ResultPoints.Add(new TimePoint { Key = $"Demand_{n.ID}" });
                }
            });
            Links.ForEach(n =>
            {
                //if (n is PipeViewModel || n is PumpViewModel || n is ValveViewModel)
                {
                    wdnmoParam.ResultPoints.Add(new TimePoint { Key = $"Flow_{n.ID}" });
                    wdnmoParam.ResultPoints.Add(new TimePoint { Key = $"Velocity_{n.ID}" });
                    wdnmoParam.ResultPoints.Add(new TimePoint { Key = $"Headloss_{n.ID}" });
                }
            });
            calc c = new calc();
            var list = c.GetCalcResult(inpPath, wdnmoParam, configPath);
            if (list == null) return list;
            list.Sort((a, b) => string.Compare(a.Key, b.Key));
            Nodes.Sort((a, b) => string.Compare(a.ID, b.ID));
            Links.Sort((a, b) => string.Compare(a.ID, b.ID));
            SetNodeFromWparam(this, list, "Press");
            SetNodeFromWparam(this, list, "Head");
            SetNodeFromWparam(this, list, "Demand");
            SetLinkFromWparam(this, list, "Flow");
            SetLinkFromWparam(this, list, "Velocity");
            SetLinkFromWparam(this, list, "Headloss");
            Links.ForEach(l =>
            {
                l.EN_HEADLOSS_MINOR = (float)Math.Round(l.MinorLoss * Math.Pow(l.EN_VELOCITY, 2) / 2 / 9.8, 4);
                l.EN_HEADLOSS_LINE = l.EN_HEADLOSS - l.EN_HEADLOSS_MINOR;
            });
            this._isCalculated = true;
            return list;
            //return new List<TimePoint>();
        }
        public List<TimePoint> CalcByVal(WDNModelOptimizer wdo, Result val)
        {