使用场景加载完成事件SceneLoaded实现文档更新后的物流列表刷新

This commit is contained in:
tian 2025-10-21 18:22:23 +08:00
parent b0a63409b9
commit fbe46ebc85

View File

@ -1,18 +1,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input; using System.Windows.Input;
using Autodesk.Navisworks.Api; using Autodesk.Navisworks.Api;
using NavisApplication = Autodesk.Navisworks.Api.Application; using NavisApplication = Autodesk.Navisworks.Api.Application;
using NavisworksTransport.Core; using NavisworksTransport.Core;
using NavisworksTransport.Core.Config; using NavisworksTransport.Core.Config;
using NavisworksTransport.Commands;
using NavisworksTransport.UI.WPF.Collections; using NavisworksTransport.UI.WPF.Collections;
using NavisworksTransport.UI.WPF.Commands;
using NavisworksTransport.UI.WPF.Models; using NavisworksTransport.UI.WPF.Models;
using NavisworksTransport.Utils; using NavisworksTransport.Utils;
@ -926,10 +920,10 @@ namespace NavisworksTransport.UI.WPF.ViewModels
// 选择状态格式化方法已移至NavisworksSelectionHelper中 // 选择状态格式化方法已移至NavisworksSelectionHelper中
#region #region
/// <summary> /// <summary>
/// 订阅文档模型集合变化事件 /// 订阅场景加载完成事件
/// </summary> /// </summary>
private void SubscribeToDocumentModelsEvents() private void SubscribeToDocumentModelsEvents()
{ {
@ -938,19 +932,19 @@ namespace NavisworksTransport.UI.WPF.ViewModels
var document = NavisApplication.ActiveDocument; var document = NavisApplication.ActiveDocument;
if (document?.Models != null && !_modelsCollectionEventSubscribed) if (document?.Models != null && !_modelsCollectionEventSubscribed)
{ {
document.Models.CollectionChanged += OnDocumentModelsCollectionChanged; document.Models.SceneLoaded += OnSceneLoaded;
_modelsCollectionEventSubscribed = true; _modelsCollectionEventSubscribed = true;
LogManager.Info("[ModelSettingsViewModel] 已订阅文档Models.CollectionChanged事件"); LogManager.Info("[ModelSettingsViewModel] 已订阅SceneLoaded事件");
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
LogManager.Error($"[ModelSettingsViewModel] 订阅文档模型集合事件失败: {ex.Message}", ex); LogManager.Error($"[ModelSettingsViewModel] 订阅SceneLoaded事件失败: {ex.Message}", ex);
} }
} }
/// <summary> /// <summary>
/// 取消订阅文档模型集合变化事件 /// 取消场景加载完成事件
/// </summary> /// </summary>
private void UnsubscribeFromDocumentModelsEvents() private void UnsubscribeFromDocumentModelsEvents()
{ {
@ -961,22 +955,22 @@ namespace NavisworksTransport.UI.WPF.ViewModels
var document = NavisApplication.ActiveDocument; var document = NavisApplication.ActiveDocument;
if (document?.Models != null) if (document?.Models != null)
{ {
document.Models.CollectionChanged -= OnDocumentModelsCollectionChanged; document.Models.SceneLoaded -= OnSceneLoaded;
} }
_modelsCollectionEventSubscribed = false; _modelsCollectionEventSubscribed = false;
LogManager.Info("[ModelSettingsViewModel] 已取消订阅文档Models.CollectionChanged事件"); LogManager.Info("[ModelSettingsViewModel] 已取消订阅SceneLoaded事件");
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
LogManager.Error($"[ModelSettingsViewModel] 取消订阅文档模型集合事件失败: {ex.Message}", ex); LogManager.Error($"[ModelSettingsViewModel] 取消订阅SceneLoaded事件失败: {ex.Message}", ex);
} }
} }
/// <summary> /// <summary>
/// 文档模型集合变化事件处理器 /// 场景加载完成事件处理器
/// </summary> /// </summary>
private async void OnDocumentModelsCollectionChanged(object sender, EventArgs e) private async void OnSceneLoaded(object sender, EventArgs e)
{ {
// 如果已经释放,直接返回 // 如果已经释放,直接返回
if (_disposed) return; if (_disposed) return;
@ -986,19 +980,14 @@ namespace NavisworksTransport.UI.WPF.ViewModels
var document = NavisApplication.ActiveDocument; var document = NavisApplication.ActiveDocument;
var modelsCount = document?.Models?.Count ?? 0; var modelsCount = document?.Models?.Count ?? 0;
LogManager.Info($"[ModelSettingsViewModel] 文档模型集合变化,当前模型数量: {modelsCount}"); LogManager.Info($"[ModelSettingsViewModel] 场景加载完成,当前模型数量: {modelsCount}");
// 只有在有模型的情况下才刷新物流模型列表 // 刷新物流模型列表
if (modelsCount > 0) await RefreshLogisticsModelsAsync();
{
LogManager.Info("[ModelSettingsViewModel] 检测到文档模型加载完成,自动刷新物流模型列表");
//TODO直接刷新会因为文档还没有渲染结束而导致程序崩溃后续可以考虑结合SceneLoaded事件来触发
//await RefreshLogisticsModelsAsync();
}
} }
catch (Exception ex) catch (Exception ex)
{ {
LogManager.Error($"[ModelSettingsViewModel] 处理文档模型集合变化事件异常: {ex.Message}", ex); LogManager.Error($"[ModelSettingsViewModel] 处理场景加载完成事件异常: {ex.Message}", ex);
} }
} }