using HStation.Model;
namespace HStation.Service
{
///
/// 修正辅助类
///
public static class RevitCorrectHelper
{
///
/// 修正
///
public static bool Correct(this Model.RevitModel rhs, out string msg)
{
if (rhs == null)
{
msg = "数据为空";
return false;
}
if (!Zero(rhs, out msg))
{
return false;
}
if (!First(rhs, out msg))
{
return false;
}
if (!Exchanger(rhs, out msg))
{
return false;
}
if (!Second(rhs, out msg))
{
return false;
}
if (!Three(rhs, out msg))
{
return false;
}
return true;
}
//前提:验证合法性
private static bool Zero(Model.RevitModel rhs, out string msg)
{
msg = string.Empty;
var allWaterSourceList = rhs.GetAllWaterSources();
if (allWaterSourceList == null || allWaterSourceList.Count < 1)
{
msg = "无水源";
return false;
}
var allJunctionList = rhs.GetAllJunctions();
if (allJunctionList == null || allJunctionList.Count < 1)
{
msg = "无连接节点";
return false;
}
return true;
}
//第一步:检查集合初始化
private static bool First(Model.RevitModel rhs, out string msg)
{
msg = string.Empty;
if (rhs.Reservoirs == null)
{
rhs.Reservoirs = new List();
}
if (rhs.Tanks == null)
{
rhs.Tanks = new List();
}
if (rhs.Waterboxs == null)
{
rhs.Waterboxs = new List();
}
if (rhs.Junctions == null)
{
rhs.Waterboxs = new List();
}
if (rhs.Elbows == null)
{
rhs.Elbows = new List();
}
if (rhs.Threelinks == null)
{
rhs.Threelinks = new List();
}
if (rhs.Fourlinks == null)
{
rhs.Fourlinks = new List();
}
if (rhs.Meters == null)
{
rhs.Meters = new List();
}
if (rhs.Flowmeters == null)
{
rhs.Flowmeters = new List();
}
if (rhs.Pressmeters == null)
{
rhs.Pressmeters = new List();
}
if (rhs.Nozzles == null)
{
rhs.Nozzles = new List();
}
if (rhs.Hydrants == null)
{
rhs.Hydrants = new List();
}
if (rhs.Bluntheads == null)
{
rhs.Bluntheads = new List();
}
if (rhs.Pipes == null)
{
rhs.Pipes = new List();
}
if (rhs.Translations == null)
{
rhs.Translations = new List();
}
if (rhs.Exchangers == null)
{
rhs.Exchangers = new List();
}
if (rhs.Pumps == null)
{
rhs.Pumps = new List();
}
if (rhs.Valves == null)
{
rhs.Valves = new List();
}
return true;
}
//单独修复换热器
private static bool Exchanger(Model.RevitModel rhs, out string msg)
{
msg = string.Empty;
if (rhs.Exchangers != null && rhs.Exchangers.Count > 0)
{
var allParterList = rhs.GetAllParters();
foreach (var exchanger in rhs.Exchangers)
{
if (exchanger.ConnectList != null && exchanger.ConnectList.Count > 0)
{
foreach (var connect in exchanger.ConnectList.ToList())
{
var connectParter = allParterList.Find(x => x.Id == connect.Id);
if (connectParter == null)
{
exchanger.ConnectList.Remove(connect);
//msg = $"换热器:{exchanger.Id} 连接组件 {connect.Id} 不存在";
// return false;
}
}
var startConnectList = exchanger.ConnectList.GetStartConnects();
if (startConnectList == null || startConnectList.Count < 1)
{
msg = $"换热器:{exchanger.Id} 上游连接组件不存在";
return false;
}
var startJunction = new Model.RevitJunction();
startJunction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Code).ToList());
startJunction.Code = startJunction.Id;
startJunction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList());
startJunction.Flags = null;
startJunction.ModelType = null;
startJunction.Description = "换热器修正时,自动添加";
startJunction.Quality = exchanger.StartQuality;
startJunction.Position = startConnectList.GetCenterPosition();
startJunction.Elev = exchanger.StartElev;
startJunction.Demand = null;
startJunction.DemandPattern = null;
rhs.Junctions.Add(startJunction);
exchanger.StartCode = startJunction.Code;
foreach (var startConnect in startConnectList)
{
var startConnectParter = allParterList.Find(x => x.Id == startConnect.Id);
if (startConnectParter is RevitLink revitLink)
{
if (revitLink.StartCode == exchanger.Id)
{
revitLink.StartCode = startJunction.Id;
}
else if (revitLink.EndCode == exchanger.Id)
{
revitLink.EndCode = startJunction.Id;
}
}
}
allParterList.Add(startJunction);
var endConnectList = exchanger.ConnectList.GetEndConnects();
if (endConnectList == null || endConnectList.Count < 1)
{
msg = $"换热器:{exchanger.Id} 下游连接组件不存在";
return false;
}
var endJunction = new Model.RevitJunction();
endJunction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Code).ToList());
endJunction.Code = endJunction.Id;
endJunction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList());
endJunction.Flags = null;
endJunction.ModelType = null;
endJunction.Description = "换热器修正时,自动添加";
endJunction.Quality = exchanger.EndQuality;
endJunction.Position = endConnectList.GetCenterPosition();
endJunction.Elev = exchanger.EndElev;
endJunction.Demand = null;
endJunction.DemandPattern = null;
rhs.Junctions.Add(endJunction);
exchanger.EndCode = endJunction.Code;
foreach (var endConnect in endConnectList)
{
var endConnectParter = allParterList.Find(x => x.Id == endConnect.Id);
if (endConnectParter is RevitLink revitLink)
{
if (revitLink.StartCode == exchanger.Id)
{
revitLink.StartCode = endJunction.Id;
}
else if (revitLink.EndCode == exchanger.Id)
{
revitLink.EndCode = endJunction.Id;
}
}
}
allParterList.Add(endJunction);
}
}
}
return true;
}
//第二步:检查上下游编码
private static bool Second(Model.RevitModel rhs, out string msg)
{
msg = string.Empty;
var allParterList = rhs.GetAllParters();
var allLinks = rhs.GetAllLinks();
foreach (var link in allLinks)
{
var startLinkParter = allParterList.Find(x => x.Id == link.StartCode);
if (startLinkParter == null)
{
msg = $"管段: {link.Id} 上游节点错误";
return false;
}
link.StartCode = startLinkParter.Code;
var endLinkParter = allParterList.Find(x => x.Id == link.EndCode);
if (endLinkParter == null)
{
msg = $"管段: {link.Id} 下游节点错误";
return false;
}
link.EndCode = endLinkParter.Code;
}
return true;
}
//第三步:按照水力结构进行修正
private static bool Three(Model.RevitModel rhs, out string msg)
{
msg = string.Empty;
var allParterList = rhs.GetAllParters();
var allLinks = rhs.GetAllLinks();
foreach (var link in allLinks)
{
var startLinkParter = allParterList.Find(x => x.Code == link.StartCode);
if (startLinkParter is RevitLink startLink)
{
var junction = new Model.RevitJunction();
junction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Code).ToList());
junction.Code = junction.Id;
junction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList());
junction.Flags = null;
junction.ModelType = null;
junction.Description = "水力修正时,自动添加";
junction.Quality = link.StartQuality;
junction.Position = link.StartPosition;
junction.Elev = link.StartElev;
junction.Demand = null;
junction.DemandPattern = null;
rhs.Junctions.Add(junction);
link.StartCode = junction.Code;
if (startLink.StartCode == link.Code)
{
startLink.StartCode = junction.Code;
}
else if (startLink.EndCode == link.Code)
{
startLink.EndCode = junction.Code;
}
allParterList.Add(junction);
}
var endLinkParter = allParterList.Find(x => x.Code == link.EndCode);
if (endLinkParter is RevitLink endLink)
{
var junction = new Model.RevitJunction();
junction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Code).ToList());
junction.Code = junction.Id;
junction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList());
junction.Flags = null;
junction.ModelType = null;
junction.Description = "水力修正时,自动添加";
junction.Quality = link.EndQuality;
junction.Position = link.EndPosition;
junction.Elev = link.EndElev;
junction.Demand = null;
junction.DemandPattern = null;
rhs.Junctions.Add(junction);
link.EndCode = junction.Code;
if (endLink.StartCode == link.Code)
{
endLink.StartCode = junction.Code;
}
else if (endLink.EndCode == link.Code)
{
endLink.EndCode = junction.Code;
}
allParterList.Add(junction);
}
}
return true;
}
}
}