| | |
| | | using System.Runtime.InteropServices; |
| | | using Hydro.HydraulicOptimizer; |
| | | using Hydro.Core; |
| | | using System.Xml.Linq; |
| | | |
| | | namespace Hydro.MapView |
| | | { |
| | |
| | | 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,数量> |
| | |
| | | pipe.Status = StatusType.DEFAULT; |
| | | pipe.StartNode = node1; |
| | | pipe.EndNode = node2; |
| | | pipe.Length = -1; |
| | | |
| | | |
| | | |
| | |
| | | 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) |
| | | { |
| | |
| | | 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; |
| | | } |
| | |
| | | |
| | | // 定义 visited 字典记录已访问过的节点和待访问的节点队列 |
| | | Dictionary<NodeViewModel, bool> visited;//= new Dictionary<Node, bool>(); |
| | | private bool _isCalculated=false; |
| | | |
| | | public void BFS(MapViewNetWork net, NodeViewModel startNode, Vector3 vector) |
| | | { |
| | |
| | | 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> 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) |
| | | { |
| | |
| | | SetLinkFromWparam(this, list, "Flow"); |
| | | SetLinkFromWparam(this, list, "Velocity"); |
| | | SetLinkFromWparam(this, list, "Headloss"); |
| | | this._isCalculated = true; |
| | | return list; |
| | | //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>(); |
| | | } |