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; } }