using Yw.Hydro;
using Yw.Model;
namespace Yw.WinFrmUI
{
///
/// 水力信息拓展
///
public static class HydroModelInfoExtensions
{
#region 修复参数
private const double _pipe_roughness_default = 110;//管道默认粗糙系数
private const double _translation_roughness_default = 120;//过渡件默认粗糙系数
private const double _translation_minorloss_default = 0.3;//过渡件默认局阻系数
private const double _valve_minorloss_default = 0.3d; //阀门默认局阻系数
private const double _resistance_minorloss_default = 9d;//阻件默认局阻系数
private const double _blunthead_minorloss_default = 0.1d;//闷头局部阻力系数
private const double _cooling_coefficient_default = 100000d;//冷却塔流量系数
///
/// 修复参数
///
public static void RepairParas
(
this Yw.Model.HydroModelInfo hydroInfo,
HydroPropStatusHelper propStatusHelper,
out string msg
)
{
msg = string.Empty;
if (hydroInfo == null)
{
return;
}
var allNodes = hydroInfo.GetAllNodes();
var allLinks = hydroInfo.GetAllLinks();
//管道
if (hydroInfo.Pipes != null && hydroInfo.Pipes.Count > 0)
{
foreach (var pipe in hydroInfo.Pipes)
{
if (pipe.Roughness <= 0)
{
pipe.Roughness = _pipe_roughness_default;
propStatusHelper.UpdatePropStatus(pipe, nameof(pipe.Roughness), ePropStatus.Abnormal, "【粗糙系数】数据异常");
}
}
}
//过渡件
if (hydroInfo.Translations != null && hydroInfo.Translations.Count > 0)
{
foreach (var translation in hydroInfo.Translations)
{
double? tempDiameter = null;
var startNode = allNodes.Find(x => x.Code == translation.StartCode);
if (startNode != null)
{
var startLink = allLinks
.Find(x => (x.StartCode == startNode.Code || x.EndCode == startNode.Code) && x.Code != translation.Code);
if (startLink != null)
{
var startPipe = startLink as Yw.Model.HydroPipeInfo;
if (startPipe != null)
{
tempDiameter = startPipe.Diameter;
if (translation.StartDiameter != startPipe.Diameter)
{
translation.StartDiameter = startPipe.Diameter;
}
}
}
}
var endNode = allNodes.Find(x => x.Code == translation.EndCode);
if (endNode != null)
{
var endLink = allLinks
.Find(x => (x.StartCode == endNode.Code || x.EndCode == endNode.Code) && x.Code != translation.Code);
if (endLink != null)
{
var endPipe = endLink as Yw.Model.HydroPipeInfo;
if (endPipe != null)
{
if (translation.EndDiameter != endPipe.Diameter)
{
tempDiameter = endPipe.Diameter;
translation.EndDiameter = endPipe.Diameter;
}
}
}
}
if (translation.StartDiameter <= 0)
{
if (tempDiameter.HasValue)
{
translation.StartDiameter = tempDiameter.Value;
}
}
if (translation.EndDiameter <= 0)
{
if (tempDiameter.HasValue)
{
translation.EndDiameter = tempDiameter.Value;
}
}
}
}
//阀门
if (hydroInfo.Valves != null && hydroInfo.Valves.Count > 0)
{
foreach (var valve in hydroInfo.Valves)
{
if (valve.MinorLoss <= 0)
{
valve.MinorLoss = _valve_minorloss_default;
}
if (valve.Diameter <= 0)
{
var startNode = allNodes.Find(x => x.Code == valve.StartCode);
if (startNode != null)
{
var startPipe = allLinks
.Find(x => (x.StartCode == startNode.Code || x.EndCode == startNode.Code) && x.Code != valve.Code)
as Yw.Model.HydroPipeInfo;
if (startPipe != null)
{
valve.Diameter = startPipe.Diameter;
}
else
{
var endNode = allNodes.Find(x => x.Code == valve.EndCode);
if (endNode != null)
{
var endPipe = allLinks
.Find(x => (x.StartCode == endNode.Code || x.EndCode == endNode.Code) && x.Code != valve.Code)
as Yw.Model.HydroPipeInfo;
if (endPipe != null)
{
valve.Diameter = endPipe.Diameter;
}
}
}
}
}
}
}
//阻件
var allResistanceList = hydroInfo.GetAllResistances();
if (allResistanceList != null && allResistanceList.Count > 0)
{
foreach (var resistance in allResistanceList)
{
if (resistance.MinorLoss <= 0)
{
resistance.MinorLoss = _resistance_minorloss_default;
}
var startNode = allNodes.Find(x => x.Code == resistance.StartCode);
if (startNode != null)
{
var startPipe = allLinks
.Find(x => (x.StartCode == startNode.Code || x.EndCode == startNode.Code) && x.Code != resistance.Code)
as Yw.Model.HydroPipeInfo;
if (startPipe != null)
{
resistance.Diameter = startPipe.Diameter;
}
else
{
var endNode = allNodes.Find(x => x.Code == resistance.EndCode);
if (endNode != null)
{
var endPipe = allLinks
.Find(x => (x.StartCode == endNode.Code || x.EndCode == endNode.Code) && x.Code != resistance.Code)
as Yw.Model.HydroPipeInfo;
if (endPipe != null)
{
resistance.Diameter = endPipe.Diameter;
}
}
}
}
}
}
//闷头
if (hydroInfo.Bluntheads != null && hydroInfo.Bluntheads.Count > 0)
{
foreach (var visual in hydroInfo.Bluntheads)
{
if (visual.MinorLoss <= 0)
{
visual.MinorLoss = _blunthead_minorloss_default;
}
if (visual.Caliber < 1)
{
var link = allLinks.Find(x => x.StartCode == visual.Code || x.EndCode == visual.Code);
if (link != null)
{
if (link is HydroResistanceInfo resistance)
{
visual.Caliber = resistance.Diameter;
}
else if (link is HydroValveInfo valve)
{
visual.Caliber = valve.Diameter;
}
else if (link is HydroTranslationInfo translation)
{
}
else if (link is HydroPipeInfo pipe)
{
visual.Caliber = pipe.Diameter;
}
}
}
}
}
#region 弯头
if (hydroInfo.Elbows != null && hydroInfo.Elbows.Count > 0)
{
foreach (var visual in hydroInfo.Elbows)
{
if (visual.MinorLoss <= 0)
{
visual.MinorLoss = _blunthead_minorloss_default;
}
if (visual.Caliber < 1)
{
var link = allLinks.Find(x => x.StartCode == visual.Code || x.EndCode == visual.Code);
if (link != null)
{
if (link is HydroResistanceInfo resistance)
{
visual.Caliber = resistance.Diameter;
}
else if (link is HydroValveInfo valve)
{
visual.Caliber = valve.Diameter;
}
else if (link is HydroTranslationInfo translation)
{
}
else if (link is HydroPipeInfo pipe)
{
visual.Caliber = pipe.Diameter;
}
}
}
}
}
#endregion
#region 冷却塔
if (hydroInfo.Coolings != null && hydroInfo.Coolings.Count > 0)
{
foreach (var cooling in hydroInfo.Coolings)
{
if (cooling.Coefficient < 1)
{
cooling.Coefficient = _cooling_coefficient_default;
propStatusHelper.UpdatePropStatus(cooling.Code, nameof(cooling.Coefficient), ePropStatus.Abnormal, $"【流量系数】数据异常,使用默认值[{_cooling_coefficient_default}]修复");
}
if (cooling.Caliber < 1)
{
var link = allLinks.Find(x => x.StartCode == cooling.Code || x.EndCode == cooling.Code);
if (link != null)
{
if (link is HydroPipeInfo pipe)
{
if (pipe.Diameter > 0)
{
cooling.Caliber = pipe.Diameter;
propStatusHelper.UpdatePropStatus(cooling.Code, nameof(cooling.Caliber), ePropStatus.Abnormal, $"【口径】数据异常,使用相邻管道修复");
}
}
}
}
}
}
#endregion
}
#endregion
#region 装置计算
///
/// 获取开始压力(m)
///
public static double GetStartHead(this Yw.Model.HydroModelInfo hydroInfo)
{
if (hydroInfo == null)
{
return default;
}
double startHeadValue = 0;
var allSourceList = hydroInfo.GetAllSources();
if (allSourceList != null && allSourceList.Count > 0)
{
var startSource = allSourceList.Matching(new List()
{
Yw.Hydro.Flags.水源,
Yw.Hydro.Flags.始端,
Yw.Hydro.Flags.默认
});
if (startSource == null)
{
startSource = allSourceList.Matching(new List()
{
Yw.Hydro.Flags.水源,
Yw.Hydro.Flags.始端
});
}
if (startSource != null)
{
if (startSource is HydroTankInfo tank)
{
startHeadValue = tank.PoolElev + tank.InitLevel;
}
}
}
return startHeadValue;
}
///
/// 获取结束压力(m)
///
public static double GetEndHead(this Yw.Model.HydroModelInfo hydroInfo)
{
if (hydroInfo == null)
{
return default;
}
double endHeadValue = 0;
var allNodeList = hydroInfo.GetAllNodes();
if (allNodeList != null && allNodeList.Count > 0)
{
var endSource = allNodeList.Matching(new List()
{
Yw.Hydro.Flags.水源,
Yw.Hydro.Flags.末端,
Yw.Hydro.Flags.默认
});
if (endSource == null)
{
endSource = allNodeList.Matching(new List()
{
Yw.Hydro.Flags.水源,
Yw.Hydro.Flags.末端
});
}
if (endSource != null)
{
if (endSource is HydroTankInfo tank)
{
endHeadValue = tank.PoolElev + tank.InitLevel;
}
else if (endSource is HydroEmitterInfo emitter)
{
endHeadValue = emitter.Elev;
}
}
}
return endHeadValue;
}
///
/// 获取扬程
///
public static double GetHead(this Yw.Model.HydroModelInfo hydroInfo)
{
if (hydroInfo == null)
{
return default;
}
var startHeadValue = GetStartHead(hydroInfo);
var endHeadValue = GetEndHead(hydroInfo);
return endHeadValue - startHeadValue;
}
///
/// 获取总管流量
///
public static double? GetPipeQ(this Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult)
{
return GetPipeQ(hydroInfo, calcuResult?.GetVisualDict());
}
///
/// 获取总管流量
///
public static double? GetPipeQ(this Yw.Model.HydroModelInfo hydroInfo, Dictionary allCalcuVisualDict)
{
if (hydroInfo == null)
{
return default;
}
if (allCalcuVisualDict == null || allCalcuVisualDict.Count < 1)
{
return default;
}
var allLinkList = hydroInfo.GetAllLinks();
if (allLinkList == null || allLinkList.Count < 1)
{
return default;
}
var link = allLinkList.Matching(new List()
{
Yw.Hydro.Flags.总管,
Yw.Hydro.Flags.出口,
Yw.Hydro.Flags.默认
});
if (link == null)
{
link = allLinkList.Matching(new List()
{
Yw.Hydro.Flags.总管,
Yw.Hydro.Flags.出口
});
}
if (link == null)
{
return default;
}
var calcuVisualResult = allCalcuVisualDict.GetValue(link.Code);
if (calcuVisualResult == null)
{
return default;
}
var calcuValue = calcuVisualResult.GetCalcuValue(Yw.Hydro.VisualCalcuProp.CalcuFlow);
if (calcuValue == null)
{
return default;
}
return Math.Round(Math.Abs(calcuValue.Value), 1);
}
///
/// 获取总管结束压力(绝对压力)
///
public static double? GetPipeEndHead(this Yw.Model.HydroModelInfo hydroInfo, Dictionary allCalcuVisualDict)
{
if (hydroInfo == null)
{
return default;
}
if (allCalcuVisualDict == null || allCalcuVisualDict.Count < 1)
{
return default;
}
var allNodeList = hydroInfo.GetAllNodes();
if (allNodeList == null || allNodeList.Count < 1)
{
return default;
}
var node = allNodeList.Matching(new List()
{
Yw.Hydro.Flags.总管,
Yw.Hydro.Flags.出口,
Yw.Hydro.Flags.默认
});
if (node == null)
{
node = allNodeList.Matching(new List()
{
Yw.Hydro.Flags.总管,
Yw.Hydro.Flags.出口
});
}
if (node == null)
{
return default;
}
var calcuVisualResult = allCalcuVisualDict.GetValue(node.Code);
if (calcuVisualResult == null)
{
return default;
}
var calcuValue = calcuVisualResult.GetCalcuValue(Yw.Hydro.VisualCalcuProp.CalcuHead);
if (calcuValue == null)
{
return default;
}
return Math.Round(calcuValue.Value, 2);
}
///
/// 获取总管结束压力(绝对压力)
///
public static double? GetPipeEndHead(this Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult)
{
return GetPipeEndHead(hydroInfo, calcuResult?.GetVisualDict());
}
///
/// 获取总管压力(绝对压力)
///
public static double? GetPipeHead(this Yw.Model.HydroModelInfo hydroInfo, HydroCalcuResult calcuResult)
{
return GetPipeHead(hydroInfo, calcuResult?.GetVisualDict());
}
///
/// 获取总管压力(绝对压力)
///
public static double? GetPipeHead(this Yw.Model.HydroModelInfo hydroInfo, Dictionary allCalcuVisualDict)
{
if (hydroInfo == null)
{
return default;
}
if (allCalcuVisualDict == null || allCalcuVisualDict.Count < 1)
{
return default;
}
var allNodeList = hydroInfo.GetAllNodes();
if (allNodeList == null || allNodeList.Count < 1)
{
return default;
}
var node = allNodeList.Matching(new List()
{
Yw.Hydro.Flags.总管,
Yw.Hydro.Flags.出口,
Yw.Hydro.Flags.默认
});
if (node == null)
{
node = allNodeList.Matching(new List()
{
Yw.Hydro.Flags.总管,
Yw.Hydro.Flags.出口
});
}
if (node == null)
{
return default;
}
var calcuVisualResult = allCalcuVisualDict.GetValue(node.Code);
if (calcuVisualResult == null)
{
return default;
}
var calcuValue = calcuVisualResult.GetCalcuValue(Yw.Hydro.VisualCalcuProp.CalcuHead);
if (calcuValue == null)
{
return default;
}
var endHeadValue = calcuValue.Value;
var startHeadValue = GetStartHead(hydroInfo);
return Math.Round(endHeadValue - startHeadValue, 2);
}
#endregion
#region 计算结果
#endregion
}
}