diff --git a/CADShared/Runtime/DBTrans.cs b/CADShared/Runtime/DBTrans.cs
index 38af048c03807e3c600dbdac1a6e8a73f7d3b6b8..31e24b78ef63c36d367364e8e39d7422f4d877da 100644
--- a/CADShared/Runtime/DBTrans.cs
+++ b/CADShared/Runtime/DBTrans.cs
@@ -177,6 +177,14 @@ public DBTrans(Database database, bool commit = true)
///
/// 事务栈
/// 打开文件,默认提交事务
+ /// 建议用法:
+ /// try
+ /// {
+ /// using var tr = new DBTrans(...);
+ /// ...
+ /// }
+ /// catch (...) { ... }
+ ///
///
/// 要打开的文件名
/// 事务是否提交
@@ -184,22 +192,26 @@ public DBTrans(Database database, bool commit = true)
/// 密码
/// 后台打开false;前台打开true(必须设置CommandFlags.Session)
public DBTrans(string fileName,
- bool commit = true,
- FileOpenMode fileOpenMode = FileOpenMode.OpenForReadAndWriteNoShare,
- string? password = null,
- bool activeOpen = false)
+ bool commit = true,
+ FileOpenMode fileOpenMode = FileOpenMode.OpenForReadAndWriteNoShare,
+ string? password = null,
+ bool activeOpen = false)
{
if (string.IsNullOrWhiteSpace(fileName))
+ {
+ IsDisposed = true; // 出错后未 Push 会造成 Pop 抛错, 固设为 true
throw new ArgumentNullException(nameof(fileName));
-
+ }
+
_fileName = fileName.Replace("/", "\\"); // doc.Name总是"D:\\JX.dwg"
-
+
// 此处若为失败的文件名,那么保存的时候就会丢失名称,
// 因此用 _fileName 储存
if (!File.Exists(_fileName))
{
if (activeOpen)
{
+ IsDisposed = true; // 出错后未 Push 会造成 Pop 抛错, 固设为 true
throw new IOException("错误:事务栈明确为前台开图时,文件不存在");
}
else
@@ -213,9 +225,9 @@ public DBTrans(Database database, bool commit = true)
else
{
var doc = Acaop.DocumentManager
- .Cast()
- .FirstOrDefault(doc => !doc.IsDisposed && doc.Name == _fileName);
-
+ .Cast()
+ .FirstOrDefault(doc => !doc.IsDisposed && doc.Name == _fileName);
+
if (activeOpen)
{
if (doc is null)
@@ -228,19 +240,20 @@ public DBTrans(Database database, bool commit = true)
}
catch (Exception e)
{
+ IsDisposed = true; // 出错后未 Push 会造成 Pop 抛错, 固设为 true
throw new IOException($"错误:此文件打开错误:{fileName}\n错误信息:{e.Message}");
}
}
-
+
// 设置命令标记: CommandFlags.Session
// 若没有设置: doc.IsActive 会异常
if (!doc.IsActive)
Acaop.DocumentManager.MdiActiveDocument = doc;
-
+
// Open()是跨文档,所以必须要锁文档
// 否则 Editor?.Redraw() 的 tm.QueueForGraphicsFlush() 将报错提示文档锁
_documentLock = doc.LockDocument();
-
+
Database = doc.Database;
Document = doc;
Editor = doc.Editor;
@@ -250,16 +263,27 @@ public DBTrans(Database database, bool commit = true)
if (doc is null)
{
Database = new Database(false, true);
- if (Path.GetExtension(_fileName).ToLower().Contains("dxf"))
+ try
{
- Database.DxfIn(_fileName, null);
+ if (Path.GetExtension(_fileName).ToLower().Contains("dxf"))
+ {
+ Database.DxfIn(_fileName, null);
+ }
+ else
+ {
+ Database.ReadDwgFile(_fileName, fileOpenMode, true, password);
+ }
}
- else
+ catch (Exception e)
{
- Database.ReadDwgFile(_fileName, fileOpenMode, true, password);
+ IsDisposed = true; // 出错后未 Push 会造成 Pop 抛错, 固设为 true
+ Acap.ShowAlertDialog($"错误:此文件打开错误:{fileName}\n格式版本可能高于当前CAD版本\n错误信息:{e.Message}");
+ throw; // 交给调用处处理更灵活,避免再次报错时CAD就直接退出
+ }
+ finally
+ {
+ Database.CloseInput(true);
}
-
- Database.CloseInput(true);
}
else
{
@@ -269,7 +293,7 @@ public DBTrans(Database database, bool commit = true)
}
}
}
-
+
Transaction = Database.TransactionManager.StartTransaction();
_commit = commit;
_dBTrans.Push(this);