Delay database creation until plugin data is needed
This commit is contained in:
parent
bbd72345c9
commit
7e1931fd37
@ -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
|
||||
);
|
||||
|
||||
// 不重新抛出,避免插件崩溃,但批处理等功能将不可用
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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}");
|
||||
|
||||
@ -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(
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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("时标服务已初始化");
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user