优化ClashDetective集成,移除事务以提高性能

This commit is contained in:
tian 2026-01-13 12:33:39 +08:00
parent 779d043299
commit 0cdae60a00
2 changed files with 197 additions and 203 deletions

View File

@ -2,6 +2,11 @@
## 功能点
### [2026/1/13]
1. [ ] 优化检查API调用的线程安全问题提高插件的稳定性
2. [ ] 优化减少ClashDetective检测部分的耗时
### [2026/1/6]
1. [x] BUG虚拟车辆模型每次点击都重建

View File

@ -614,7 +614,11 @@ namespace NavisworksTransport
_currentTestName = mainTestName;
LogManager.Info($"[分组测试] 创建主测试: {mainTestName}");
// 移除事务以优化性能事务开销约30-65%
// 对于碰撞检测场景,事务的必要性很低,即使失败影响也很小
ClashTest addedMainTest = null;
Progress progress = null;
try
{
// 开始进度条ClashDetective本身会显示进度这里只提供提示信息
@ -622,9 +626,6 @@ namespace NavisworksTransport
"碰撞检测数据分析中,请稍候..."
);
// 使用事务确保操作的原子性
using (var transaction = doc.BeginTransaction("创建分组碰撞测试"))
{
// 第一步:创建主测试(不包含选择集,纯容器)
var mainTest = new ClashTest
{
@ -641,14 +642,13 @@ namespace NavisworksTransport
LogManager.Info($"[分组测试] 主测试已添加到文档");
// 获取添加后的测试对象引用
var addedMainTest = _documentClash.TestsData.Tests.FirstOrDefault(t => t.DisplayName == mainTestName) as ClashTest;
addedMainTest = _documentClash.TestsData.Tests.FirstOrDefault(t => t.DisplayName == mainTestName) as ClashTest;
if (addedMainTest == null)
{
LogManager.Error("无法获取添加后的主测试对象");
return;
}
// 第二步:创建分组并添加碰撞结果(应用智能去重)
// 1. 分组:按碰撞对象对分组
var groupedCollisions = validCollisions
@ -750,18 +750,11 @@ namespace NavisworksTransport
if (addedTempTest != null)
{
// 使用正确的PrimitiveTypes设置模式
try
{
// 设置几何类型(非关键操作,失败不影响继续执行)
var copyTest = addedTempTest.CreateCopy() as ClashTest;
copyTest.SelectionA.PrimitiveTypes = PrimitiveTypes.Triangles | PrimitiveTypes.Lines | PrimitiveTypes.Points;
copyTest.SelectionB.PrimitiveTypes = PrimitiveTypes.Triangles | PrimitiveTypes.Lines | PrimitiveTypes.Points;
_documentClash.TestsData.TestsEditTestFromCopy(addedTempTest, copyTest);
}
catch (Exception geomEx)
{
LogManager.Warning($"设置几何类型失败: {geomEx.Message}");
}
// 运行测试
_documentClash.TestsData.TestsRunTest(addedTempTest);
@ -800,15 +793,8 @@ namespace NavisworksTransport
}
}
// 删除临时测试
try
{
// 清理临时测试
_documentClash.TestsData.TestsRemove(refreshedTempTest ?? addedTempTest);
}
catch (Exception cleanEx)
{
LogManager.Warning($"清理临时测试失败: {cleanEx.Message}");
}
// 如果已确认碰撞,跳出当前候选循环,不再检测该组剩余帧
if (pairConfirmed)
@ -852,14 +838,24 @@ namespace NavisworksTransport
{
LogManager.Warning("[分组测试] 分组为空(未检测到真实几何碰撞),未添加到主测试");
}
// 提交事务
transaction.Commit();
}
}
catch (Exception groupEx)
catch (Exception ex)
{
LogManager.Error($"[分组测试] 创建分组测试失败: {groupEx.Message}");
LogManager.Error($"[分组测试] 创建分组测试失败: {ex.Message}");
// 异常时清理已创建的主测试
if (addedMainTest != null)
{
try
{
_documentClash.TestsData.TestsRemove(addedMainTest);
LogManager.Info("[分组测试] 已清理主测试");
}
catch (Exception cleanupEx)
{
LogManager.Warning($"[分组测试] 清理主测试失败: {cleanupEx.Message}");
}
}
}
finally
{
@ -910,15 +906,8 @@ namespace NavisworksTransport
RefreshClashDetectiveUI();
// 自动高亮ClashDetective结果
try
{
ModelHighlightHelper.HighlightClashDetectiveResults(_currentTestName, GetCurrentPathClashResults);
LogManager.Info("自动高亮ClashDetective检测结果完成");
}
catch (Exception clashHighlightEx)
{
LogManager.Error($"自动高亮ClashDetective结果失败: {clashHighlightEx.Message}");
}
LogManager.Info($"=== 碰撞统计最终结果 ===");
LogManager.Info($"动画过程包围盒检测: {_animationCollisionCount}个碰撞 (参考值)");