Fix batch queue detection record snapshots
This commit is contained in:
parent
c9a926356c
commit
a651b69459
@ -391,6 +391,11 @@ namespace NavisworksTransport.Core
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
if (!item.DetectionRecordId.HasValue)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("批处理队列项缺少 DetectionRecordId,无法保存完整碰撞结果和位姿数据。请重新生成动画后再加入批处理。");
|
||||||
|
}
|
||||||
|
|
||||||
var pathRoute = await _database.GetPathRouteAsync(item.RouteId);
|
var pathRoute = await _database.GetPathRouteAsync(item.RouteId);
|
||||||
if (pathRoute == null)
|
if (pathRoute == null)
|
||||||
{
|
{
|
||||||
@ -1072,4 +1077,4 @@ namespace NavisworksTransport.Core
|
|||||||
{
|
{
|
||||||
public BatchQueueItem Item { get; set; }
|
public BatchQueueItem Item { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3134,126 +3134,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
|||||||
LogManager.Info($"[检测记录] 用户选择重新生成,创建新记录");
|
LogManager.Info($"[检测记录] 用户选择重新生成,创建新记录");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成测试名称(将在ClashDetective完成后更新为正式名称)
|
int recordId = CreateCollisionDetectionRecordSnapshot("动画生成", bindToAnimationManager: true);
|
||||||
string testName = $"动画检测_{DateTime.Now:MMdd_HHmmssfff}";
|
|
||||||
|
|
||||||
// 创建检测记录
|
|
||||||
var record = new CollisionDetectionRecord
|
|
||||||
{
|
|
||||||
RouteId = routeId,
|
|
||||||
CreatedTime = DateTime.Now,
|
|
||||||
FrameRate = _animationFrameRate,
|
|
||||||
DurationSeconds = AnimationDuration,
|
|
||||||
// 检测容差:UI为米单位,内部使用模型单位
|
|
||||||
DetectionTolerance = _detectionTolerance * UnitsConverter.GetMetersToUnitsConversionFactor(),
|
|
||||||
IsVirtualObject = UseVirtualObject,
|
|
||||||
AnimatedObjectName = UseVirtualObject ? "虚拟物体" : SelectedAnimatedObject?.DisplayName,
|
|
||||||
DetectAllObjects = !IsManualCollisionTargetEnabled,
|
|
||||||
ObjectRotationCorrection = _objectRotationCorrection,
|
|
||||||
Description = $"动画生成于 {DateTime.Now:yyyy-MM-dd HH:mm:ss}",
|
|
||||||
// 设置碰撞检测相关字段
|
|
||||||
TestName = testName,
|
|
||||||
TestTime = DateTime.Now,
|
|
||||||
CollisionCount = 0, // 初始为0,将在ClashDetective完成后更新
|
|
||||||
AnimationCollisionCount = 0
|
|
||||||
};
|
|
||||||
|
|
||||||
// 虚拟物体尺寸(米 → 模型单位,数据库存储模型单位)
|
|
||||||
if (UseVirtualObject)
|
|
||||||
{
|
|
||||||
double metersToUnits = UnitsConverter.GetMetersToUnitsConversionFactor();
|
|
||||||
record.VirtualObjectLength = VirtualObjectLengthInMeters * metersToUnits;
|
|
||||||
record.VirtualObjectWidth = VirtualObjectWidthInMeters * metersToUnits;
|
|
||||||
record.VirtualObjectHeight = VirtualObjectHeightInMeters * metersToUnits;
|
|
||||||
}
|
|
||||||
// 真实物体信息
|
|
||||||
else if (SelectedAnimatedObject != null)
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var pathId = Autodesk.Navisworks.Api.Application.ActiveDocument.Models.CreatePathId(SelectedAnimatedObject);
|
|
||||||
record.ObjectModelIndex = pathId.ModelIndex;
|
|
||||||
record.ObjectPathId = pathId.PathId;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
LogManager.Warning($"[检测记录] 获取运动物体PathId失败: {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 保存检测记录
|
|
||||||
int recordId = pathDatabase.SaveCollisionDetectionRecord(record);
|
|
||||||
LogManager.Info($"[检测记录] 已创建记录 (Id={recordId})");
|
|
||||||
|
|
||||||
// 🔥 设置当前检测记录ID到PathAnimationManager(供碰撞结果保存时关联使用)
|
|
||||||
_pathAnimationManager.CurrentDetectionRecordId = recordId;
|
|
||||||
_pathAnimationManager.IsUsingHistoryRecord = false; // 新记录,不是历史记录
|
|
||||||
|
|
||||||
// 保存排除列表
|
|
||||||
var excludedObjects = _pathAnimationManager?.GetExcludedObjects();
|
|
||||||
if (excludedObjects != null && excludedObjects.Count > 0)
|
|
||||||
{
|
|
||||||
var excludedRecords = new List<CollisionDetectionExcludedObjectRecord>();
|
|
||||||
foreach (var obj in excludedObjects)
|
|
||||||
{
|
|
||||||
if (obj == null) continue;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var pathId = Autodesk.Navisworks.Api.Application.ActiveDocument.Models.CreatePathId(obj);
|
|
||||||
excludedRecords.Add(new CollisionDetectionExcludedObjectRecord
|
|
||||||
{
|
|
||||||
DetectionRecordId = recordId,
|
|
||||||
ModelIndex = pathId.ModelIndex,
|
|
||||||
PathId = pathId.PathId,
|
|
||||||
DisplayName = obj.DisplayName,
|
|
||||||
ObjectName = obj.DisplayName,
|
|
||||||
Reason = "预计算碰撞分析排除"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
LogManager.Warning($"[检测记录] 准备排除对象记录失败: {obj.DisplayName}, {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (excludedRecords.Count > 0)
|
|
||||||
{
|
|
||||||
pathDatabase.SaveCollisionDetectionExcludedObjects(recordId, excludedRecords);
|
|
||||||
LogManager.Info($"[检测记录] 已保存 {excludedRecords.Count} 个排除对象");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 保存手工目标
|
|
||||||
if (IsManualCollisionTargetEnabled && _manualCollisionTargets != null && _manualCollisionTargets.Count > 0)
|
|
||||||
{
|
|
||||||
var manualTargetRecords = new List<CollisionDetectionManualTargetRecord>();
|
|
||||||
foreach (var target in _manualCollisionTargets)
|
|
||||||
{
|
|
||||||
if (target?.ModelItem == null) continue;
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var pathId = Autodesk.Navisworks.Api.Application.ActiveDocument.Models.CreatePathId(target.ModelItem);
|
|
||||||
manualTargetRecords.Add(new CollisionDetectionManualTargetRecord
|
|
||||||
{
|
|
||||||
DetectionRecordId = recordId,
|
|
||||||
ModelIndex = pathId.ModelIndex,
|
|
||||||
PathId = pathId.PathId,
|
|
||||||
DisplayName = target.ModelItem.DisplayName,
|
|
||||||
ObjectName = target.ModelItem.DisplayName
|
|
||||||
});
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
LogManager.Warning($"[检测记录] 准备手工目标记录失败: {target.DisplayName}, {ex.Message}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (manualTargetRecords.Count > 0)
|
|
||||||
{
|
|
||||||
pathDatabase.SaveCollisionDetectionManualTargets(recordId, manualTargetRecords);
|
|
||||||
LogManager.Info($"[检测记录] 已保存 {manualTargetRecords.Count} 个手工目标");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 🔥 注册动画配置哈希与检测记录ID的映射(用于后续检查重复配置)
|
// 🔥 注册动画配置哈希与检测记录ID的映射(用于后续检查重复配置)
|
||||||
try
|
try
|
||||||
@ -3280,6 +3161,136 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建碰撞检测记录快照。
|
||||||
|
/// 生成动画和批处理都应该创建自己的配置快照,不依赖旧检测结果。
|
||||||
|
/// </summary>
|
||||||
|
private int CreateCollisionDetectionRecordSnapshot(string scenarioName, bool bindToAnimationManager)
|
||||||
|
{
|
||||||
|
var pathDatabase = _pathPlanningManager?.GetPathDatabase();
|
||||||
|
if (pathDatabase == null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException("数据库未初始化,无法保存检测记录");
|
||||||
|
}
|
||||||
|
|
||||||
|
string routeId = CurrentPathRoute?.Id ?? string.Empty;
|
||||||
|
string testName = $"{scenarioName}_{DateTime.Now:MMdd_HHmmssfff}";
|
||||||
|
double metersToUnits = UnitsConverter.GetMetersToUnitsConversionFactor();
|
||||||
|
|
||||||
|
var record = new CollisionDetectionRecord
|
||||||
|
{
|
||||||
|
RouteId = routeId,
|
||||||
|
CreatedTime = DateTime.Now,
|
||||||
|
FrameRate = _animationFrameRate,
|
||||||
|
DurationSeconds = AnimationDuration,
|
||||||
|
DetectionTolerance = _detectionTolerance * metersToUnits,
|
||||||
|
IsVirtualObject = UseVirtualObject,
|
||||||
|
AnimatedObjectName = UseVirtualObject ? "虚拟物体" : SelectedAnimatedObject?.DisplayName,
|
||||||
|
DetectAllObjects = !IsManualCollisionTargetEnabled,
|
||||||
|
ObjectRotationCorrection = _objectRotationCorrection,
|
||||||
|
Description = $"{scenarioName}于 {DateTime.Now:yyyy-MM-dd HH:mm:ss}",
|
||||||
|
TestName = testName,
|
||||||
|
TestTime = DateTime.Now,
|
||||||
|
CollisionCount = 0,
|
||||||
|
AnimationCollisionCount = 0
|
||||||
|
};
|
||||||
|
|
||||||
|
if (UseVirtualObject)
|
||||||
|
{
|
||||||
|
record.VirtualObjectLength = VirtualObjectLengthInMeters * metersToUnits;
|
||||||
|
record.VirtualObjectWidth = VirtualObjectWidthInMeters * metersToUnits;
|
||||||
|
record.VirtualObjectHeight = VirtualObjectHeightInMeters * metersToUnits;
|
||||||
|
}
|
||||||
|
else if (SelectedAnimatedObject != null)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pathId = Autodesk.Navisworks.Api.Application.ActiveDocument.Models.CreatePathId(SelectedAnimatedObject);
|
||||||
|
record.ObjectModelIndex = pathId.ModelIndex;
|
||||||
|
record.ObjectPathId = pathId.PathId;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogManager.Warning($"[检测记录] 获取运动物体PathId失败: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int recordId = pathDatabase.SaveCollisionDetectionRecord(record);
|
||||||
|
LogManager.Info($"[检测记录] 已创建{scenarioName}记录 (Id={recordId})");
|
||||||
|
|
||||||
|
if (bindToAnimationManager)
|
||||||
|
{
|
||||||
|
_pathAnimationManager.CurrentDetectionRecordId = recordId;
|
||||||
|
_pathAnimationManager.IsUsingHistoryRecord = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var excludedObjects = _pathAnimationManager?.GetExcludedObjects();
|
||||||
|
if (excludedObjects != null && excludedObjects.Count > 0)
|
||||||
|
{
|
||||||
|
var excludedRecords = new List<CollisionDetectionExcludedObjectRecord>();
|
||||||
|
foreach (var obj in excludedObjects)
|
||||||
|
{
|
||||||
|
if (obj == null) continue;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pathId = Autodesk.Navisworks.Api.Application.ActiveDocument.Models.CreatePathId(obj);
|
||||||
|
excludedRecords.Add(new CollisionDetectionExcludedObjectRecord
|
||||||
|
{
|
||||||
|
DetectionRecordId = recordId,
|
||||||
|
ModelIndex = pathId.ModelIndex,
|
||||||
|
PathId = pathId.PathId,
|
||||||
|
DisplayName = obj.DisplayName,
|
||||||
|
ObjectName = obj.DisplayName,
|
||||||
|
Reason = "预计算碰撞分析排除"
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogManager.Warning($"[检测记录] 准备排除对象记录失败: {obj.DisplayName}, {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (excludedRecords.Count > 0)
|
||||||
|
{
|
||||||
|
pathDatabase.SaveCollisionDetectionExcludedObjects(recordId, excludedRecords);
|
||||||
|
LogManager.Info($"[检测记录] 已保存 {excludedRecords.Count} 个排除对象");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsManualCollisionTargetEnabled && _manualCollisionTargets != null && _manualCollisionTargets.Count > 0)
|
||||||
|
{
|
||||||
|
var manualTargetRecords = new List<CollisionDetectionManualTargetRecord>();
|
||||||
|
foreach (var target in _manualCollisionTargets)
|
||||||
|
{
|
||||||
|
if (target?.ModelItem == null) continue;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var pathId = Autodesk.Navisworks.Api.Application.ActiveDocument.Models.CreatePathId(target.ModelItem);
|
||||||
|
manualTargetRecords.Add(new CollisionDetectionManualTargetRecord
|
||||||
|
{
|
||||||
|
DetectionRecordId = recordId,
|
||||||
|
ModelIndex = pathId.ModelIndex,
|
||||||
|
PathId = pathId.PathId,
|
||||||
|
DisplayName = target.ModelItem.DisplayName,
|
||||||
|
ObjectName = target.ModelItem.DisplayName
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogManager.Warning($"[检测记录] 准备手工目标记录失败: {target.DisplayName}, {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (manualTargetRecords.Count > 0)
|
||||||
|
{
|
||||||
|
pathDatabase.SaveCollisionDetectionManualTargets(recordId, manualTargetRecords);
|
||||||
|
LogManager.Info($"[检测记录] 已保存 {manualTargetRecords.Count} 个手工目标");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return recordId;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 用户选择析析
|
/// 用户选择析析
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -5210,22 +5221,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels
|
|||||||
|
|
||||||
LogManager.Info($"[批处理] 添加路径到批处理队列: {CurrentPathRoute.Name}");
|
LogManager.Info($"[批处理] 添加路径到批处理队列: {CurrentPathRoute.Name}");
|
||||||
|
|
||||||
// 🔥 获取该路径最新的检测记录ID
|
// 为批处理创建独立的检测记录快照,保存当前配置、排除列表和手工目标
|
||||||
int? detectionRecordId = null;
|
int detectionRecordId = CreateCollisionDetectionRecordSnapshot("批处理任务创建", bindToAnimationManager: false);
|
||||||
var pathDatabase = _pathPlanningManager?.GetPathDatabase();
|
LogManager.Info($"[批处理] 已创建批处理检测记录 (Id={detectionRecordId})");
|
||||||
if (pathDatabase != null)
|
|
||||||
{
|
|
||||||
var latestRecord = pathDatabase.GetLatestCollisionDetectionRecord(CurrentPathRoute.Id);
|
|
||||||
detectionRecordId = latestRecord?.Id;
|
|
||||||
if (detectionRecordId.HasValue)
|
|
||||||
{
|
|
||||||
LogManager.Info($"[批处理] 关联检测记录 (Id={detectionRecordId})");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
LogManager.Warning("[批处理] 未找到检测记录,请先运行\"生成动画\"");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 创建批处理队列项
|
// 创建批处理队列项
|
||||||
// 注意:虚拟物体尺寸需要从米转换为模型单位存入数据库
|
// 注意:虚拟物体尺寸需要从米转换为模型单位存入数据库
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user