using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Electrical;
using Autodesk.Revit.DB.Mechanical;
using Autodesk.Revit.DB.Plumbing;
using Nice3point.Revit.Toolkit.External;
using System;
using System.Linq;
using System.Windows;
namespace Szmedi.RvKits.ModelManager;
///
/// Revit执行命令
///
[Transaction(TransactionMode.Manual)]
public class HeadroomCheckCmd : ExternalCommand
{
public override void Execute()
{
var elems = UiDocument.Selection.PickElementsByRectangle(new FuncFilter(e => e is MEPCurve, (_, _) => true)).OfType();
var messages = new List();
double compare = 2600 / 304.8;
foreach (var item in elems)
{
var level = item.ReferenceLevel;
if (item is Duct duct && item.get_Parameter(BuiltInParameter.RBS_DUCT_SLOPE).HasValue)
{
var p1 = item.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM).AsDouble();
double subtract = default;
switch (duct.ConnectorManager.Connectors.OfType().FirstOrDefault().Shape)
{
case ConnectorProfileType.Round:
subtract = duct.Diameter / 2;
break;
case ConnectorProfileType.Rectangular:
case ConnectorProfileType.Oval:
subtract = duct.Height / 2;
break;
}
if (LessThen(p1 - subtract, compare))
{
MessageModel checkElement = new(item, $"参照标高:{level.Name}\r\n--------\r\n底高程:{Math.Round((p1 - subtract) * 304.8)}");
messages.Add(checkElement);
}
}
if (item is Pipe pipe && item.get_Parameter(BuiltInParameter.RBS_PIPE_SLOPE).HasValue)
{
var p1 = item.get_Parameter(BuiltInParameter.RBS_OFFSET_PARAM).AsDouble();
if (LessThen(p1 - (pipe.Diameter / 2), compare))
{
MessageModel checkElement = new(item, $"参照标高:{level.Name}\r\n底高程:{Math.Round((p1 - (pipe.Diameter / 2)) * 304.8)}");
messages.Add(checkElement);
}
}
if (item is Conduit conduit || item is CableTray)
{
var p1 = item.get_Parameter(BuiltInParameter.RBS_START_OFFSET_PARAM).AsDouble();
var p2 = item.get_Parameter(BuiltInParameter.RBS_END_OFFSET_PARAM).AsDouble();
if (Math.Abs(p1 - p2) < 0.00001)
{
var p3 = item.get_Parameter(BuiltInParameter.RBS_CTC_BOTTOM_ELEVATION).AsDouble();
if (LessThen(p3, compare))
{
MessageModel checkElement = new(item, $"参照标高:{level.Name}\r\n底高程:{Math.Round(p3 * 304.8)}");
messages.Add(checkElement);
}
}
}
}
try
{
MessageWin win = new() { DataContext = new MessageViewModel(UiDocument, messages) };
win.Show();
}
catch (Exception e)
{
MessageBox.Show(e.Message);
LogAssists.WriteLog(e.StackTrace);
}
}
private bool LessThen(double value, double compare)
{
return compare > value;
}
}