using Yw.EPAnet;
using Yw.Hydro;
using Yw.Model;
namespace Yw.WinFrmUI
{
///
///
///
public static class HydroModelInfoExtensions
{
///
/// 获取可见字典
///
public static Dictionary GetVisualDict(this Yw.Model.HydroModelInfo hydroInfo)
{
if (hydroInfo == null)
{
return default;
}
var allVisualList = hydroInfo.GetAllVisuals();
return allVisualList?.ToDictionary(x => x.Code);
}
///
/// 计算
///
public static HydroCalcuResult Calcu(this Yw.Model.HydroModelInfo hydroInfo, string calcuMode = Yw.EPAnet.CalcuMode.Simple)
{
var network = hydroInfo.ToNetwork();
if (network == null)
{
return default;
}
var calcuResult = network.Calcu(calcuMode);
if (calcuResult == null)
{
return default;
}
return hydroInfo.GetCalcuResult(calcuResult);
}
///
/// 获取计算结果
///
public static HydroCalcuResult GetCalcuResult(this Yw.Model.HydroModelInfo hydroInfo, Yw.EPAnet.CalcuResult calcuResult)
{
if (hydroInfo == null)
{
return default;
}
if (calcuResult == null)
{
return default;
}
var hydroCalcuResult = new HydroCalcuResult(calcuResult);
//流量计
var allFlowmeterList = hydroInfo.Flowmeters;
if (allFlowmeterList != null && allFlowmeterList.Count > 0)
{
var allLinkList = hydroInfo.GetAllLinks();
foreach (var flowmeter in allFlowmeterList)
{
var calcuFlowmeterResult = hydroCalcuResult.NodeList?.Find(x => x.Code == flowmeter.Code);
if (calcuFlowmeterResult != null)
{
var calcuFlowmeterNewResult = new HydroCalcuFlowmeterResult(calcuFlowmeterResult);
var calcuFlowmeterLinkResultList = new List();
var flowmeterLinkList = allLinkList?.Where(x => x.StartCode == flowmeter.Code || x.EndCode == flowmeter.Code).ToList();
if (flowmeterLinkList != null && flowmeterLinkList.Count > 0)
{
foreach (var flowmeterLink in flowmeterLinkList)
{
var calcuFlowmeterLinkResult = hydroCalcuResult.LinkList?.Find(x => x.Code == flowmeterLink.Code);
if (calcuFlowmeterLinkResult != null)
{
calcuFlowmeterLinkResultList.Add(calcuFlowmeterLinkResult);
}
}
}
if (calcuFlowmeterLinkResultList.Exists(x => x.CalcuFlow.HasValue))
{
calcuFlowmeterNewResult.CalcuQ = calcuFlowmeterLinkResultList.Where(x => x.CalcuFlow.HasValue).Average(x => x.CalcuFlow.Value);
}
hydroCalcuResult.NodeList.Remove(calcuFlowmeterResult);
hydroCalcuResult.NodeList.Add(calcuFlowmeterNewResult);
}
}
}
//压力表
var allPressmeterList = hydroInfo.Pressmeters;
if (allPressmeterList != null && allPressmeterList.Count > 0)
{
foreach (var pressmeter in allPressmeterList)
{
var calcuPressmeterResult = hydroCalcuResult.NodeList?.Find(x => x.Code == pressmeter.Code);
if (calcuPressmeterResult != null)
{
var calcuPressmeterNewResult = new HydroCalcuPressmeterResult(calcuPressmeterResult);
calcuPressmeterNewResult.CalcuPr = calcuPressmeterResult.CalcuPress;
hydroCalcuResult.NodeList.Remove(calcuPressmeterResult);
hydroCalcuResult.NodeList.Add(calcuPressmeterNewResult);
}
}
}
//水泵
var allPumpList = hydroInfo.Pumps;
if (allPumpList != null && allPumpList.Count > 0)
{
foreach (var pump in allPumpList)
{
var calcuPumpResult = hydroCalcuResult.LinkList.Find(x => x.Code == pump.Code);
if (calcuPumpResult != null)
{
var calcuPumpNewResult = new HydroCalcuPumpResult(calcuPumpResult);
calcuPumpNewResult.CalcuQ = calcuPumpResult.CalcuFlow;
if (calcuPumpNewResult.CalcuQ.HasValue)
{
var calcuNodeStartResult = hydroCalcuResult.NodeList?.Find(x => x.Code == pump.StartCode);
var calcuNodeEndResult = hydroCalcuResult.NodeList?.Find(x => x.Code == pump.EndCode);
if (calcuNodeStartResult != null && calcuNodeEndResult != null)
{
if (calcuNodeStartResult.CalcuPress.HasValue && calcuNodeEndResult.CalcuPress.HasValue)
{
calcuPumpNewResult.CalcuH = Math.Abs(calcuNodeStartResult.CalcuPress.Value - calcuNodeEndResult.CalcuPress.Value);
}
if (pump.LinkStatus == Yw.Hydro.PumpStatus.Open && pump.RatedN.HasValue)
{
var curveqp = hydroInfo.Curves?.Find(x => x.Code == pump.CurveQP);
if (curveqp != null)
{
if (curveqp.CurveData != null && curveqp.CurveData.Count > 3)
{
var point2dList = curveqp.CurveData.Select(x => new Yw.Geometry.Point2d(x.X, x.Y)).ToList();
var point2dSimularList = point2dList.GetQPPointListByN(pump.RatedN.Value, pump.RatedN.Value * pump.SpeedRatio);
var pumpCurveQp = new Yw.Pump.CurveQP(eFeatType.Cubic, point2dSimularList);
calcuPumpNewResult.CalcuP = pumpCurveQp.FeatCurve.GetPointY(calcuPumpNewResult.CalcuQ.Value);
}
}
}
if (calcuPumpNewResult.CalcuH.HasValue && calcuPumpNewResult.CalcuP.HasValue)
{
calcuPumpNewResult.CalcuE = Yw.Pump.CalculationHelper.CalcuE(calcuPumpNewResult.CalcuQ.Value, calcuPumpNewResult.CalcuH.Value, calcuPumpNewResult.CalcuP.Value);
}
}
}
hydroCalcuResult.LinkList.Remove(calcuPumpResult);
hydroCalcuResult.LinkList.Add(calcuPumpNewResult);
switch (pump.LinkStatus)
{
case Yw.Hydro.PumpStatus.Open:
{
if (calcuPumpNewResult.CalcuFlow.HasValue)
{
if (calcuPumpNewResult.CalcuFlow.Value <= 0)
{
hydroCalcuResult.WainingList.Add(new HydroCalcuWarning()
{
Code = pump.Code,
Message = $"[{pump.Name}]不满足当前工况 "
});
}
}
else
{
hydroCalcuResult.WainingList.Add(new HydroCalcuWarning()
{
Code = pump.Code,
Message = $"[{pump.Name}]流量计算失败 "
});
}
}
break;
case Yw.Hydro.PumpStatus.Closed:
{
if (calcuPumpNewResult.CalcuFlow.HasValue)
{
if (calcuPumpNewResult.CalcuFlow.Value > 0)
{
hydroCalcuResult.WainingList.Add(new HydroCalcuWarning()
{
Code = pump.Code,
Message = $"[{pump.Name}]不满足当前工况 "
});
}
}
else
{
hydroCalcuResult.WainingList.Add(new HydroCalcuWarning()
{
Code = pump.Code,
Message = $"[{pump.Name}]流量计算失败 "
});
}
}
break;
default: break;
}
}
}
}
return hydroCalcuResult;
}
}
}