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.GetAllSources(); 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); } else { if (connectParter is RevitBlunthead blunthead) { var decorator = new Model.RevitDecorator(); decorator.Id = blunthead.Id; decorator.Code = blunthead.Code; decorator.Name = blunthead.Name; decorator.Category = RevitJsonCatalog.Blunthead; decorator.Decoration = null; decorator.Description = blunthead.Description; rhs.Decorators.Add(decorator); rhs.Bluntheads.Remove(blunthead); allParterList.Remove(connectParter); } } } 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; } } }