From cb56910d68dd38653e9a9e8be35c7d8b2d75dbc3 Mon Sep 17 00:00:00 2001
From: tian <11429339@qq.com>
Date: Mon, 2 Feb 2026 21:14:24 +0800
Subject: [PATCH] =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=89=93=E5=BC=80=E6=89=8B?=
=?UTF-8?q?=E5=B7=A5=E6=8C=87=E5=AE=9A=E7=A2=B0=E6=92=9E=E6=A3=80=E6=B5=8B?=
=?UTF-8?q?=E5=AF=B9=E8=B1=A1=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=AF=B9=E8=B1=A1?=
=?UTF-8?q?=E5=BA=8F=E5=8F=B7=E6=98=BE=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
doc/requirement/todo_features.md | 2 +-
.../ViewModels/AnimationControlViewModel.cs | 61 +++++++++++-
src/UI/WPF/Views/AnimationControlView.xaml | 97 ++++++++++---------
3 files changed, 107 insertions(+), 53 deletions(-)
diff --git a/doc/requirement/todo_features.md b/doc/requirement/todo_features.md
index a43fe1a..cf7b397 100644
--- a/doc/requirement/todo_features.md
+++ b/doc/requirement/todo_features.md
@@ -9,7 +9,7 @@
3、[x] (优化)修改吊装路径适应桁车空中路线(纵向+平移,有吊绳)
4、[x] (优化)对系统配置文件的修改即时起效
5、[ ] (优化)切换文档时重新加载数据库
-6、[ ] (优化)默认大家指定碰撞物体
+6、[ ] (优化)默认打开指定碰撞物体
7、[ ] (优化)动画运行视角优化设计,不能只用俯视图
8、[ ] (BUG)旧版配置文件要主动提示升级配置文件,不能崩溃
diff --git a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs
index fd0c7e1..edbf463 100644
--- a/src/UI/WPF/ViewModels/AnimationControlViewModel.cs
+++ b/src/UI/WPF/ViewModels/AnimationControlViewModel.cs
@@ -2,7 +2,9 @@ using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
+using System.ComponentModel;
using System.Linq;
+using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Windows.Input;
using Autodesk.Navisworks.Api;
@@ -62,20 +64,43 @@ namespace NavisworksTransport.UI.WPF.ViewModels
///
/// 手工指定的碰撞检测对象
///
- public class ManualCollisionTargetViewModel
+ public class ManualCollisionTargetViewModel : INotifyPropertyChanged
{
- public ManualCollisionTargetViewModel(ModelItem modelItem, string displayName, string modelPath)
+ private int _index;
+
+ public ManualCollisionTargetViewModel(ModelItem modelItem, string displayName, string modelPath, int index = 0)
{
ModelItem = modelItem ?? throw new ArgumentNullException(nameof(modelItem));
DisplayName = displayName;
ModelPath = modelPath;
InstanceGuid = modelItem.InstanceGuid;
+ _index = index;
}
public ModelItem ModelItem { get; }
public string DisplayName { get; }
public string ModelPath { get; }
public Guid InstanceGuid { get; }
+
+ public int Index
+ {
+ get => _index;
+ set
+ {
+ if (_index != value)
+ {
+ _index = value;
+ OnPropertyChanged();
+ }
+ }
+ }
+
+ public event PropertyChangedEventHandler PropertyChanged;
+
+ protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
+ {
+ PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
+ }
}
///
@@ -245,7 +270,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
private double _objectOriginalHeight; // 物体原始高度(Z方向)
// 手工碰撞对象相关字段
- private bool _isManualCollisionTargetEnabled = false;
+ private bool _isManualCollisionTargetEnabled = true;
private ObservableCollection _manualCollisionTargets;
private string _manualCollisionTargetSummary = "未指定碰撞检测对象";
private DateTime? _manualTargetsLastSyncTime;
@@ -852,6 +877,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels
// 初始化设置
InitializeAnimationSettings();
+
+ // 初始化生成动画按钮状态(启用手工指定模式时检查列表)
+ UpdateCanGenerateAnimation();
// 初始化命令
InitializeCommands();
@@ -2001,6 +2029,9 @@ namespace NavisworksTransport.UI.WPF.ViewModels
_manualCollisionTargets.Add(entry);
}
+ // 更新序号
+ UpdateManualCollisionTargetIndices();
+
_manualTargetsLastSyncTime = DateTime.Now;
UpdateManualCollisionTargetSummary();
RefreshManualTargetHighlights();
@@ -2342,12 +2373,16 @@ namespace NavisworksTransport.UI.WPF.ViewModels
private void OnManualCollisionTargetsChanged(object sender, NotifyCollectionChangedEventArgs e)
{
+ // 先更新序号
+ UpdateManualCollisionTargetIndices();
+
UpdateManualCollisionTargetSummary();
OnPropertyChanged(nameof(HasManualCollisionTargets));
OnPropertyChanged(nameof(IsManualTargetModeActive));
System.Windows.Input.CommandManager.InvalidateRequerySuggested();
RefreshManualTargetHighlights();
SyncManualCollisionTargetsToAnimationManager();
+ UpdateCanGenerateAnimation(); // 更新生成动画按钮状态
}
private void UpdateManualCollisionTargetSummary()
@@ -2364,6 +2399,20 @@ namespace NavisworksTransport.UI.WPF.ViewModels
ManualCollisionTargetSummary = $"{_manualCollisionTargets.Count} 个对象{syncPart}";
}
+ ///
+ /// 更新手工碰撞对象的序号
+ ///
+ private void UpdateManualCollisionTargetIndices()
+ {
+ if (_manualCollisionTargets == null)
+ return;
+
+ for (int i = 0; i < _manualCollisionTargets.Count; i++)
+ {
+ _manualCollisionTargets[i].Index = i + 1; // 序号从1开始
+ }
+ }
+
private string BuildModelPath(ModelItem item)
{
try
@@ -2534,6 +2583,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels
{
RefreshManualTargetHighlights();
SyncManualCollisionTargetsToAnimationManager(true);
+ UpdateCanGenerateAnimation(); // 更新生成动画按钮状态
if (IsManualCollisionTargetEnabled && !HasManualCollisionTargets)
{
@@ -3014,7 +3064,10 @@ namespace NavisworksTransport.UI.WPF.ViewModels
hasValidObject = SelectedAnimatedObject != null;
}
- CanGenerateAnimation = hasValidObject && hasPath;
+ // 启用手工指定模式时,必须指定碰撞检测对象
+ bool hasManualTargetsIfRequired = !IsManualCollisionTargetEnabled || HasManualCollisionTargets;
+
+ CanGenerateAnimation = hasValidObject && hasPath && hasManualTargetsIfRequired;
// 更新状态提示
if (IsManualCollisionTargetEnabled && !HasManualCollisionTargets)
diff --git a/src/UI/WPF/Views/AnimationControlView.xaml b/src/UI/WPF/Views/AnimationControlView.xaml
index a86fe3b..7a7c592 100644
--- a/src/UI/WPF/Views/AnimationControlView.xaml
+++ b/src/UI/WPF/Views/AnimationControlView.xaml
@@ -142,58 +142,61 @@ NavisworksTransport 检测动画页签视图 - 采用与类别设置和分层管
-
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
-
-
-
+
-
+
+
+
+
+
+
+
+
@@ -219,9 +222,7 @@ NavisworksTransport 检测动画页签视图 - 采用与类别设置和分层管
-
-
-
+