/* ==============================================================================
* 功能描述:saga标记检查
* 创 建 者:Garrett
* 创建日期:2018/10/23 9:01:13
* ==============================================================================*/
using System;
using System.Linq;
using System.Text.RegularExpressions;
using Autodesk.Revit.DB;
using FWindSoft.Revit;
using NPOI.SS.UserModel;
using SAGA.DotNetUtils.Extend;
using SAGA.DotNetUtils.Others;
using SAGA.RevitUtils.Extends;
namespace Saga.PlugIn.ModelCheck
{
///
/// DocumentSagaSignCheck
///
[ParseIgnore]
public class SagaSignCheck : ModeCheckBase
{
///
/// 冗余--或者理解为楼板厚 单位mm
///
private double redundant;
public SagaSignCheck(double redundant = 500)
{
Name = "楼层平面图命名规范检查";
this.redundant = redundant;
RIsChecked = true;
}
#region Check
public override bool Check()
{
//1,首先检查saga标记和楼层编码符合建模规范要求
IsRight = CheckSagaSign();
return IsRight;
}
///
/// 检查saga标记
///
///
private bool CheckSagaSign()
{
//获取建筑下的楼层
var document = m_Document;
var result = new SagaSignCheckResult() { Redundant = redundant };
result.RDocument = document;
Results.Add(result);
result.RPlanName = "-";
//判断是否存在Saga标记
var sagaPlans = DocumentExtend.GetElements(document).Where(t => t.ViewType == ViewType.FloorPlan && t.Name.Contains("-saga"));
do
{
if (!sagaPlans.Any())
{
result.IsRight = false;
result.RMessage = "缺少saga标记";
break;
}
else if (sagaPlans.Count() >= 2)
{
result.IsRight = false;
result.RMessage = "有多个saga标记";
break;
}
else
{
//只有一个saga标记
var sagaPlan = sagaPlans.FirstOrDefault();
string sagaPlanName = sagaPlan.Name;
result.RPlanName = sagaPlanName;
result.HBase = sagaPlan.GenLevel.Elevation;
//打标记的楼层名称必需为指定格式;B1,B1M,F1,F1M,RFM,RF
if (Regex.IsMatch(sagaPlanName, $"{ModelCheckConst.IsMBIView}"))
{
var rfLevel = document.GetLevels().FirstOrDefault(t => System.Text.RegularExpressions.Regex.IsMatch(t.Name, $"{ModelCheckConst.IsRF}"));
if (rfLevel == null)
{
result.IsRight = false;
result.RMessage = $"缺少RF标高";
}
else
{
if (rfLevel.Elevation.IsThanEq(result.HBase))
{
result.IsRight = true;
}
else
{
result.IsRight = false;
result.RMessage = $"RF标高的位置不正确,请检查";
}
}
}
else
{
result.IsRight = false;
result.RMessage = $"楼层 {sagaPlanName} 不符合楼层命名规范";
}
}
} while (false);
return Results.All(t => t.IsRight);
}
#endregion
//[DataCheckProcessAspect]
public override void Export()
{
try
{
IWorkbook book = DCRExport.GetWorkbook(true);
//ISheet sheet = book.CreateSheet(Name);
ISheet sheet = book.GetSheet(Name);
#region 添加数据
int index = 4;
foreach (SagaSignCheckResult result in Results)
{
index++;
int j = -1;
IRow rowN = sheet.CreateRow(index);
DataCheckNPOIStyle style = result.IsRight ? DataCheckNPOIStyle.Content : DataCheckNPOIStyle.Error;
rowN.AddCell(++j, result.RPlanName, style);
string rowN4 = result.IsRight ? "通过" : "不通过";
rowN.AddCell(++j, rowN4, style);
rowN.AddCell(++j, result.RMessage, style);
}
#endregion
}
catch (Exception e)
{
MessageShowBase.Show(e);
}
}
}
class SagaSignCheckResult : ModeCheckResultBase
{
private Document m_RDocument;
public Document RDocument
{
get
{
return m_RDocument;
}
set { m_RDocument = value; }
}
///
/// 楼层平面名称
///
public string RPlanName { get; set; }
///
/// 当前层的标高高度,所有比较的单位都是英寸
///
public double HBase { get; set; }
#region RangePassRate
///
/// 构件范围检查通过率
///
public double RCPassRate { get; set; }
public double ColumnWallPassRate { get; set; }
public double SpacePassRate { get; set; }
public double InstPassRate { get; set; }
#endregion
///
/// 冗余--或者理解为楼板厚(单位mm)
///
public double Redundant { get; set; }
public override void Export()
{
base.Export();
}
}
}