From d9c2ec8c12dfd8cb748f4690abde6265918fc397 Mon Sep 17 00:00:00 2001
From: tian <11429339@qq.com>
Date: Fri, 19 Dec 2025 14:17:20 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B7=AF=E5=BE=84=E5=88=97?=
=?UTF-8?q?=E8=A1=A8UI=E8=A7=A6=E5=8F=91=E4=BA=8B=E4=BB=B6=E5=BC=95?=
=?UTF-8?q?=E8=B5=B7=E4=BA=8B=E4=BB=B6=E5=BE=AA=E7=8E=AF=E7=9A=84=E9=97=AE?=
=?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
doc/requirement/todo_features.md | 6 +-
.../Collision/ClashDetectiveIntegration.cs | 4 +-
src/Core/PathPlanningManager.cs | 62 +++++++++++++------
.../ViewModels/AnimationControlViewModel.cs | 2 +-
4 files changed, 48 insertions(+), 26 deletions(-)
diff --git a/doc/requirement/todo_features.md b/doc/requirement/todo_features.md
index 1608736..dbd8c34 100644
--- a/doc/requirement/todo_features.md
+++ b/doc/requirement/todo_features.md
@@ -4,15 +4,15 @@
### [2025/12/09]
-1. [ ] (BUG)路径列表和动画当前路径的变化存在循环引用的情况
+1. [x] (BUG)路径列表和动画当前路径的变化存在循环引用的情况
2. [ ] (BUG)动画过程中,有一些被碰撞的墙、柱子和其他对象没有被检测到
### [2025/12/08]
1. [x] (功能)碰撞检测时,增加手工指定被检测构件,用特殊颜色标识
-2. [ ] (功能)动画时,物流模型朝向随路径变化
+2. [x] (功能)动画时,物流模型朝向随路径变化
3. [x] (功能)动画生成,增加使用模拟物流车辆立方体选项
-4. [ ] (功能)动画检测时,过滤门和其他可通行构件
+4. [x] (功能)动画检测时,过滤门和其他可通行构件
5. [x] (BUG)只有手动路径时,导出路径按钮没激活
6. [ ] (BUG)重复打开模型,有时程序崩溃,需要先关闭物流插件窗口
7. [x] (优化)提高碰撞检测在处理大型模型时的性能
diff --git a/src/Core/Collision/ClashDetectiveIntegration.cs b/src/Core/Collision/ClashDetectiveIntegration.cs
index 4cdefc6..53b1eff 100644
--- a/src/Core/Collision/ClashDetectiveIntegration.cs
+++ b/src/Core/Collision/ClashDetectiveIntegration.cs
@@ -963,9 +963,9 @@ namespace NavisworksTransport
}
///
- /// 构建几何对象列表缓存,一次性获取所有几何对象
+ /// 构建几何对象列表缓存,一次性获取非隐藏几何对象
///
- public static void BuildAllGeometryItemsCache()
+ public static void BuildNonHidddenGeometryItemsCache()
{
lock (_cacheLock)
{
diff --git a/src/Core/PathPlanningManager.cs b/src/Core/PathPlanningManager.cs
index 8580840..bf0844b 100644
--- a/src/Core/PathPlanningManager.cs
+++ b/src/Core/PathPlanningManager.cs
@@ -263,9 +263,9 @@ namespace NavisworksTransport
{
var previousRoute = _currentRoute;
_currentRoute = value;
-
- // 触发当前路径变更事件
- RaiseCurrentRouteChanged(previousRoute, value);
+
+ // 只有真正的业务操作才触发事件,UI同步不触发事件
+ RaiseCurrentRouteChanged(previousRoute, value, triggerEvent: true);
}
}
@@ -552,25 +552,29 @@ namespace NavisworksTransport
}
}
- private void RaiseCurrentRouteChanged(PathRoute previousRoute, PathRoute newRoute)
+ private void RaiseCurrentRouteChanged(PathRoute previousRoute, PathRoute newRoute, bool triggerEvent)
{
try
{
var eventArgs = new CurrentRouteChangedEventArgs(previousRoute, newRoute, _managerId);
- if (_uiStateManager != null)
+ // 只有需要触发事件时才执行事件触发逻辑
+ if (triggerEvent)
{
- _uiStateManager.QueueUIUpdate(() =>
+ if (_uiStateManager != null)
+ {
+ _uiStateManager.QueueUIUpdate(() =>
+ {
+ CurrentRouteChanged?.Invoke(this, eventArgs);
+ // 向后兼容的事件
+ CurrentRouteChanged_Legacy?.Invoke(this, newRoute);
+ });
+ }
+ else
{
CurrentRouteChanged?.Invoke(this, eventArgs);
- // 向后兼容的事件
CurrentRouteChanged_Legacy?.Invoke(this, newRoute);
- });
- }
- else
- {
- CurrentRouteChanged?.Invoke(this, eventArgs);
- CurrentRouteChanged_Legacy?.Invoke(this, newRoute);
+ }
}
}
catch (Exception ex)
@@ -1044,7 +1048,7 @@ namespace NavisworksTransport
// 保存自动生成的路径到数据库
SavePathToDatabase(autoRoute);
}
- CurrentRoute = autoRoute;
+ SetCurrentRouteInternal(autoRoute, triggerEvent: true);
// 8. 确保路径可视化使用正确的网格大小(修复尺寸自适应问题)
var renderPlugin = PathPointRenderPlugin.Instance;
@@ -1090,14 +1094,32 @@ namespace NavisworksTransport
}
///
- /// 设置当前路线
+ /// 设置当前路线(UI调用版本,不触发事件以避免循环)
///
/// 要设置的路线
public void SetCurrentRoute(PathRoute route)
+ {
+ SetCurrentRouteInternal(route, triggerEvent: false);
+ }
+
+ ///
+ /// 内部设置当前路线(可选择是否触发事件)
+ ///
+ /// 要设置的路线
+ /// 是否触发事件
+ private void SetCurrentRouteInternal(PathRoute route, bool triggerEvent)
{
try
{
- CurrentRoute = route;
+ // 直接设置字段,绕过事件触发
+ var previousRoute = _currentRoute;
+ _currentRoute = route;
+
+ // 如果需要触发事件(真正的业务操作)
+ if (triggerEvent)
+ {
+ RaiseCurrentRouteChanged(previousRoute, route, triggerEvent: true);
+ }
// 如果路径有关联的GridMap,加载它用于网格可视化
if (route?.AssociatedGridMap != null)
@@ -1139,7 +1161,7 @@ namespace NavisworksTransport
{
PathEditState = PathEditState.Editing;
EditingRoute = route ?? throw new ArgumentNullException(nameof(route));
- CurrentRoute = route;
+ SetCurrentRouteInternal(route, triggerEvent: true);
// 智能管理ToolPlugin状态
ManageToolPluginForEditState();
@@ -1274,7 +1296,7 @@ namespace NavisworksTransport
var newRoute = new PathRoute(routeName);
_routes.Add(newRoute);
- CurrentRoute = newRoute;
+ SetCurrentRouteInternal(newRoute, triggerEvent: true);
// 保存到数据库
SavePathToDatabase(newRoute);
@@ -1315,7 +1337,7 @@ namespace NavisworksTransport
if (_currentRoute == route)
{
var newRoute = _routes.FirstOrDefault() ?? new PathRoute("默认路径");
- CurrentRoute = newRoute;
+ SetCurrentRouteInternal(newRoute, triggerEvent: true);
}
RaiseStatusChanged($"已删除路径: {route.Name}", PathPlanningStatusType.Success);
}
@@ -1383,7 +1405,7 @@ namespace NavisworksTransport
// 创建新路径
var newRoute = new PathRoute(routeName ?? $"路径{DateTime.Now:yyyyMMdd_HHmmss}");
_editingRoute = newRoute;
- CurrentRoute = newRoute;
+ SetCurrentRouteInternal(newRoute, triggerEvent: true);
// 自动选择所有可通行的物流模型
AutoSelectLogisticsChannels();
diff --git a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs
index b43ed5b..e878f9a 100644
--- a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs
+++ b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs
@@ -1928,7 +1928,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
ClashDetectiveIntegration.ClearAllCaches();
UpdateMainStatus("正在缓存几何对象列表...", -1, true);
- ClashDetectiveIntegration.BuildAllGeometryItemsCache();
+ ClashDetectiveIntegration.BuildNonHidddenGeometryItemsCache();
UpdateMainStatus("正在缓存通道对象...", -1, true);
var clashIntegration = ClashDetectiveIntegration.Instance;