1.前台开启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);
}
}