/* ============================================================================== * 功能描述:管段检查 * 创 建 者:Garrett * 创建日期:2019/6/11 16:09:09 * ==============================================================================*/ using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using Autodesk.Revit.DB; using NPOI.SS.UserModel; using SAGA.DotNetUtils.Extend; using SAGA.DotNetUtils.Others; using SAGA.RevitUtils.Extends; using SAGA.RevitUtils.MEP; namespace Saga.PlugIn.ModelCheck { /// /// SagaCheck /// [ParseIndex(Index = 10)] class PipeCheck : ModeCheckBase { public PipeCheck() { Name = "管段检查"; } public override bool Check() { #region foreach (SagaSignCheckResult signResult in RBase.Results) { var document = signResult.RDocument; var elements = document.FilterElements().ToList(); foreach (var element in elements) { var item = new PipeCheckResult(); item.SystemName = element.GetSystemTypeName(); item.Id = element.Id.ToString(); var code = GetErrorCode(element, item.SystemName); if (IsNeedExport(code)) { item.IsRight = false; item.RMessage = GetErrorDescription(code); Results.Add(item); } } } #endregion return Results.All(t => t.IsRight); } /// /// 获取错误码 /// /// /// /// private PipeCheckErrorCode GetErrorCode(Element element,string systemName) { PipeCheckErrorCode errorCode = PipeCheckErrorCode.Code_000; Domain[] domains = new Domain[] { Domain.DomainPiping, Domain.DomainHvac }; do { foreach (Domain domain in domains) { var connectors = element.GetConnectors(domain); if (connectors.Any(c => !c.IsConnected)) { errorCode = PipeCheckErrorCode.Code_001; } } if (errorCode==PipeCheckErrorCode.Code_001&&element.GetLocationCurve() is Line line) { //一端不连接的立管不导出 if (line.Direction.IsParallel(XYZ.BasisZ)) { errorCode = PipeCheckErrorCode.Code_003; } } if (errorCode == PipeCheckErrorCode.Code_001) break; var endElements = element.GetFirstElements(null, e => e is MEPCurve || e.IsEquipment()); List curves = endElements.OfType().ToList(); foreach (var mepCurve in curves) { if (systemName != mepCurve.GetSystemTypeName()) { errorCode = PipeCheckErrorCode.Code_002; break; } } } while (false); return errorCode; } /// /// 获取错误描述 /// /// /// private string GetErrorDescription(PipeCheckErrorCode errorCode) { string description = errorCode.GetDescription()+",请检查"; return description; } /// /// 是否需要导出 /// /// /// private bool IsNeedExport(PipeCheckErrorCode errorCode) { return errorCode == PipeCheckErrorCode.Code_001 || errorCode == PipeCheckErrorCode.Code_002; } public override void Export() { try { IWorkbook book = DCRExport.GetWorkbook(); ISheet sheet = book.GetSheet(Name); #region 添加数据 int index = 3; foreach (PipeCheckResult result in Results) { //数量多过,只显示有问题的 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.SystemName, style); rowN.AddCell(++j, result.Id, style); string rowN4 = result.IsRight ? "通过" : "不通过"; rowN.AddCell(++j, rowN4, style); rowN.AddCell(++j, result.RMessage, style); } #endregion } catch (Exception e) { MessageShowBase.Show(e); } } } class PipeCheckResult : ModeCheckResultBase { /// /// id /// public string Id { get; set; } /// /// 系统名称 /// public string SystemName { get; set; } } enum PipeCheckErrorCode { [Description("管段连接正确")] Code_000, [Description("末端未连接任何设备")] Code_001, [Description("管道两端连接了不同类型的管道")] Code_002, [Description("立管")] Code_003, [Description("误报")] Code_004 } }