cloudflight
2024-06-10 79fabf74a3fe97f1f2b8ae23e37cc33ba0d53ae2
Hydraulic/Hydro.MapView/MapViewNetWork.cs
@@ -18,6 +18,7 @@
using System.Runtime.InteropServices;
using Hydro.HydraulicOptimizer;
using Hydro.Core;
using System.Xml.Linq;
namespace Hydro.MapView
{
@@ -35,6 +36,42 @@
        public NodeViewModel StartPoint { get; set; }
        public NodeViewModel EndPoint { get; set; }
        public double[] getMinMax(ColourType colourType)
        {
            //根据当前选中的ColourType,判断是否有对应的网络数据
            double max = 0;
            double min = 0;
            switch (colourType)
            {
                case ColourType.节点自由压力:
                    max = Nodes.Where(node => !(node is ReservoirViewModel || node is TankViewModel)).Max(node => node.EN_PRESSURE);
                    min = Nodes.Where(node => !(node is ReservoirViewModel || node is TankViewModel)).Min(node => node.EN_PRESSURE);
                    break;
                case ColourType.节点绝对压力:
                    max = Nodes.Where(node => !(node is ReservoirViewModel || node is TankViewModel)).Max(node => node.EN_PRESSURE);
                    min = Nodes.Where(node => !(node is ReservoirViewModel || node is TankViewModel)).Min(node => node.EN_PRESSURE);
                    break;
                case ColourType.节点需水量:
                    max = Nodes.Where(node => !(node is ReservoirViewModel || node is TankViewModel)).Max(node => node.EN_DEMAND);
                    min = Nodes.Where(node => !(node is ReservoirViewModel || node is TankViewModel)).Min(node => node.EN_DEMAND);
                    break;
                case ColourType.管线流量:
                    max = Links.Max(link => link.EN_FLOW);
                    min = Links.Min(link => link.EN_FLOW);
                    break;
                case ColourType.管线流速:
                    max = Links.Max(link => link.EN_VELOCITY);
                    min = Links.Min(link => link.EN_VELOCITY);
                    break;
                default:
                    break;
            }
            return new double[] { min, max };
        }
        /// <summary>
        /// 当量集合,当量模板ID,<器具ID,数量>
@@ -392,6 +429,7 @@
            pipe.Status = StatusType.DEFAULT;
            pipe.StartNode = node1;
            pipe.EndNode = node2;
            pipe.Length = -1;
@@ -571,7 +609,7 @@
                EndPoint = network.EndPoint;
            }
        }
        public List<IBaseViewModel> Add(MapViewNetWork net0, PointF3D offset = null, bool isCopy = false)
        public List<IBaseViewModel> Add(MapViewNetWork net0, PointF3D offset = null, bool isCopy = false,NodeViewModel ConnectNode=null)
        {
            if (offset == null)
            {
@@ -615,6 +653,12 @@
                Hash_ID.Add(l.ID);
                list.Add(l);
            });
            if (ConnectNode!=null)
            {
                var l = AddPipe(ConnectNode, net.StartPoint);
                list.Add(l);
                Hash_ID.Add(l.ID);
            }
            //BuildRelation();
            return list;
        }
@@ -856,6 +900,61 @@
            return list;
            //return new List<TimePoint>();
        }
        public List<TimePoint> WaterDistribution(string inpPath, string configPath = null,List<WaterEquivalentSettings> settings=null,double TotalDemand=-1,double InitPress=100)
        {
            if (TotalDemand < 0)
            {
                throw new Exception("TotalDemand must be set");
            }
            WdnmoParam wdnmoParam = new WdnmoParam();
            wdnmoParam.UpdateWParamByWaterEquivalentSettings(settings, TotalDemand);
            wdnmoParam.ScadaPoints.Add(new TimePoint { Key = "initPress", Value= InitPress });
            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;
            });
            Nodes.ForEach(n => n.Demand = n.EN_DEMAND);
            this._isCalculated = true;
            return list;
            //return new List<TimePoint>();
        }
        public List<TimePoint> CalcByVal(WDNModelOptimizer wdo, Result val)
        {
@@ -908,6 +1007,57 @@
            //return new List<TimePoint>();
        }
        public List<TimePoint> CalcByValAndHead(WDNModelOptimizer wdo, Result val,double Head)
        {
            WdnmoParam wdnmoParam = new WdnmoParam();
            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}" });
                }
            });
            calcParam calcParam = new calcParam();
            calcParam.vars = val.arrayTryValue;
            calcParam.setVars = new List<SetVar>();
            reservoirs.ForEach(r =>
            {
                calcParam.setVars.Add(new SetVar(r.ID, true, (int)EpanetEnum.NodeValueType.水池水位, (float)Head));
            });
            wdnmoParam = wdo.CalcbyResult(calcParam, wdnmoParam);
            var list = wdnmoParam.ResultPoints;
            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");
            this._isCalculated = true;
            return list;
            //return new List<TimePoint>();
        }
        private void SetNodeFromWparam(MapViewNetWork net, List<TimePoint> list, string valueType)
        {
            int k1 = 0;