Delay database creation until plugin data is needed

This commit is contained in:
tian 2026-04-11 22:29:40 +08:00
parent bbd72345c9
commit 7e1931fd37
5 changed files with 103 additions and 81 deletions

View File

@ -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
}
}
}
}

View File

@ -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<ModelItem> _walkableAreas;
private List<PathRoute> _routes;
private PathRoute _currentRoute;
@ -167,33 +169,61 @@ namespace NavisworksTransport
LogManager.Info($"PathPlanningManager初始化完成ManagerId: {_managerId}");
// 注意:数据库初始化延迟到文档加载完成后
// 在 MainPlugin.OnModelsCollectionChanged 中会调用 DatabaseInitialize()
// 注意:数据库采用按需初始化。
// 文档加载时只尝试连接已存在的数据库,不再为未使用插件的文档自动创建 .db 文件。
}
/// <summary>
/// 路径分析数据库初始化
/// 此方法应在文档加载完成后调用
/// </summary>
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}");

View File

@ -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;
}
/// <summary>
/// 执行数据备份
/// </summary>
@ -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(

View File

@ -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"

View File

@ -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("时标服务已初始化");
}