/* ============================================================================== * 功能描述:管网及相关设备检查检查 * 创 建 者:Garrett * 创建日期:2018/10/23 15:08:55 * ==============================================================================*/ using System; using System.Collections.Generic; using System.Linq; using Autodesk.Revit.DB; using NPOI.SS.UserModel; using SAGA.DotNetUtils.Extend; using SAGA.DotNetUtils.Logger; using SAGA.DotNetUtils.Others; using SAGA.RevitUtils.Extends; using SAGA.RevitUtils.MEP; namespace Saga.PlugIn.ModelCheck { /// /// /// [ParseIndex(Index = 11)] class EquipReferSystemCheck : ModeCheckBase { public EquipReferSystemCheck() { Name = "管网及相关设备检查"; RSPecificationSheet.Add("参考-管网及相关设备"); } public override bool Check() { if (!RBase.IsRight) { IsRight = RBase.IsRight; return IsRight; } IsRight = GetCheckResult(); return IsRight; } private List m_EquipReferSystems; private bool GetCheckResult() { bool unitResult = true; m_EquipReferSystems = DataCheckRule.GetEquipReferSystems(); foreach (SagaSignCheckResult signResult in RBase.Results) { var list = Check(signResult); Results.AddRange(list); } return Results.All(t => t.IsRight); } /// /// 获取所有的设备或者部件 /// /// /// private List Check(SagaSignCheckResult signResult) { List list = new List(); var elements = signResult.RDocument.GetFamilyInstances(); foreach (Element element in elements) { if (element.IsEquipment() || element.IsEquipmentPart()) { var result = GetCheckResult(element); if (result == null) continue; result.RBase = signResult; list.Add(result); } } return list; } /// /// 获取检测结果 /// /// /// private ModeCheckResultBase GetCheckResult(Element element) { var result = new EquipReferSystemCheckResult(); var code = element.GetFamilyCode(); var referSystems = GetReferSystems(code); if (referSystems.Count == 0) return null; result.FamilyName = element.GetFamilyName(); result.Id = element.Id.ToString(); var tuple = CheckConType(element, referSystems); result.IsRight = !tuple.Item2.Any(); result.PassConnectorsName += string.Join("、", tuple.Item1.ToArray()); result.UnPassConnectorsName += string.Join("、", tuple.Item2.ToArray()); if (!result.IsRight) { result.RMessage = $"连接件所连接的管道系统与规范不一致,请检查"; } return result; } /// /// 可以与设备连接的系统 /// /// /// private List GetReferSystems(string code) { var item = m_EquipReferSystems.FirstOrDefault(t => t.EquipName == code)?.Systems ?? new List(); return item; } /// /// 检查连接件连接的管道系统是否符合规范 /// /// /// private Tuple,List> CheckConType(Element element, List referSystems) { List passList=new List(); List unpassList=new List(); var connectors = element.GetAllConnectors(); foreach (Connector connector in connectors) { try { var mepSystem = connector.MEPSystem; if (mepSystem == null) continue; var elementId = mepSystem.GetTypeId(); var type = element.Document.GetElement(elementId); if (!referSystems.Contains(type.Name)) { unpassList.Add(type.Name); } else { passList.Add(type.Name); } } catch (Exception e) { Log4Net.Info($"读取连接件系统错误。Id:{element.Id},Path:{element.Document.PathName}"); } } return new Tuple, List>(passList, unpassList); } //[DataCheckProcessAspect] public override void Export() { try { IWorkbook book = DCRExport.GetWorkbook(); //ISheet sheet = book.CreateSheet(Name); ISheet sheet = book.GetSheet(Name); #region 添加数据 int index = 3; //添加 共检查XXX条数据,未通过检查的如下 提示 IRow rowTip = sheet.CreateRow(index - 1); rowTip.AddCell(0, $"总检查{Results.Count}条数据,未通过检查的如下", DataCheckNPOIStyle.Title); foreach (EquipReferSystemCheckResult result in Results) { SagaSignCheckResult rbase = result.RBase as SagaSignCheckResult; if (rbase == null) continue; //数量多过,只显示有问题的 if (result.IsRight) continue; index++; IRow rowN = sheet.CreateRow(index); DataCheckNPOIStyle style = result.IsRight ? DataCheckNPOIStyle.Content : DataCheckNPOIStyle.Error; int j = -1; rowN.AddCell(++j, result.FamilyName, style); rowN.AddCell(++j, result.Id, style); rowN.AddCell(++j, result.PassConnectorsName, style); rowN.AddCell(++j, result.UnPassConnectorsName, style); string rowN4 = result.IsRight ? "通过" : "不通过"; rowN.AddCell(++j, rowN4, style); rowN.AddCell(++j, result.RMessage, style); } #endregion } catch (Exception e) { MessageShowBase.Show(e); } } } class EquipReferSystemCheckResult : ModeCheckResultBase { public string FamilyName { get; set; } public string Id { get; set; } /// /// 通过的连接件系统名称 /// public string PassConnectorsName { get; set; } /// /// 不通过的连接件系统名称 /// public string UnPassConnectorsName { get; set; } } }