前台開啟dwg保存方法出錯
出錯例子
前台打開圖紙的時候,使用保存函數db.Save(),無論如何都會出錯.
但是當使用db.SaveAs()時,除了調用被命令的文檔之外,其他已經打開的文檔都會拋出錯誤"eFileAccessErr"
可以從下面這個例子了解到:
[CommandMethod("save_test1", CommandFlags.Session)]
public void save_test1()
{
foreach (Document doc in Acap.DocumentManager)
{
//當打開多份圖紙的時候,用db.SaveAs都是會出錯的.
var db = doc.Database;
//using (doc.LockDocument())//無論是否使用文檔鎖
{
//db.SaveAs(db.Filename, db.SecurityParameters); //無論是這種
db.SaveAs(db.Filename, DwgVersion.Current); //還是這種
}
}
}
保存成功的例子1:保存並關閉文檔
但是文檔上面也有一個保存函數,這個倒是成功的...不過就是會關閉文檔罷了.
跟e大討論了之后,發現這要從cad程序架構來看,
文檔doc和數據庫db是分開的對象,db在doc下,doc占用了文件,db無法覆蓋操作,所以用文檔的 Document.CloseAndSave() 可以成功(因為桌子在內部做了工作...)
[CommandMethod("save_test2", CommandFlags.Session)]
public void save_test2()
{
foreach (Document item in Acap.DocumentManager)
{
item.CloseAndSave(item.Database.Filename);
}
}
保存成功的例子2:處理三種狀態
但是我程序處理保存的時候要同時處理三種狀態: 1,前台打開(激活的) 2,前台打開(未激活) 3,后台打開的
同時,我不調用令人討厭的 Document.CloseAndSave() ,福蘿卜提示我用發送命令.
using Acap = Autodesk.AutoCAD.ApplicationServices.Application;
private static void TestSaveDwgFiles(Database db)
{
bool flag = true;
foreach (Document doc in Acap.DocumentManager)
{
// 前台開圖,使用命令保存
if (doc.Database.Filename == db.Filename)
{
doc.SendStringToExecute("_qsave\n", false, true, true); //不需要切換文檔
flag = false;
break;
}
}
if (flag)
{
// 后台開圖,用數據庫保存
db.SaveAs(db.Filename, db.SecurityParameters);
}
}
嘻嘻.感謝e大和福蘿卜.
相關閱讀
cad.net 委托的學習 -->需求2: 批量輸入路徑提取數據庫