| | |
| | | public static class RevitCorrectHelper |
| | | { |
| | | /// <summary> |
| | | /// 修正(无法修正会抛出异常) |
| | | /// 修正 |
| | | /// </summary> |
| | | /// <param name="rhs">RevitModel</param> |
| | | public static void Correct(this Model.RevitModel rhs) |
| | | public static bool Correct(this Model.RevitModel rhs, out string msg) |
| | | { |
| | | if (rhs == null) |
| | | { |
| | | throw new Exception("数据为空"); |
| | | msg = "数据为空"; |
| | | return false; |
| | | } |
| | | Zero(rhs); |
| | | First(rhs); |
| | | Second(rhs); |
| | | Three(rhs); |
| | | 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 void Zero(Model.RevitModel rhs) |
| | | private static bool Zero(Model.RevitModel rhs, out string msg) |
| | | { |
| | | msg = string.Empty; |
| | | var allWaterSourceList = rhs.GetAllWaterSources(); |
| | | if (allWaterSourceList == null || allWaterSourceList.Count < 1) |
| | | { |
| | | throw new Exception("无水源"); |
| | | msg = "无水源"; |
| | | return false; |
| | | } |
| | | var allJunctionList = rhs.GetAllJunctions(); |
| | | if (allJunctionList == null || allJunctionList.Count < 1) |
| | | { |
| | | throw new Exception("无连接节点"); |
| | | msg = "无连接节点"; |
| | | return false; |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | //第一步:检查集合初始化 |
| | | private static void First(Model.RevitModel rhs) |
| | | private static bool First(Model.RevitModel rhs, out string msg) |
| | | { |
| | | msg = string.Empty; |
| | | if (rhs.Reservoirs == null) |
| | | { |
| | | rhs.Reservoirs = new List<Model.RevitReservoir>(); |
| | |
| | | if (rhs.Fourlinks == null) |
| | | { |
| | | rhs.Fourlinks = new List<Model.RevitFourlink>(); |
| | | } |
| | | if (rhs.Meters == null) |
| | | { |
| | | rhs.Meters = new List<RevitMeter>(); |
| | | } |
| | | if (rhs.Flowmeters == null) |
| | | { |
| | |
| | | { |
| | | rhs.Translations = new List<Model.RevitTranslation>(); |
| | | } |
| | | if (rhs.Exchangers == null) |
| | | { |
| | | rhs.Exchangers = new List<RevitExchanger>(); |
| | | } |
| | | if (rhs.Pumps == null) |
| | | { |
| | | rhs.Pumps = new List<Model.RevitPump>(); |
| | |
| | | { |
| | | rhs.Valves = new List<Model.RevitValve>(); |
| | | } |
| | | 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 void Second(Model.RevitModel rhs) |
| | | 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 void Three(Model.RevitModel rhs) |
| | | 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 allParterList = rhs.GetAllParters(); |
| | | var startLinkParter = allParterList.Find(x => x.Code == link.StartCode); |
| | | if (startLinkParter is IRevitLink) |
| | | if (startLinkParter is RevitLink startLink) |
| | | { |
| | | var junction = new Model.RevitJunction(); |
| | | junction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Code).ToList()); |
| | |
| | | junction.DemandPattern = null; |
| | | rhs.Junctions.Add(junction); |
| | | link.StartCode = junction.Code; |
| | | (startLinkParter as IRevitLink).EndCode = junction.Code; |
| | | |
| | | if (startLink.StartCode == link.Code) |
| | | { |
| | | startLink.StartCode = junction.Code; |
| | | } |
| | | else if (startLink.EndCode == link.Code) |
| | | { |
| | | startLink.EndCode = junction.Code; |
| | | } |
| | | allParterList.Add(junction); |
| | | } |
| | | |
| | | allParterList = rhs.GetAllParters(); |
| | | var endLinkParter = allParterList.Find(x => x.Code == link.EndCode); |
| | | if (endLinkParter is IRevitLink) |
| | | if (endLinkParter is RevitLink endLink) |
| | | { |
| | | var junction = new Model.RevitJunction(); |
| | | junction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Code).ToList()); |
| | |
| | | junction.DemandPattern = null; |
| | | rhs.Junctions.Add(junction); |
| | | link.EndCode = junction.Code; |
| | | (endLinkParter as IRevitLink).StartCode = 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; |
| | | } |
| | | |
| | | } |