diff --git a/src/Core/MainPlugin.cs b/src/Core/MainPlugin.cs index e2a2c46..32a3607 100644 --- a/src/Core/MainPlugin.cs +++ b/src/Core/MainPlugin.cs @@ -574,7 +574,7 @@ namespace NavisworksTransport { LogManager.Info($"[文档管理] *** 状态分析: 从无到有(可能是打开文档)***"); - // 文档加载完成,初始化PathDatabase + // 文档加载完成,仅连接已存在的数据库,不为未使用插件的文档自动创建 .db if (!string.IsNullOrEmpty(activeDoc?.FileName)) { try @@ -582,33 +582,15 @@ namespace NavisworksTransport var pathManager = PathPlanningManager.GetActivePathManager(); if (pathManager != null) { - pathManager.DatabaseInitialize(); + pathManager.DatabaseInitialize(createIfMissing: false); } } catch (Exception ex) { - // 数据库初始化失败是严重错误,需要明确提示用户 - var errorMsg = $"数据库初始化失败:{ex.Message}\n\n"; - errorMsg += "可能的原因:\n"; - errorMsg += "1. 文件夹权限不足\n"; - errorMsg += "2. 磁盘空间不足\n"; - errorMsg += "3. 数据库文件被锁定\n"; - errorMsg += "4. SQLite 组件损坏\n\n"; - errorMsg += "详细信息请查看日志文件。"; - - LogManager.Error($"[文档管理] 数据库初始化失败: {ex.Message}", ex); + LogManager.Error($"[文档管理] 连接现有数据库失败: {ex.Message}", ex); LogManager.Error($"[文档管理] 文档路径: {activeDoc.FileName}"); LogManager.Error($"[文档管理] 异常类型: {ex.GetType().Name}"); LogManager.Error($"[文档管理] 堆栈信息: {ex.StackTrace}"); - - System.Windows.MessageBox.Show( - errorMsg, - "数据库初始化失败", - System.Windows.MessageBoxButton.OK, - System.Windows.MessageBoxImage.Error - ); - - // 不重新抛出,避免插件崩溃,但批处理等功能将不可用 } } } @@ -937,4 +919,4 @@ namespace NavisworksTransport } } -} \ No newline at end of file +} diff --git a/src/Core/PathPlanningManager.cs b/src/Core/PathPlanningManager.cs index 71a2a03..f325675 100644 --- a/src/Core/PathPlanningManager.cs +++ b/src/Core/PathPlanningManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading.Tasks; using Autodesk.Navisworks.Api; @@ -31,6 +32,7 @@ namespace NavisworksTransport // 路径分析相关 private PathDatabase _pathDatabase; private PathAnalysisService _analysisService; + private string _databaseDocumentPath; private List _walkableAreas; private List _routes; private PathRoute _currentRoute; @@ -167,33 +169,61 @@ namespace NavisworksTransport LogManager.Info($"PathPlanningManager初始化完成,ManagerId: {_managerId}"); - // 注意:数据库初始化延迟到文档加载完成后 - // 在 MainPlugin.OnModelsCollectionChanged 中会调用 DatabaseInitialize() + // 注意:数据库采用按需初始化。 + // 文档加载时只尝试连接已存在的数据库,不再为未使用插件的文档自动创建 .db 文件。 } /// /// 路径分析数据库初始化 /// 此方法应在文档加载完成后调用 /// - public void DatabaseInitialize() + public void DatabaseInitialize(bool createIfMissing = true) { try { var documentPath = Application.ActiveDocument?.FileName; - if (!string.IsNullOrEmpty(documentPath)) + if (string.IsNullOrEmpty(documentPath)) { - _pathDatabase = new PathDatabase(documentPath); - _analysisService = new PathAnalysisService(_pathDatabase); - LogManager.Info($"路径分析数据库初始化成功,文档路径: {documentPath}"); - - // 从数据库加载历史路径到内存 - LoadHistoricalRoutesFromDatabase(); - } - else - { - // 文档路径为空时,静默跳过(这种情况不应该发生,因为调用者应该确保文档已加载) LogManager.Debug("文档路径为空,跳过数据库初始化"); + return; } + + if (_pathDatabase != null && + string.Equals(_databaseDocumentPath, documentPath, StringComparison.OrdinalIgnoreCase)) + { + return; + } + + string dbPath = Path.ChangeExtension(documentPath, ".db"); + if (!createIfMissing && !File.Exists(dbPath)) + { + LogManager.Info($"文档对应数据库不存在,跳过自动连接: {dbPath}"); + return; + } + + if (_pathDatabase != null) + { + try + { + _pathDatabase.Dispose(); + } + catch (Exception disposeEx) + { + LogManager.Warning($"释放旧数据库连接时出现警告: {disposeEx.Message}"); + } + + _pathDatabase = null; + _analysisService = null; + _databaseDocumentPath = null; + } + + _pathDatabase = new PathDatabase(documentPath); + _analysisService = new PathAnalysisService(_pathDatabase); + _databaseDocumentPath = documentPath; + LogManager.Info($"路径分析数据库初始化成功,文档路径: {documentPath}"); + + // 从数据库加载历史路径到内存 + LoadHistoricalRoutesFromDatabase(); } catch (Exception ex) { @@ -4464,6 +4494,11 @@ namespace NavisworksTransport { DeactivateToolPlugin(); } + + _pathDatabase?.Dispose(); + _pathDatabase = null; + _analysisService = null; + _databaseDocumentPath = null; } catch (Exception ex) { @@ -5430,7 +5465,17 @@ namespace NavisworksTransport { try { - if (_pathDatabase != null && route != null) + if (route == null) + { + return; + } + + if (_pathDatabase == null) + { + DatabaseInitialize(createIfMissing: true); + } + + if (_pathDatabase != null) { _pathDatabase.SavePathRoute(route); LogManager.Info($"路径已保存到数据库: {route.Name}"); diff --git a/src/UI/WPF/ViewModels/SystemManagementViewModel.cs b/src/UI/WPF/ViewModels/SystemManagementViewModel.cs index 4048f76..2c61b0d 100644 --- a/src/UI/WPF/ViewModels/SystemManagementViewModel.cs +++ b/src/UI/WPF/ViewModels/SystemManagementViewModel.cs @@ -1022,7 +1022,7 @@ namespace NavisworksTransport.UI.WPF.ViewModels } else { - DatabaseVersion = "未连接"; + DatabaseVersion = "未创建"; PathCount = "--"; DetectionRecordCount = "--"; } @@ -1031,9 +1031,30 @@ namespace NavisworksTransport.UI.WPF.ViewModels { LogManager.Error($"刷新数据库状态失败: {ex.Message}"); DatabaseVersion = "错误"; + PathCount = "--"; + DetectionRecordCount = "--"; } } + private PathDatabase GetDatabaseForSystemManagement(string operationName) + { + var pathDatabase = PathPlanningManager.Instance?.GetPathDatabase(); + if (pathDatabase != null) + { + return pathDatabase; + } + + System.Windows.MessageBox.Show( + "当前文档还没有数据库文件。\n\n请先执行会产生持久化数据的操作(例如保存路径),或先恢复一个数据库备份,再使用这个功能。", + operationName, + System.Windows.MessageBoxButton.OK, + System.Windows.MessageBoxImage.Information); + UpdateMainStatus($"{operationName}未执行:当前文档没有数据库"); + LogManager.Info($"[{operationName}] 当前文档没有数据库,已阻止操作"); + RefreshDatabaseStatus(); + return null; + } + /// /// 执行数据备份 /// @@ -1043,16 +1064,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - var pathDatabase = PathPlanningManager.Instance?.GetPathDatabase(); - if (pathDatabase == null) - { - System.Windows.MessageBox.Show( - "未找到数据库连接,请确保已加载模型", - "备份数据", - System.Windows.MessageBoxButton.OK, - System.Windows.MessageBoxImage.Warning); - return; - } + var pathDatabase = GetDatabaseForSystemManagement("备份数据"); + if (pathDatabase == null) return; UpdateMainStatus("正在备份数据库..."); LogManager.Info("开始数据库文件备份"); @@ -1101,16 +1114,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - var pathDatabase = PathPlanningManager.Instance?.GetPathDatabase(); - if (pathDatabase == null) - { - System.Windows.MessageBox.Show( - "未找到数据库连接,请确保已加载模型", - "恢复数据", - System.Windows.MessageBoxButton.OK, - System.Windows.MessageBoxImage.Warning); - return; - } + var pathDatabase = GetDatabaseForSystemManagement("恢复数据"); + if (pathDatabase == null) return; // 选择备份文件 var openFileDialog = new Microsoft.Win32.OpenFileDialog @@ -1193,16 +1198,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - var pathDatabase = PathPlanningManager.Instance?.GetPathDatabase(); - if (pathDatabase == null) - { - System.Windows.MessageBox.Show( - "未找到数据库连接", - "修复数据库", - System.Windows.MessageBoxButton.OK, - System.Windows.MessageBoxImage.Warning); - return; - } + var pathDatabase = GetDatabaseForSystemManagement("修复数据库"); + if (pathDatabase == null) return; UpdateMainStatus("正在检查数据库..."); LogManager.Info("开始数据库修复检查"); @@ -1249,16 +1246,8 @@ namespace NavisworksTransport.UI.WPF.ViewModels { try { - var pathDatabase = PathPlanningManager.Instance?.GetPathDatabase(); - if (pathDatabase == null) - { - System.Windows.MessageBox.Show( - "未找到数据库连接", - "清空数据", - System.Windows.MessageBoxButton.OK, - System.Windows.MessageBoxImage.Warning); - return; - } + var pathDatabase = GetDatabaseForSystemManagement("清空数据"); + if (pathDatabase == null) return; // 双重确认 var result1 = System.Windows.MessageBox.Show( diff --git a/src/UI/WPF/Views/CollisionReportDialog.xaml b/src/UI/WPF/Views/CollisionReportDialog.xaml index 30a6adb..807a5bf 100644 --- a/src/UI/WPF/Views/CollisionReportDialog.xaml +++ b/src/UI/WPF/Views/CollisionReportDialog.xaml @@ -17,7 +17,7 @@ NavisworksTransport 碰撞检测报告对话框 - 采用与主界面一致的Nav xmlns:local="clr-namespace:NavisworksTransport.UI.WPF.Converters" mc:Ignorable="d" Title="碰撞检测报告" - Height="1080" + Height="960" Width="900" ResizeMode="CanResize" WindowStartupLocation="CenterOwner" diff --git a/src/UI/WPF/Views/PathEditingView.xaml.cs b/src/UI/WPF/Views/PathEditingView.xaml.cs index c80fe75..551b8e4 100644 --- a/src/UI/WPF/Views/PathEditingView.xaml.cs +++ b/src/UI/WPF/Views/PathEditingView.xaml.cs @@ -86,8 +86,14 @@ namespace NavisworksTransport.UI.WPF.Views // 确保服务已初始化 if (_timeTagService == null) { - var doc = Autodesk.Navisworks.Api.Application.ActiveDocument; - var db = new PathDatabase(doc.FileName); + var pathManager = PathPlanningManager.Instance; + pathManager.DatabaseInitialize(createIfMissing: true); + var db = pathManager.GetPathDatabase(); + if (db == null) + { + throw new InvalidOperationException("时标服务初始化失败:无法获取数据库实例"); + } + _timeTagService = new TimeTagService(db); LogManager.Info("时标服务已初始化"); }