99 lines
3.4 KiB
C#
99 lines
3.4 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// Revit执行命令
|
|
/// </summary>
|
|
[Transaction(TransactionMode.Manual)]
|
|
|
|
public class HeadroomCheckCmd : ExternalCommand
|
|
{
|
|
public override void Execute()
|
|
{
|
|
var elems = UiDocument.Selection.PickElementsByRectangle(new FuncFilter(e => e is MEPCurve, (_, _) => true)).OfType<MEPCurve>();
|
|
var messages = new List<MessageModel>();
|
|
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<Connector>().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;
|
|
}
|
|
}
|