diff --git a/NavisworksTransportPlugin.csproj b/NavisworksTransportPlugin.csproj
index 1aed6ee..8de5f9b 100644
--- a/NavisworksTransportPlugin.csproj
+++ b/NavisworksTransportPlugin.csproj
@@ -139,7 +139,6 @@
-
diff --git a/src/Commands/StartAnimationCommand.cs b/src/Commands/StartAnimationCommand.cs
index 718b34c..4bba04a 100644
--- a/src/Commands/StartAnimationCommand.cs
+++ b/src/Commands/StartAnimationCommand.cs
@@ -67,13 +67,11 @@ namespace NavisworksTransport.Commands
public class StartAnimationCommand : CommandBase
{
private readonly StartAnimationParameters _parameters;
- private readonly LogisticsAnimationManager _animationManager;
- public StartAnimationCommand(StartAnimationParameters parameters, LogisticsAnimationManager animationManager = null)
+ public StartAnimationCommand(StartAnimationParameters parameters)
: base("StartAnimation", "启动动画", "启动路径动画播放")
{
_parameters = parameters ?? throw new ArgumentNullException(nameof(parameters));
- _animationManager = animationManager ?? new LogisticsAnimationManager();
}
protected override PathPlanningResult ValidateParameters()
@@ -101,9 +99,8 @@ namespace NavisworksTransport.Commands
result.TotalDuration = _parameters.TargetRoute.TotalLength / _parameters.AnimationSpeed;
UpdateProgress(60, "启动动画播放...");
-
- // 这里应该调用LogisticsAnimationManager的实际方法
- // 简化实现中,我们只模拟启动过程
+
+ // 简化实现:实际的动画播放由AnimationControlViewModel中的PathAnimationManager处理
result.IsStarted = true;
UpdateProgress(90, "完成动画启动...");
diff --git a/src/Core/Animation/LogisticsAnimationManager.cs b/src/Core/Animation/LogisticsAnimationManager.cs
deleted file mode 100644
index e11e55f..0000000
--- a/src/Core/Animation/LogisticsAnimationManager.cs
+++ /dev/null
@@ -1,543 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Threading.Tasks;
-using Autodesk.Navisworks.Api;
-using NavisApplication = Autodesk.Navisworks.Api.Application;
-using NavisworksTransport.Utils;
-
-namespace NavisworksTransport.Core.Animation
-{
- ///
- /// 基于Navisworks 2026的物流动画管理器
- /// 使用视点序列实现路径跟随效果
- ///
- public class LogisticsAnimationManager
- {
- private readonly Document _document;
- private readonly Dictionary> _pathViewpoints;
- private readonly Dictionary _animations;
-
- // 动画对象排除列表缓存管理
- private ModelItem _currentCachedAnimationObject;
- private List _cachedExclusionList;
- private DateTime _cacheCreatedTime;
- private readonly TimeSpan _cacheValidDuration = TimeSpan.FromMinutes(30); // 缓存有效期30分钟
-
- public LogisticsAnimationManager()
- {
- _document = NavisApplication.ActiveDocument;
- _pathViewpoints = new Dictionary>();
- _animations = new Dictionary();
-
- LogManager.Info("LogisticsAnimationManager 初始化完成 - 使用视点序列");
- }
-
- #region 动画对象排除列表缓存管理
-
- ///
- /// 为动画对象预计算并缓存排除列表
- ///
- /// 动画对象
- /// 是否成功缓存
- public bool PrecomputeCollisionExclusions(ModelItem animationObject)
- {
- try
- {
- LogManager.Info($"[缓存管理] 开始为动画对象预计算排除列表: {animationObject?.DisplayName ?? "NULL"}");
-
- if (animationObject == null)
- {
- LogManager.Warning("[缓存管理] 动画对象为空,清除缓存");
- ClearExclusionCache();
- return false;
- }
-
- // 检查是否需要重新计算
- if (IsCacheValid(animationObject))
- {
- LogManager.Info($"[缓存管理] 缓存仍然有效,跳过重新计算");
- return true;
- }
-
- var startTime = DateTime.Now;
-
- // 只构建特定于动画对象的逻辑排除列表
- LogManager.Info("[缓存管理] 构建逻辑排除列表...");
- var exclusionList = ModelItemAnalysisHelper.CollectRelatedNodes(animationObject);
-
- // 更新缓存
- _currentCachedAnimationObject = animationObject;
- _cachedExclusionList = exclusionList;
- _cacheCreatedTime = DateTime.Now;
-
- var elapsedMs = (DateTime.Now - startTime).TotalMilliseconds;
- LogManager.Info($"[缓存管理] 预计算完成,耗时 {elapsedMs:F1}ms,缓存 {exclusionList.Count} 个排除对象");
-
- return true;
- }
- catch (Exception ex)
- {
- LogManager.Error($"[缓存管理] 预计算排除列表失败: {ex.Message}", ex);
- ClearExclusionCache();
- return false;
- }
- }
-
- ///
- /// 获取缓存的排除列表
- ///
- /// 动画对象
- /// 排除列表,如果缓存无效则返回null
- public List GetCachedExclusionList(ModelItem animationObject)
- {
- try
- {
- if (!IsCacheValid(animationObject))
- {
- LogManager.Debug($"[缓存管理] 缓存无效,建议重新预计算");
- return null;
- }
-
- LogManager.Debug($"[缓存管理] 返回缓存的排除列表: {_cachedExclusionList?.Count ?? 0} 个对象");
- return _cachedExclusionList;
- }
- catch (Exception ex)
- {
- LogManager.Warning($"[缓存管理] 获取缓存失败: {ex.Message}");
- return null;
- }
- }
-
- ///
- /// 检查缓存是否有效
- ///
- /// 当前动画对象
- /// 缓存是否有效
- private bool IsCacheValid(ModelItem animationObject)
- {
- try
- {
- // 检查是否有缓存
- if (_currentCachedAnimationObject == null || _cachedExclusionList == null)
- {
- return false;
- }
-
- // 检查对象是否相同
- if (!_currentCachedAnimationObject.Equals(animationObject))
- {
- string cachedObjectName = ModelItemAnalysisHelper.GetSafeDisplayName(_currentCachedAnimationObject);
- string currentObjectName = ModelItemAnalysisHelper.GetSafeDisplayName(animationObject);
- LogManager.Debug($"[缓存验证] 动画对象已变更: '{cachedObjectName}' -> '{currentObjectName}'");
- return false;
- }
-
- // 检查缓存时间是否过期
- if (DateTime.Now - _cacheCreatedTime > _cacheValidDuration)
- {
- LogManager.Debug($"[缓存验证] 缓存已过期: {(DateTime.Now - _cacheCreatedTime).TotalMinutes:F1} 分钟");
- return false;
- }
-
- return true;
- }
- catch (Exception ex)
- {
- LogManager.Warning($"[缓存验证] 验证过程异常: {ex.Message}");
- return false;
- }
- }
-
- ///
- /// 清除排除列表缓存
- ///
- public void ClearExclusionCache()
- {
- try
- {
- if (_currentCachedAnimationObject != null)
- {
- try
- {
- // 安全访问DisplayName,防止WeakRef已释放的警告
- string objectName = ModelItemAnalysisHelper.GetSafeDisplayName(_currentCachedAnimationObject);
- LogManager.Debug($"[缓存管理] 清除缓存: {objectName}");
- }
- catch (Exception ex)
- {
- LogManager.Debug($"[缓存管理] 清除缓存时访问对象名称失败: {ex.Message}");
- }
- }
-
- _currentCachedAnimationObject = null;
- _cachedExclusionList = null;
- _cacheCreatedTime = DateTime.MinValue;
- }
- catch (Exception ex)
- {
- LogManager.Warning($"[缓存管理] 清除缓存失败: {ex.Message}");
- }
- }
-
- ///
- /// 获取缓存统计信息
- ///
- /// 缓存统计信息
- public string GetCacheStats()
- {
- try
- {
- if (_currentCachedAnimationObject == null)
- {
- return "缓存状态: 无缓存";
- }
-
- var age = DateTime.Now - _cacheCreatedTime;
- string objectName = ModelItemAnalysisHelper.GetSafeDisplayName(_currentCachedAnimationObject);
- var count = _cachedExclusionList?.Count ?? 0;
-
- return $"缓存状态: 对象='{objectName}', 排除数={count}, 年龄={age.TotalSeconds:F1}秒";
- }
- catch (Exception ex)
- {
- return $"缓存状态获取失败: {ex.Message}";
- }
- }
-
-
-
- #endregion
-
- ///
- /// 创建路径跟随视点序列
- ///
- public List CreatePathViewpoints(
- string name,
- List pathPoints,
- CameraFollowSettings settings = null)
- {
- try
- {
- if (pathPoints == null || pathPoints.Count < 2)
- throw new ArgumentException("路径点数量必须至少为2个", nameof(pathPoints));
-
- settings = settings ?? new CameraFollowSettings();
-
- LogManager.Info($"创建路径视点序列: {name}, 路径点: {pathPoints.Count}");
-
- // 为每个路径点创建视点
- var viewpoints = new List();
- for (int i = 0; i < pathPoints.Count; i++)
- {
- var viewpoint = CreateViewpointForPath(pathPoints[i], settings, i, name);
- viewpoints.Add(viewpoint);
-
- // 添加到文档的视点集合
- _document.SavedViewpoints.AddCopy(viewpoint);
- }
-
- // 保存视点序列
- _pathViewpoints[name] = viewpoints;
-
- LogManager.Info($"✓ 路径视点序列创建成功: {name}, 视点数: {viewpoints.Count}");
- return viewpoints;
- }
- catch (Exception ex)
- {
- LogManager.Error($"创建路径视点序列失败: {ex.Message}");
- throw;
- }
- }
-
- ///
- /// 创建简单的视点动画
- ///
- public SavedViewpointAnimation CreateSimpleAnimation(string name, List viewpoints)
- {
- try
- {
- var animation = new SavedViewpointAnimation
- {
- DisplayName = name,
- Smoothing = SavedViewpointAnimationSmoothing.Spline,
- Loops = false
- };
-
- // 将视点添加到动画中(这是关键步骤!)
- if (viewpoints != null && viewpoints.Count > 0)
- {
- foreach (var viewpoint in viewpoints)
- {
- animation.Children.Add(viewpoint);
- LogManager.Debug($"视点已添加到动画: {viewpoint.DisplayName}");
- }
- }
-
- // 将动画添加到文档的视点集合
- _document.SavedViewpoints.AddCopy(animation);
- _animations[name] = animation;
-
- LogManager.Info($"✓ 简单动画创建成功: {name}, 包含视点: {viewpoints?.Count ?? 0}个");
- return animation;
- }
- catch (Exception ex)
- {
- LogManager.Error($"创建简单动画失败: {ex.Message}");
- throw;
- }
- }
-
- ///
- /// 为路径点创建最佳视点
- ///
- private SavedViewpoint CreateViewpointForPath(Point3D pathPoint, CameraFollowSettings settings, int index, string pathName)
- {
- // 获取当前视点作为基础
- var currentViewpoint = _document.ActiveView.CreateViewpointCopy();
-
- // 计算相机位置(在路径点后方一定距离)
- var cameraPosition = new Point3D(
- pathPoint.X + settings.CameraOffset.X,
- pathPoint.Y + settings.CameraOffset.Y,
- pathPoint.Z + settings.CameraOffset.Z
- );
-
- // 设置视点属性
- currentViewpoint.Position = cameraPosition;
-
- // 计算朝向(朝向路径点)
- var lookDirection = new Vector3D(
- pathPoint.X - cameraPosition.X,
- pathPoint.Y - cameraPosition.Y,
- pathPoint.Z - cameraPosition.Z
- );
-
- // 设置旋转(朝向目标点)
- currentViewpoint.Rotation = CalculateRotationFromDirection(lookDirection);
-
- // 使用配置好的视点创建SavedViewpoint
- var savedViewpoint = new SavedViewpoint(currentViewpoint)
- {
- DisplayName = $"{pathName}_Point_{index:D3}"
- };
-
- LogManager.Debug($"视点[{index}]: 位置=({cameraPosition.X:F2},{cameraPosition.Y:F2},{cameraPosition.Z:F2})");
-
- return savedViewpoint;
- }
-
- ///
- /// 从方向向量计算旋转
- ///
- private Rotation3D CalculateRotationFromDirection(Vector3D direction)
- {
- // 简化的旋转计算 - 将默认前向向量旋转到目标方向
- var normalizedDirection = direction.Normalize();
-
- // 默认前向向量(通常是负Z方向)
- var defaultForward = new UnitVector3D(0, 0, -1);
-
- // 目标方向
- var targetDirection = new UnitVector3D(normalizedDirection.X, normalizedDirection.Y, normalizedDirection.Z);
-
- // 创建从默认方向到目标方向的旋转
- return new Rotation3D(defaultForward, targetDirection);
- }
-
- ///
- /// 获取路径视点序列
- ///
- public List GetPathViewpoints(string pathName)
- {
- return _pathViewpoints.TryGetValue(pathName, out var viewpoints) ? viewpoints : null;
- }
-
- ///
- /// 获取动画
- ///
- public SavedViewpointAnimation GetAnimation(string animationName)
- {
- return _animations.TryGetValue(animationName, out var animation) ? animation : null;
- }
-
- ///
- /// 创建完整的路径动画(按照Navisworks标准流程)
- /// 1. 创建路径视点序列
- /// 2. 创建动画
- /// 3. 将视点添加到动画中
- ///
- public SavedViewpointAnimation CreatePathAnimation(
- string name,
- List pathPoints,
- CameraFollowSettings settings = null)
- {
- try
- {
- LogManager.Info($"开始创建完整路径动画: {name}");
-
- // 步骤1: 创建路径视点序列
- var viewpoints = CreatePathViewpoints($"{name}_Viewpoints", pathPoints, settings);
-
- // 步骤2&3: 创建动画并添加视点
- var animation = CreateSimpleAnimation(name, viewpoints);
-
- LogManager.Info($"✓ 完整路径动画创建成功: {name}");
- return animation;
- }
- catch (Exception ex)
- {
- LogManager.Error($"创建完整路径动画失败: {ex.Message}");
- throw;
- }
- }
-
- ///
- /// 播放指定动画
- /// 注意:由于API限制,这里设置当前视点为动画的第一个视点
- /// 真正的动画播放需要通过Navisworks UI手动触发
- ///
- public void PlayAnimation(string animationName)
- {
- var animation = GetAnimation(animationName);
- if (animation != null)
- {
- // 设置当前视点为动画(这会在UI中选中该动画)
- _document.SavedViewpoints.CurrentSavedViewpoint = animation;
- LogManager.Info($"动画已选中: {animationName},请在Navisworks中手动播放");
- }
- else
- {
- LogManager.Warning($"未找到动画: {animationName}");
- }
- }
-
- ///
- /// 停止当前动画
- ///
- public void StopCurrentAnimation()
- {
- _document.SavedViewpoints.CurrentSavedViewpoint = null;
- LogManager.Info("当前动画选择已清除");
- }
-
- ///
- /// 获取所有路径名称
- ///
- public List GetPathNames()
- {
- return new List(_pathViewpoints.Keys);
- }
-
- ///
- /// 获取所有动画名称
- ///
- public List GetAnimationNames()
- {
- return new List(_animations.Keys);
- }
-
- ///
- /// 删除指定路径
- ///
- public bool RemovePath(string pathName)
- {
- if (_pathViewpoints.TryGetValue(pathName, out var viewpoints))
- {
- // 从文档中移除视点
- foreach (var viewpoint in viewpoints)
- {
- try
- {
- _document.SavedViewpoints.Remove(viewpoint);
- }
- catch (Exception ex)
- {
- LogManager.Warning($"移除视点失败: {viewpoint.DisplayName}, 错误: {ex.Message}");
- }
- }
-
- // 从本地字典中移除
- _pathViewpoints.Remove(pathName);
-
- LogManager.Info($"路径已删除: {pathName}");
- return true;
- }
-
- LogManager.Warning($"未找到要删除的路径: {pathName}");
- return false;
- }
-
- ///
- /// 删除指定动画
- ///
- public bool RemoveAnimation(string animationName)
- {
- if (_animations.TryGetValue(animationName, out var animation))
- {
-
- _document.SavedViewpoints.Remove(animation);
- // 从本地字典中移除
- _animations.Remove(animationName);
-
- LogManager.Info($"动画已删除: {animationName}");
- return true;
- }
-
- LogManager.Warning($"未找到要删除的动画: {animationName}");
- return false;
- }
-
- ///
- /// 资源清理
- ///
- public void Dispose()
- {
- try
- {
- StopCurrentAnimation();
-
- // 清理所有路径
- foreach (var pathName in GetPathNames())
- {
- RemovePath(pathName);
- }
-
- // 清理所有动画
- foreach (var animationName in GetAnimationNames())
- {
- RemoveAnimation(animationName);
- }
-
- _pathViewpoints.Clear();
- _animations.Clear();
-
- LogManager.Info("LogisticsAnimationManager 资源已清理");
- }
- catch (Exception ex)
- {
- LogManager.Error($"清理动画管理器资源失败: {ex.Message}");
- }
- }
- }
-
- ///
- /// 动画选项配置
- ///
- public class AnimationOptions
- {
- public bool SmoothTransition { get; set; } = true;
- public TimeSpan TransitionDuration { get; set; } = TimeSpan.FromSeconds(1);
- }
-
- ///
- /// 相机跟随设置
- ///
- public class CameraFollowSettings
- {
- public Vector3D CameraOffset { get; set; } = new Vector3D(-10, -10, 5);
- public Vector3D UpVector { get; set; } = new Vector3D(0, 0, 1);
- public double ViewDistance { get; set; } = 50.0;
- public bool AutoAdjustHeight { get; set; } = true;
- }
-}
\ No newline at end of file
diff --git a/src/Core/Animation/PathAnimationManager.cs b/src/Core/Animation/PathAnimationManager.cs
index cedeb53..00d8386 100644
--- a/src/Core/Animation/PathAnimationManager.cs
+++ b/src/Core/Animation/PathAnimationManager.cs
@@ -6,6 +6,7 @@ using System.Windows.Forms;
using System.Windows.Threading;
using Autodesk.Navisworks.Api;
using Autodesk.Navisworks.Api.Clash;
+using NavisworksTransport.Utils;
using NavisApplication = Autodesk.Navisworks.Api.Application;
namespace NavisworksTransport.Core.Animation
@@ -84,6 +85,12 @@ namespace NavisworksTransport.Core.Animation
private static readonly HashSet _completedCollisionTests = new HashSet(); // 记录已完成碰撞检测的动画配置
private ModelItem _animatedObject;
private List _pathPoints;
+
+ // === 碰撞排除列表缓存管理(从LogisticsAnimationManager迁移)===
+ private ModelItem _currentCachedAnimationObject;
+ private List _cachedExclusionList;
+ private DateTime _cacheCreatedTime;
+ private readonly TimeSpan _cacheValidDuration = TimeSpan.FromMinutes(30); // 缓存有效期30分钟
// === 预计算动画系统 ===
private List _animationFrames; // 所有帧数据
@@ -2209,6 +2216,180 @@ namespace NavisworksTransport.Core.Animation
#endregion
+ #region 碰撞排除列表缓存管理(从LogisticsAnimationManager迁移)
+
+ ///
+ /// 为动画对象预计算并缓存排除列表
+ ///
+ /// 动画对象
+ /// 是否成功缓存
+ public bool PrecomputeCollisionExclusions(ModelItem animationObject)
+ {
+ try
+ {
+ LogManager.Info($"[缓存管理] 开始为动画对象预计算排除列表: {animationObject?.DisplayName ?? "NULL"}");
+
+ if (animationObject == null)
+ {
+ LogManager.Warning("[缓存管理] 动画对象为空,清除缓存");
+ ClearExclusionCache();
+ return false;
+ }
+
+ // 检查是否需要重新计算
+ if (IsCacheValid(animationObject))
+ {
+ LogManager.Info($"[缓存管理] 缓存仍然有效,跳过重新计算");
+ return true;
+ }
+
+ var startTime = DateTime.Now;
+
+ // 只构建特定于动画对象的逻辑排除列表
+ LogManager.Info("[缓存管理] 构建逻辑排除列表...");
+ var exclusionList = ModelItemAnalysisHelper.CollectRelatedNodes(animationObject);
+
+ // 更新缓存
+ _currentCachedAnimationObject = animationObject;
+ _cachedExclusionList = exclusionList;
+ _cacheCreatedTime = DateTime.Now;
+
+ var elapsedMs = (DateTime.Now - startTime).TotalMilliseconds;
+ LogManager.Info($"[缓存管理] 预计算完成,耗时 {elapsedMs:F1}ms,缓存 {exclusionList.Count} 个排除对象");
+
+ return true;
+ }
+ catch (Exception ex)
+ {
+ LogManager.Error($"[缓存管理] 预计算排除列表失败: {ex.Message}", ex);
+ ClearExclusionCache();
+ return false;
+ }
+ }
+
+ ///
+ /// 获取缓存的排除列表
+ ///
+ /// 动画对象
+ /// 排除列表,如果缓存无效则返回null
+ public List GetCachedExclusionList(ModelItem animationObject)
+ {
+ try
+ {
+ if (!IsCacheValid(animationObject))
+ {
+ LogManager.Debug($"[缓存管理] 缓存无效,建议重新预计算");
+ return null;
+ }
+
+ LogManager.Debug($"[缓存管理] 返回缓存的排除列表: {_cachedExclusionList?.Count ?? 0} 个对象");
+ return _cachedExclusionList;
+ }
+ catch (Exception ex)
+ {
+ LogManager.Warning($"[缓存管理] 获取缓存失败: {ex.Message}");
+ return null;
+ }
+ }
+
+ ///
+ /// 检查缓存是否有效
+ ///
+ /// 当前动画对象
+ /// 缓存是否有效
+ private bool IsCacheValid(ModelItem animationObject)
+ {
+ try
+ {
+ // 检查是否有缓存
+ if (_currentCachedAnimationObject == null || _cachedExclusionList == null)
+ {
+ return false;
+ }
+
+ // 检查对象是否相同
+ if (!_currentCachedAnimationObject.Equals(animationObject))
+ {
+ string cachedObjectName = ModelItemAnalysisHelper.GetSafeDisplayName(_currentCachedAnimationObject);
+ string currentObjectName = ModelItemAnalysisHelper.GetSafeDisplayName(animationObject);
+ LogManager.Debug($"[缓存验证] 动画对象已变更: '{cachedObjectName}' -> '{currentObjectName}'");
+ return false;
+ }
+
+ // 检查缓存时间是否过期
+ if (DateTime.Now - _cacheCreatedTime > _cacheValidDuration)
+ {
+ LogManager.Debug($"[缓存验证] 缓存已过期: {(DateTime.Now - _cacheCreatedTime).TotalMinutes:F1} 分钟");
+ return false;
+ }
+
+ return true;
+ }
+ catch (Exception ex)
+ {
+ LogManager.Warning($"[缓存验证] 验证过程异常: {ex.Message}");
+ return false;
+ }
+ }
+
+ ///
+ /// 清除排除列表缓存
+ ///
+ public void ClearExclusionCache()
+ {
+ try
+ {
+ if (_currentCachedAnimationObject != null)
+ {
+ try
+ {
+ // 安全访问DisplayName,防止WeakRef已释放的警告
+ string objectName = ModelItemAnalysisHelper.GetSafeDisplayName(_currentCachedAnimationObject);
+ LogManager.Debug($"[缓存管理] 清除缓存: {objectName}");
+ }
+ catch (Exception ex)
+ {
+ LogManager.Debug($"[缓存管理] 清除缓存时访问对象名称失败: {ex.Message}");
+ }
+ }
+
+ _currentCachedAnimationObject = null;
+ _cachedExclusionList = null;
+ _cacheCreatedTime = DateTime.MinValue;
+ }
+ catch (Exception ex)
+ {
+ LogManager.Warning($"[缓存管理] 清除缓存失败: {ex.Message}");
+ }
+ }
+
+ ///
+ /// 获取缓存统计信息
+ ///
+ /// 缓存统计信息
+ public string GetCacheStats()
+ {
+ try
+ {
+ if (_currentCachedAnimationObject == null)
+ {
+ return "缓存状态: 无缓存";
+ }
+
+ var age = DateTime.Now - _cacheCreatedTime;
+ string objectName = ModelItemAnalysisHelper.GetSafeDisplayName(_currentCachedAnimationObject);
+ var count = _cachedExclusionList?.Count ?? 0;
+
+ return $"缓存状态: 对象='{objectName}', 排除数={count}, 年龄={age.TotalSeconds:F1}秒";
+ }
+ catch (Exception ex)
+ {
+ return $"缓存状态: 获取失败 - {ex.Message}";
+ }
+ }
+
+ #endregion
+
#endregion
}
}
\ No newline at end of file
diff --git a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs
index 7f75ffb..ec99dc0 100644
--- a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs
+++ b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs
@@ -65,7 +65,6 @@ namespace NavisworksTransport.UI.WPF.ViewModels
#region 私有字段
private readonly NavisworksTransport.Core.Animation.PathAnimationManager _pathAnimationManager;
- private readonly NavisworksTransport.Core.Animation.LogisticsAnimationManager _logisticsAnimationManager;
private readonly ClashDetectiveIntegration _clashIntegration;
private readonly UIStateManager _uiStateManager;
@@ -456,10 +455,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
// 设置主ViewModel引用到基类
SetMainViewModel(mainViewModel);
-
+
// 初始化管理器
_pathAnimationManager = new NavisworksTransport.Core.Animation.PathAnimationManager();
- _logisticsAnimationManager = new NavisworksTransport.Core.Animation.LogisticsAnimationManager();
_clashIntegration = ClashDetectiveIntegration.Instance;
_uiStateManager = UIStateManager.Instance;
@@ -604,7 +602,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
// 开始播放物体移动动画
// 清理之前的碰撞缓存
- _logisticsAnimationManager?.ClearExclusionCache();
+ _pathAnimationManager?.ClearExclusionCache();
LogManager.Info("已清理UI层碰撞检测缓存");
// 首先重置进度(开始全新动画时)
@@ -1200,7 +1198,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
bool success;
try
{
- success = _logisticsAnimationManager.PrecomputeCollisionExclusions(animationObject);
+ success = _pathAnimationManager.PrecomputeCollisionExclusions(animationObject);
}
catch (Exception ex)
{
@@ -1213,7 +1211,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
if (success)
{
- var cacheStats = _logisticsAnimationManager.GetCacheStats();
+ var cacheStats = _pathAnimationManager.GetCacheStats();
UpdateMainStatus("动画对象分析完成");
LogManager.Info($"[缓存预计算] 预计算成功 - {cacheStats}");
}
@@ -1273,7 +1271,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
// 构建特定于动画对象的缓存
UpdateMainStatus("正在分析动画对象...", -1, true);
- var success = _logisticsAnimationManager.PrecomputeCollisionExclusions(SelectedAnimatedObject);
+ var success = _pathAnimationManager.PrecomputeCollisionExclusions(SelectedAnimatedObject);
if (!success)
{
@@ -1830,21 +1828,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels
LogManager.Warning($"清理PathAnimationManager时出现警告: {disposeEx.Message}");
}
}
-
- // 4. 清理LogisticsAnimationManager缓存
- if (_logisticsAnimationManager != null)
- {
- try
- {
- _logisticsAnimationManager.ClearExclusionCache();
- _logisticsAnimationManager.Dispose();
- LogManager.Debug("LogisticsAnimationManager缓存清理完成");
- }
- catch (Exception logisticsEx)
- {
- LogManager.Warning($"清理LogisticsAnimationManager缓存时出现警告: {logisticsEx.Message}");
- }
- }
+
+ // 4. 清理PathAnimationManager缓存(缓存功能已迁移到PathAnimationManager)
+ // PathAnimationManager的Dispose已经包含了ClearExclusionCache的调用
LogManager.Info("AnimationControlViewModel资源清理完成");
}