Files
ShrlAlgoToolkit/RvAddinTest/CheckCollision.cs
2024-10-08 16:21:39 +08:00

94 lines
3.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.IO;
using System.Text;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
namespace RvAddinTest
{
[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<Tuple<Element, Element>> CheckPipeCollisionsParallel(Document doc, List<Element> pipes)
{
var collisions = new List<Tuple<Element, Element>>();
// 使用 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<Element, Element>(pipe1, pipe2));
}
}
}
});
return collisions;
}
public void ShowCollisionResults(List<Tuple<Element, Element>> 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);
}
}
}