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 检测动画页签视图 - 采用与类别设置和分层管 - + - - - +