using System.IO; using System.Text; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; namespace ShrlAlgo.Addin.Test { [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] internal class CheckCollision : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { //程序UI界面 var uiapp = commandData.Application; //获取元素(选择) 显示元素 视图(活动视图)管理(对象) var uidoc = uiapp.ActiveUIDocument; //获取位置和场地 视图(多个视图)管理 获取元素(Revit 项目里的全部元素) var doc = uidoc.Document; //当前视图 var view = doc.ActiveView; var collector = new FilteredElementCollector(doc, view.Id) .OfClass(typeof(MEPCurve)) .WhereElementIsNotElementType().ToList(); // 检查管线之间的碰撞 var collisions = CheckPipeCollisionsParallel(doc, collector); // 显示碰撞结果 ShowCollisionResults(collisions); return Result.Succeeded; } public List> CheckPipeCollisionsParallel(Document doc, List pipes) { var collisions = new List>(); // 使用 Parallel.For 并行检查碰撞 Parallel.For(0, pipes.Count, i => { for (var j = i + 1; j < pipes.Count; j++) { var pipe1 = pipes[i]; var pipe2 = pipes[j]; // 使用 ElementIntersectsElementFilter 检查碰撞 var filter = new ElementIntersectsElementFilter(pipe1); var collector = new FilteredElementCollector(doc, [pipe2.Id]); collector.WherePasses(filter); if (collector.Any()) { // 如果检测到碰撞,记录下来 lock (collisions) { collisions.Add(new Tuple(pipe1, pipe2)); } } } }); return collisions; } public void ShowCollisionResults(List> collisions) { if (collisions.Count == 0) { TaskDialog.Show("碰撞检查", "未发现碰撞"); } else { var message = new StringBuilder(); message.AppendLine("发现碰撞:"); foreach (var collision in collisions) { message.AppendLine($"管线 {collision.Item1.Id} 与管线 {collision.Item2.Id} 发生碰撞"); } ExportCollisionResultsToFile(message.ToString()); //TaskDialog.Show("碰撞检查", message.ToString()); } } public void ExportCollisionResultsToFile(string content) { // 获取桌面路径 var desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); // 创建文件路径 var filePath = Path.Combine(desktopPath, "碰撞检查.txt"); // 写入文件 File.WriteAllText(filePath, content); } } }