/* ==============================================================================
* 功能描述:连接件检查
* 创 建 者: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;
using SAGA.DotNetUtils.Extend;
using SAGA.DotNetUtils.Others;
using SAGA.RevitUtils.Extends;
using SAGA.RevitUtils.MEP;
namespace Saga.PlugIn.ModelCheck
{
///
/// UnitCheck
///
[ParseIndex(Index = 7)]
class ConnectorCheck : ModeCheckBase
{
public ConnectorCheck()
{
Name = "连接件检查";
RSPecificationSheet.Add("参考-连接件对照表");
}
public override bool Check()
{
if (!RBase.IsRight)
{
IsRight = RBase.IsRight;
return IsRight;
}
IsRight = GetCheckResult();
return IsRight;
}
private bool GetCheckResult()
{
bool unitResult = true;
m_ProDefineConnectors = GetPreDefineConnectors();
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 (var 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 string m_HaveConnectorSing = "√";
private List m_ProDefineConnectors;
public List GetPreDefineConnectors()
{
var list = new List();
var alllist = DataCheckRule.GetPreDefineConnectors();
foreach (DCR_Connector connector in alllist)
{
var pipeType = connector.PipeConnector;
var hvacType = connector.HvacConnector;
if (pipeType == m_HaveConnectorSing || hvacType == m_HaveConnectorSing)
{
list.Add(connector);
if (connector.PName.IsNotNullEmpty() && connector.PCode.IsNotNullEmpty())
{
//部件单独提出来当做一项
var pconnector = new DCR_Connector()
{
Code = connector.PCode,
Name = connector.Name,
PipeConnector = connector.PipeConnector,
HvacConnector = connector.HvacConnector
};
list.Add(pconnector);
}
}
}
return list;
}
///
/// 获取检测结果
///
///
///
private ModeCheckResultBase GetCheckResult(Element element)
{
if (element == null) return null;
var result = new ConnectorCheckResult();
var code = element.GetFamilyCode();
var defineConType = GetDefineConType(code);
if (defineConType == null) return null;
result.FamilyName = element.GetFamilyName();
result.Type = code.Length == 4 ? DCElementType.Equipment : DCElementType.EuipmentPart;
result.Id = element.Id.ToString();
result.IsRight = true;
CheckConType(result, element, defineConType.Item1);
CheckConType(result, element, defineConType.Item2);
return result;
}
///
/// 获取定义的风和水连接件类型
///
///
///
private Tuple GetDefineConType(string code)
{
var item = m_ProDefineConnectors.FirstOrDefault(t => t.Code == code);
if (item == null) return null;
var pipeType = item.PipeConnector;
var hvacType = item.HvacConnector;
var pipeConType = pipeType == m_HaveConnectorSing ? Domain.DomainPiping : Domain.DomainUndefined;
var hvacConType = hvacType == m_HaveConnectorSing ? Domain.DomainHvac : Domain.DomainUndefined;
return new Tuple(pipeConType, hvacConType);
}
///
/// 检查连接件类型是否存在
///
///
///
private void CheckConType(ConnectorCheckResult result,Element fi, Domain domain)
{
if (domain != Domain.DomainUndefined)
{
var connectors = fi.GetConnectors(domain);
if (!connectors.Any())
{
result.IsRight = false;
result.RMessage += $"缺少 {DomainToString(domain)} 连接件;";
}
else
{
if (!connectors.All(t => t.IsConnected))
{
result.IsRight = false;
result.RMessage += $"发现 {DomainToString(domain)}连接件未连接;";
}
}
}
}
private string DomainToString(Domain domain)
{
string str = "";
switch (domain)
{
case Domain.DomainPiping:
str = "水管";
break;
case Domain.DomainHvac:
str = "风管";
break;
default:
str = "未知";
break;
}
return str;
}
//[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 (ConnectorCheckResult 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.Type.GetDescription(), 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 ConnectorCheckResult : ModeCheckResultBase
{
public string FamilyName { get; set; }
public DCElementType Type { get; set; }
public string Id { get; set; }
}
}