From 4da6669707c240398f5465377ca520696cbbdca1 Mon Sep 17 00:00:00 2001 From: tian <11429339@qq.com> Date: Sun, 31 May 2026 16:56:57 +0800 Subject: [PATCH] refactor: lazy database creation - match path planning pattern - TryConnectToDatabase: createIfMissing=false (only connect, don't create) - New BeforeSaveAlias event + EnsureDatabaseCreated: creates DB on first save - Matches MainPlugin.TryConnectPathDatabase pattern --- src/Core/AliasTree/AliasTreePlugin.cs | 19 +++++++++++++++++-- src/UI/WPF/Views/AliasTreeControl.xaml.cs | 17 +++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/Core/AliasTree/AliasTreePlugin.cs b/src/Core/AliasTree/AliasTreePlugin.cs index fe54eec..6aac84e 100644 --- a/src/Core/AliasTree/AliasTreePlugin.cs +++ b/src/Core/AliasTree/AliasTreePlugin.cs @@ -21,6 +21,8 @@ namespace NavisworksTransport.Core.AliasTree var eh = new ElementHost { AutoSize = true }; _control = new AliasTreeControl(); + _control.OnDatabaseNeeded += TryConnectToDatabase; + _control.BeforeSaveAlias += EnsureDatabaseCreated; eh.Child = _control; eh.CreateControl(); @@ -48,6 +50,8 @@ namespace NavisworksTransport.Core.AliasTree { base.OnLoaded(); NavisApplication.ActiveDocumentChanged += OnDocumentChanged; + // 面板自动恢复时文档可能已加载,主动尝试连接 + TryConnectToDatabase(); } protected override void OnUnloading() @@ -71,9 +75,9 @@ namespace NavisworksTransport.Core.AliasTree var doc = NavisApplication.ActiveDocument; if (doc == null || string.IsNullOrEmpty(doc.FileName)) return; - // 强制初始化数据库(首次保存别名也会触发建库) + // 只连接,不创建(和路径规划一致) var pathManager = PathPlanningManager.GetActivePathManager(); - pathManager?.DatabaseInitialize(createIfMissing: true); + pathManager?.DatabaseInitialize(createIfMissing: false); var db = pathManager?.GetPathDatabase(); if (db?.Connection == null) return; @@ -88,5 +92,16 @@ namespace NavisworksTransport.Core.AliasTree LogManager.Error($"[别名树] 连接数据库失败: {ex.Message}"); } } + + /// + /// 确保数据库已创建(保存别名时调用) + /// + private void EnsureDatabaseCreated() + { + if (_control?.GetDataStore() != null) return; + var pathManager = PathPlanningManager.GetActivePathManager(); + pathManager?.DatabaseInitialize(createIfMissing: true); + TryConnectToDatabase(); + } } } diff --git a/src/UI/WPF/Views/AliasTreeControl.xaml.cs b/src/UI/WPF/Views/AliasTreeControl.xaml.cs index 27e98da..de9aaea 100644 --- a/src/UI/WPF/Views/AliasTreeControl.xaml.cs +++ b/src/UI/WPF/Views/AliasTreeControl.xaml.cs @@ -23,6 +23,11 @@ namespace NavisworksTransport.UI.WPF.Views // ============================================================ private AliasDataStore _dataStore; + + /// 当控件检测到模型就绪但数据存储未连接时触发 + internal event Action OnDatabaseNeeded; + /// 保存别名前触发(确保数据库已创建) + internal event Action BeforeSaveAlias; private Dictionary _nodeMap = new Dictionary(); private bool _isInternalSelection = false; private Autodesk.Navisworks.Api.ModelItem _currentSelectionItem; @@ -44,6 +49,16 @@ namespace NavisworksTransport.UI.WPF.Views NavisApplication.ActiveDocumentChanged += (s, e) => { _built = false; RebuildTree(); }; NavisApplication.ActiveDocumentChanging += (s, e) => { _built = false; }; + // 模型加载事件:面板启动时文档已存在但模型未加载时触发 + var doc = NavisApplication.ActiveDocument; + if (doc != null) + doc.Models.CollectionChanged += (s, e) => + { + _built = false; + RebuildTree(); + OnDatabaseNeeded?.Invoke(); + }; + HookSelectionEvents(); // 立即构建:面板打开时如果文档已存在,不走事件也要构建 @@ -638,6 +653,7 @@ namespace NavisworksTransport.UI.WPF.Views { if (e.Key == Key.Enter) { + BeforeSaveAlias?.Invoke(); if (_currentSelectionItem == null || _dataStore == null) return; string input = TxtAliasInput.Text?.Trim(); if (string.IsNullOrEmpty(input)) return; @@ -757,6 +773,7 @@ namespace NavisworksTransport.UI.WPF.Views string newAlias = textBox.Text?.Trim(); if (string.IsNullOrEmpty(newAlias) || newAlias == node.OriginalName) newAlias = null; + BeforeSaveAlias?.Invoke(); LogManager.Info($"[别名树] 内联编辑: {newAlias}, NodeKey={node.NodeKey}"); if (_dataStore != null) {