diff --git a/src/IFoxCAD.Cad/Runtime/DBTrans.cs b/src/IFoxCAD.Cad/Runtime/DBTrans.cs index 31fdccbf231fa5871a29bd2d70cb8a5fa10a92c7..20659f9ca8d35dd74da9f674a993e23c1c41bdc1 100644 --- a/src/IFoxCAD.Cad/Runtime/DBTrans.cs +++ b/src/IFoxCAD.Cad/Runtime/DBTrans.cs @@ -71,7 +71,7 @@ public static DBTrans Top /// /// 要打开的文档 /// 事务是否提交 - public DBTrans(Document doc = null, bool commit = true, bool doclock = false) + public DBTrans(bool commit = true, bool doclock = false, Document doc = null) { Document = doc ?? Application.DocumentManager.MdiActiveDocument; Database = Document.Database; @@ -96,17 +96,34 @@ public DBTrans(Database database, bool commit = true) /// 事务是否提交 public DBTrans(string fileName, bool commit = true) { - Database = new Database(false, true); - if (Path.GetExtension(fileName).ToLower().Contains("dxf")) + if (string.IsNullOrWhiteSpace(fileName)) + throw new ArgumentNullException(nameof(fileName)); + + var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.Cast() + .FirstOrDefault(doc => doc.Database.OriginalFileName == fileName); + if (null != doc) { - Database.DxfIn(fileName, null); + Database = doc.Database; + Document = doc; + Editor = doc.Editor; + Init(commit, true); } else { - Database.ReadDwgFile(fileName, FileShare.Read, true, null); + if (System.IO.File.Exists(fileName)) + { + Database = new Database(false, true); + if (Path.GetExtension(fileName).ToLower().Contains("dxf")) + Database.DxfIn(fileName, null); + else + Database.ReadDwgFile(fileName, FileOpenMode.OpenForReadAndWriteNoShare, true, null); + } + else + Database = new Database(true, false); + + Database.CloseInput(true); + Init(commit, false); } - Database.CloseInput(true); - Init(commit, false); } /// /// 初始化事务及事务队列、提交模式 @@ -312,7 +329,6 @@ public void Commit() protected virtual void Dispose(bool disposing) { - //Transaction.TransactionManager.QueueForGraphicsFlush(); if (!disposedValue) { if (disposing) @@ -322,7 +338,8 @@ protected virtual void Dispose(bool disposing) dBTrans.Pop(); if (!Transaction.IsDisposed) { - Transaction.TransactionManager.QueueForGraphicsFlush(); + if (Document?.IsActive==true) + Transaction.TransactionManager.QueueForGraphicsFlush(); Transaction.Dispose(); } documentLock?.Dispose(); diff --git a/tests/Test/testFileDatabase.cs b/tests/Test/testFileDatabase.cs new file mode 100644 index 0000000000000000000000000000000000000000..fb61dba9b65c93b7bd9919223bc6f5d2aa0ac0bb --- /dev/null +++ b/tests/Test/testFileDatabase.cs @@ -0,0 +1,29 @@ +/************************************************************** +*作者:Leon +*创建时间:2022/2/11 9:55:32 +**************************************************************/ +namespace Test +{ + public class TestFileDatabase + { + [CommandMethod("Test_FileDatabaseInit")] + public void TestDatabase() + { + try + { + var fileName = @"C:\Users\Administrator\Desktop\合并详图测试BUG.dwg"; + using DBTrans trans = new(fileName); + trans.ModelSpace.AddEntity(new Line(new(0, 0, 0), new(1000, 1000, 0))); + if (trans.Document != null && trans.Document.IsActive) + trans.Document.SendStringToExecute("_qsave\n", false, true, true); + else + trans.Database.SaveAs(fileName, DwgVersion.AC1021); + } + catch (System.Exception e) + { + System.Windows.MessageBox.Show(e.Message); + } + + } + } +} \ No newline at end of file diff --git a/tests/Test/testid.cs b/tests/Test/testid.cs index 911fd531f912189fe03a8de3484714e5f40fd51e..7d359845c2a302bc38a04323c9dc36a5f069bca9 100644 --- a/tests/Test/testid.cs +++ b/tests/Test/testid.cs @@ -55,7 +55,7 @@ public void TestId() [CommandMethod("testmycommand")] public void TestMyCommand() { - using (var dbtrans = new DBTrans(Env.Document,true,false)) { + using (var dbtrans = new DBTrans(true,false)) { using (var trans = Env.Database.TransactionManager.StartTransaction()) { var l1 = new Line(new Point3d(0, 0, 0), new Point3d(100, 100, 0));