/* ==============================================================================
* 功能描述:管段检查
* 创 建 者: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
}
}