/* ==============================================================================
* 功能描述:saga标记检查
* 创 建 者:Garrett
* 创建日期:2018/10/23 9:01:13
* ==============================================================================*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Microsoft.Win32;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
using SAGA.DotNetUtils.Extend;
using SAGA.DotNetUtils.Others;
using SAGA.MBI.Common;
using SAGA.MBI.DataArrange;
using SAGA.MBI.Model;
using SAGA.MBI.Tools;
using SAGA.MBI.ToolsData.CheckBase;
using SAGA.RevitUtils.Extends;
namespace SAGA.MBI.ToolsData.ModeCheck
{
///
/// DocumentSagaSignCheck
///
public class SagaSignCheck : ModeCheckBase
{
///
/// 冗余--或者理解为楼板厚 单位mm
///
private double redundant;
public SagaSignCheck(double redundant = 500)
{
Name = "楼层平面图命名规范检查";
this.redundant = redundant;
RIsReadOnly = true;
RIsChecked = true;
}
#region Check
[DataCheckProcessAspect]
public override bool Check()
{
//1,首先检查saga标记和楼层编码符合建模规范要求
IsRight = CheckSagaSign();
return IsRight;
}
///
/// 检查saga标记
///
///
private bool CheckSagaSign()
{
bool allRight = true;
//获取建筑下的楼层
var floors = DalProjectTree.GetSelectedFloors();
int i = 0;
foreach (MFloor mFloor in floors)
{
//if (++i > 1) break;
var result = new SagaSignCheckResult() { Redundant = redundant };
Results.Add(result);
result.RFloorName = mFloor.ToString();
result.RFileName = mFloor.RevitName + ".rvt";
result.RPath = mFloor.FullPath;
result.RPlanName = "-";
//判断是否缺少模型文件
if (mFloor.IsMissFile)
{
result.IsRight = false;
allRight = result.IsRight;
result.RMessage = "缺少模型文件";
continue;
}
//判断是否存在Saga标记
var document = result.RDocument;
var sagaPlans = document.GetElements().Where(t => t.ViewType == ViewType.FloorPlan && t.Name.Contains("-saga"));
if (!sagaPlans.Any())
{
result.IsRight = false;
allRight = result.IsRight;
result.RMessage = "缺少saga标记";
continue;
}
else if (sagaPlans.Count() >= 2)
{
result.IsRight = false;
allRight = result.IsRight;
result.RMessage = "有多个saga标记";
continue;
}
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, @"([BF][1-9]\d*M?|RFM?)-saga"))
{
result.RSequence = mFloor.Sequence;
var rfLevel = document.GetLevels().FirstOrDefault(t => Regex.IsMatch(t.Name, @"RF(-saga)?"));
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;
allRight = result.IsRight;
result.RMessage = $"楼层 {sagaPlanName} 不符合楼层命名规范";
}
}
}
return allRight;
}
#endregion
public override void Correct()
{
throw new NotImplementedException();
}
//[DataCheckProcessAspect]
public override void Export()
{
// Check();
try
{
IWorkbook book = DCRExport.GetWorkbook(true);
//ISheet sheet = book.CreateSheet(Name);
ISheet sheet = book.GetSheet(Name);
#region 添加数据
int index = 4;
//IRow row4 = sheet.CreateRow(index);
//row4.HeightInPoints = 15;
//row4.AddCell(0, "楼层本地名称", DataCheckNPOIStyle.Title);
//row4.AddCell(1, "文件名", DataCheckNPOIStyle.Title);
//row4.AddCell(2, "文件地址", DataCheckNPOIStyle.Title);
//row4.AddCell(3, "楼层平面视图名称", DataCheckNPOIStyle.Title);
//row4.AddCell(4, "通过", DataCheckNPOIStyle.Title);
//row4.AddCell(5, "备注(失败原因)", DataCheckNPOIStyle.Title);
foreach (SagaSignCheckResult result in Results)
{
index++;
IRow rowN = sheet.CreateRow(index);
DataCheckNPOIStyle style = result.IsRight ? DataCheckNPOIStyle.Content : DataCheckNPOIStyle.Error;
rowN.AddCell(0, result.RFloorName, style);
rowN.AddCell(1, result.RFileName, style);
rowN.AddCell(2, result.RPath, style);
rowN.AddCell(3, result.RPlanName, style);
string rowN4 = result.IsRight ? "通过" : "不通过";
rowN.AddCell(4, rowN4, style);
rowN.AddCell(5, result.RMessage, style);
}
#endregion
}
catch (Exception e)
{
MessageShowBase.Show(e);
}
}
///
/// 关闭所有窗体
///
public void CloseDoc()
{
DocumentQueue.CloseAll();
}
}
}