using HStation.Model; namespace HStation.Service { /// /// 修正辅助类 /// public static class RevitCorrectHelper { /// /// 修正 /// public static bool Correct(this Model.RevitModel rhs, ref List msgList) { if (rhs == null) { return false; } if (msgList == null) { msgList = new List(); } var result = true; if (!CorrectCollection(rhs, ref msgList)) {//修正集合 result = false; } if (!CorrectName(rhs, ref msgList)) {//修正名称 result = false; } if (!CorrectExchanger(rhs, ref msgList)) {//修正换热器 result = false; } if (!CorrectCompressor(rhs, ref msgList)) {//修正空压机 result = false; } if (!CorrectCode(rhs, ref msgList)) {//修正编码 result = false; } if (!CorrectLink(rhs, ref msgList)) {//修正连接 result = false; } return result; } //修正集合 private static bool CorrectCollection(Model.RevitModel rhs, ref List msgList) { if (rhs == null) { return false; } if (msgList == null) { msgList = new List(); } 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.Junctions = new List(); } if (rhs.Bluntheads == null) {//闷头 rhs.Bluntheads = 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.Nozzles == null) {//喷头 rhs.Nozzles = new List(); } if (rhs.Hydrants == null) {//消火栓 rhs.Hydrants = 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.Pipes == null) {//管道 rhs.Pipes = new List(); } if (rhs.Translations == null) {//过渡件 rhs.Translations = new List(); } if (rhs.Pumps == null) {//水泵 rhs.Pumps = new List(); } if (rhs.Valves == null) {//阀门 rhs.Valves = new List(); } if (rhs.Exchangers == null) {//换热器 rhs.Exchangers = new List(); } if (rhs.Compressors == null) {//空压机 rhs.Compressors = new List(); } return true; } //修正名称 private static bool CorrectName(Model.RevitModel rhs, ref List msgList) { if (rhs == null) { return false; } if (msgList == null) { msgList = new List(); } if (rhs.Reservoirs != null && rhs.Reservoirs.Count > 0) {//水库 var reservoirNameList = rhs.Reservoirs.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var reservoir in rhs.Reservoirs) { if (string.IsNullOrEmpty(reservoir.Name)) { var reservoirName = Yw.Untity.UniqueHelper.CreateFromFirst("水库", reservoirNameList); reservoir.Name = reservoirName; reservoirNameList.Add(reservoirName); } } } if (rhs.Tanks != null && rhs.Tanks.Count > 0) {//水池 var tankNameList = rhs.Tanks.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var tank in rhs.Tanks) { if (string.IsNullOrEmpty(tank.Name)) { var tankName = Yw.Untity.UniqueHelper.CreateFromFirst("水池", tankNameList); tank.Name = tankName; tankNameList.Add(tankName); } } } if (rhs.Waterboxs != null && rhs.Waterboxs.Count > 0) {//水箱 var waterboxNameList = rhs.Waterboxs.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var waterbox in rhs.Waterboxs) { if (string.IsNullOrEmpty(waterbox.Name)) { var waterboxName = Yw.Untity.UniqueHelper.CreateFromFirst("水箱", waterboxNameList); waterbox.Name = waterboxName; waterboxNameList.Add(waterboxName); } } } if (rhs.Junctions != null && rhs.Junctions.Count > 0) {//连接节点 var junctionNameList = rhs.Junctions.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var junction in rhs.Junctions) { if (string.IsNullOrEmpty(junction.Name)) { var junctionName = Yw.Untity.UniqueHelper.CreateFromFirst("连接节点", junctionNameList); junction.Name = junctionName; junctionNameList.Add(junctionName); } } } if (rhs.Bluntheads != null && rhs.Bluntheads.Count > 0) {//闷头 var bluntheadNameList = rhs.Bluntheads.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var blunthead in rhs.Bluntheads) { if (string.IsNullOrEmpty(blunthead.Name)) { var bluntheadName = Yw.Untity.UniqueHelper.CreateFromFirst("闷头", bluntheadNameList); blunthead.Name = bluntheadName; bluntheadNameList.Add(bluntheadName); } } } if (rhs.Elbows != null && rhs.Elbows.Count > 0) {//弯头 var elbowNameList = rhs.Elbows.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var elbow in rhs.Elbows) { if (string.IsNullOrEmpty(elbow.Name)) { var elbowName = Yw.Untity.UniqueHelper.CreateFromFirst("弯头", elbowNameList); elbow.Name = elbowName; elbowNameList.Add(elbowName); } } } if (rhs.Threelinks != null && rhs.Threelinks.Count > 0) {//三通 var threelinkNameList = rhs.Threelinks.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var threelink in rhs.Threelinks) { if (string.IsNullOrEmpty(threelink.Name)) { var threelinkName = Yw.Untity.UniqueHelper.CreateFromFirst("三通", threelinkNameList); threelink.Name = threelinkName; threelinkNameList.Add(threelinkName); } } } if (rhs.Fourlinks != null && rhs.Fourlinks.Count > 0) {//四通 var fourlinkNameList = rhs.Fourlinks.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var fourlink in rhs.Fourlinks) { if (string.IsNullOrEmpty(fourlink.Name)) { var fourlinkName = Yw.Untity.UniqueHelper.CreateFromFirst("四通", fourlinkNameList); fourlink.Name = fourlinkName; fourlinkNameList.Add(fourlinkName); } } } if (rhs.Nozzles != null && rhs.Nozzles.Count > 0) {//喷头 var nozzleNameList = rhs.Nozzles.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var nozzle in rhs.Nozzles) { if (string.IsNullOrEmpty(nozzle.Name)) { var nozzleName = Yw.Untity.UniqueHelper.CreateFromFirst("喷头", nozzleNameList); nozzle.Name = nozzleName; nozzleNameList.Add(nozzleName); } } } if (rhs.Hydrants != null && rhs.Hydrants.Count > 0) {//消火栓 var hydrantNameList = rhs.Hydrants.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var hydrant in rhs.Hydrants) { if (string.IsNullOrEmpty(hydrant.Name)) { var hydrantName = Yw.Untity.UniqueHelper.CreateFromFirst("消火栓", hydrantNameList); hydrant.Name = hydrantName; hydrantNameList.Add(hydrantName); } } } if (rhs.Meters != null && rhs.Meters.Count > 0) {//水表 var meterNameList = rhs.Meters.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var meter in rhs.Meters) { if (string.IsNullOrEmpty(meter.Name)) { var meterName = Yw.Untity.UniqueHelper.CreateFromFirst("水表", meterNameList); meter.Name = meterName; meterNameList.Add(meterName); } } } if (rhs.Flowmeters != null && rhs.Flowmeters.Count > 0) {//流量计 var flowmeterNameList = rhs.Flowmeters.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var flowmeter in rhs.Flowmeters) { if (string.IsNullOrEmpty(flowmeter.Name)) { var flowmeterName = Yw.Untity.UniqueHelper.CreateFromFirst("流量计", flowmeterNameList); flowmeter.Name = flowmeterName; flowmeterNameList.Add(flowmeterName); } } } if (rhs.Pressmeters != null && rhs.Pressmeters.Count > 0) {//压力表 var pressmeterNameList = rhs.Pressmeters.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var pressmeter in rhs.Pressmeters) { if (string.IsNullOrEmpty(pressmeter.Name)) { var pressmeterName = Yw.Untity.UniqueHelper.CreateFromFirst("压力表", pressmeterNameList); pressmeter.Name = pressmeterName; pressmeterNameList.Add(pressmeterName); } } } if (rhs.Pipes != null && rhs.Pipes.Count > 0) {//管道 var pipeNameList = rhs.Pipes.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var pipe in rhs.Pipes) { if (string.IsNullOrEmpty(pipe.Name)) { var pipeName = Yw.Untity.UniqueHelper.CreateFromFirst("管道", pipeNameList); pipe.Name = pipeName; pipeNameList.Add(pipeName); } } } if (rhs.Translations != null && rhs.Translations.Count > 0) {//过渡件 var translationNameList = rhs.Translations.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var translation in rhs.Translations) { if (string.IsNullOrEmpty(translation.Name)) { var translationName = Yw.Untity.UniqueHelper.CreateFromFirst("过渡件", translationNameList); translation.Name = translationName; translationNameList.Add(translationName); } } } if (rhs.Pumps != null && rhs.Pumps.Count > 0) {//水泵 var pumpNameList = rhs.Pumps.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var pump in rhs.Pumps) { if (string.IsNullOrEmpty(pump.Name)) { var pumpName = Yw.Untity.UniqueHelper.CreateFromFirst("水泵", pumpNameList); pump.Name = pumpName; pumpNameList.Add(pumpName); } } } if (rhs.Valves != null && rhs.Valves.Count > 0) {//阀门 var valveNameList = rhs.Valves.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var valve in rhs.Valves) { if (string.IsNullOrEmpty(valve.Name)) { var valveName = Yw.Untity.UniqueHelper.CreateFromFirst("阀门", valveNameList); valve.Name = valveName; valveNameList.Add(valveName); } } } if (rhs.Exchangers != null && rhs.Exchangers.Count > 0) {//换热器 var exchangerNameList = rhs.Exchangers.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var exchanger in rhs.Exchangers) { if (string.IsNullOrEmpty(exchanger.Name)) { var exchangerName = Yw.Untity.UniqueHelper.CreateFromFirst("换热器", exchangerNameList); exchanger.Name = exchangerName; exchangerNameList.Add(exchangerName); } } } if (rhs.Compressors != null && rhs.Compressors.Count > 0) {//空压机 var compressorNameList = rhs.Compressors.Where(x => !string.IsNullOrEmpty(x.Name)).Select(x => x.Name).Distinct().ToList(); foreach (var compressor in rhs.Compressors) { if (string.IsNullOrEmpty(compressor.Name)) { var compressorName = Yw.Untity.UniqueHelper.CreateFromFirst("空压机", compressorNameList); compressor.Name = compressorName; compressorNameList.Add(compressorName); } } } return true; } //修复换热器 private static bool CorrectExchanger(Model.RevitModel rhs, ref List msgList) { if (rhs == null) { return false; } if (msgList == null) { msgList = new List(); } var result = true; 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) { #region 去除无效连接和闷头 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.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); } } } #endregion #region 开始连接 var startConnectList = exchanger.ConnectList.GetStartConnects(); if (startConnectList.Count < 1) { var startConnect = exchanger.ConnectList.GetStartConnect(); if (startConnect != null) { startConnectList.Add(startConnect); } } if (startConnectList.Count < 1) { msgList.Add($"换热器[{exchanger.Id}]上游连接组件不存在"); result = false; continue; } var startJunction = new Model.RevitJunction(); startJunction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Id).ToList()); startJunction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList()); startJunction.Flags = null; startJunction.ModelType = null; startJunction.Description = "换热器修正时,自动添加"; startJunction.Position = startConnectList.GetCenterPosition(); startJunction.Elev = exchanger.Elev; startJunction.Demand = null; startJunction.DemandPattern = null; rhs.Junctions.Add(startJunction); exchanger.StartCode = startJunction.Id; 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); #endregion #region 结束连接 var endConnectList = exchanger.ConnectList.GetEndConnects(); if (endConnectList.Count < 1) { var endConnect = exchanger.ConnectList.GetEndConnect(); if (endConnect != null) { endConnectList.Add(endConnect); } } if (endConnectList.Count < 1) { msgList.Add($"换热器[{exchanger.Id}]下游连接组件不存在"); result = false; continue; } var endJunction = new Model.RevitJunction(); endJunction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Id).ToList()); endJunction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList()); endJunction.Flags = null; endJunction.ModelType = null; endJunction.Description = "换热器修正时,自动添加"; endJunction.Position = endConnectList.GetCenterPosition(); endJunction.Elev = exchanger.Elev; endJunction.Demand = null; endJunction.DemandPattern = null; rhs.Junctions.Add(endJunction); exchanger.EndCode = endJunction.Id; 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); #endregion } else { msgList.Add($"换热器[{exchanger.Id}]连接列表为空"); result = false; } } } return result; } //修复空压机 private static bool CorrectCompressor(Model.RevitModel rhs, ref List msgList) { if (rhs == null) { return false; } if (msgList == null) { msgList = new List(); } var result = true; if (rhs.Compressors != null && rhs.Compressors.Count > 0) { var allParterList = rhs.GetAllParters(); foreach (var compressor in rhs.Compressors) { if (compressor.ConnectList != null && compressor.ConnectList.Count > 0) { #region 去除无效连接和闷头 foreach (var connect in compressor.ConnectList.ToList()) { var connectParter = allParterList.Find(x => x.Id == connect.Id); if (connectParter == null) { compressor.ConnectList.Remove(connect); } else { if (connectParter is RevitBlunthead blunthead) { var decorator = new Model.RevitDecorator(); decorator.Id = blunthead.Id; 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); } } } #endregion #region 开始连接 var startConnectList = compressor.ConnectList.GetStartConnects(); if (startConnectList.Count < 1) { var startConnect = compressor.ConnectList.GetStartConnect(); if (startConnect != null) { startConnectList.Add(startConnect); } } if (startConnectList.Count < 1) { msgList.Add($"空压机[{compressor.Id}]上游连接组件不存在"); result = false; continue; } var startJunction = new Model.RevitJunction(); startJunction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Id).ToList()); startJunction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList()); startJunction.Flags = null; startJunction.ModelType = null; startJunction.Description = "空压机修正时,自动添加"; startJunction.Position = startConnectList.GetCenterPosition(); startJunction.Elev = compressor.Elev; startJunction.Demand = null; startJunction.DemandPattern = null; rhs.Junctions.Add(startJunction); compressor.StartCode = startJunction.Id; foreach (var startConnect in startConnectList) { var startConnectParter = allParterList.Find(x => x.Id == startConnect.Id); if (startConnectParter is RevitLink revitLink) { if (revitLink.StartCode == compressor.Id) { revitLink.StartCode = startJunction.Id; } else if (revitLink.EndCode == compressor.Id) { revitLink.EndCode = startJunction.Id; } } } allParterList.Add(startJunction); #endregion #region 结束连接 var endConnectList = compressor.ConnectList.GetEndConnects(); if (endConnectList.Count < 1) { var endConnect = compressor.ConnectList.GetEndConnect(); if (endConnect != null) { endConnectList.Add(endConnect); } } if (endConnectList.Count < 1) { msgList.Add($"空压机[{compressor.Id}]下游连接组件不存在"); result = false; continue; } var endJunction = new Model.RevitJunction(); endJunction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Id).ToList()); endJunction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList()); endJunction.Flags = null; endJunction.ModelType = null; endJunction.Description = "空压机修正时,自动添加"; endJunction.Position = endConnectList.GetCenterPosition(); endJunction.Elev = compressor.Elev; endJunction.Demand = null; endJunction.DemandPattern = null; rhs.Junctions.Add(endJunction); compressor.EndCode = endJunction.Id; foreach (var endConnect in endConnectList) { var endConnectParter = allParterList.Find(x => x.Id == endConnect.Id); if (endConnectParter is RevitLink revitLink) { if (revitLink.StartCode == compressor.Id) { revitLink.StartCode = endJunction.Id; } else if (revitLink.EndCode == compressor.Id) { revitLink.EndCode = endJunction.Id; } } } allParterList.Add(endJunction); #endregion } else { msgList.Add($"空压机[{compressor.Id}]连接列表为空"); result = false; } } } return result; } //修正编码 private static bool CorrectCode(Model.RevitModel rhs, ref List msgList) { if (rhs == null) { return false; } if (msgList == null) { msgList = new List(); } var result = true; 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) { msgList.Add($"管段:[{link.Id}]上游节点[{link.StartCode}]错误"); result = false; } else { link.StartCode = startLinkParter.Id; } var endLinkParter = allParterList.Find(x => x.Id == link.EndCode); if (endLinkParter == null) { msgList.Add($"管段:[{link.Id}]下游节点[{link.EndCode}]错误"); result = false; } else { link.EndCode = endLinkParter.Id; } } return result; } //修正连接 private static bool CorrectLink(Model.RevitModel rhs, ref List msgList) { if (rhs == null) { return false; } if (msgList == null) { msgList = new List(); } var allParterList = rhs.GetAllParters(); var allLinks = rhs.GetAllLinks(); foreach (var link in allLinks) { var startLinkParter = allParterList.Find(x => x.Id == link.StartCode); if (startLinkParter is RevitLink startLink) { var junction = new Model.RevitJunction(); junction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Id).ToList()); junction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList()); junction.Flags = null; junction.ModelType = null; junction.Description = "水力修正时,自动添加"; junction.Position = link.StartPosition; junction.Elev = link.StartPosition.Z; junction.Demand = null; junction.DemandPattern = null; rhs.Junctions.Add(junction); link.StartCode = junction.Id; if (startLink.StartCode == link.Id) { startLink.StartCode = junction.Id; } else if (startLink.EndCode == link.Id) { startLink.EndCode = junction.Id; } allParterList.Add(junction); } var endLinkParter = allParterList.Find(x => x.Id == link.EndCode); if (endLinkParter is RevitLink endLink) { var junction = new Model.RevitJunction(); junction.Id = Yw.Untity.UniqueHelper.CreateFromFirst("junction", allParterList.Select(x => x.Id).ToList()); junction.Name = UniqueHelper.CreateFromFirst("连接节点", allParterList.Select(x => x.Name).Distinct().ToList()); junction.Flags = null; junction.ModelType = null; junction.Description = "水力修正时,自动添加"; junction.Position = link.EndPosition; junction.Elev = link.EndPosition.Z; junction.Demand = null; junction.DemandPattern = null; rhs.Junctions.Add(junction); link.EndCode = junction.Id; if (endLink.StartCode == link.Id) { endLink.StartCode = junction.Id; } else if (endLink.EndCode == link.Id) { endLink.EndCode = junction.Id; } allParterList.Add(junction); } } return true; } } }