/* ==============================================================================
* 功能描述:管网及相关设备检查检查
* 创 建 者: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; }
}
}