当使用代码在Database使用保存函数Save(),无论如何都会出错.
但是当使用SaveAs()的时候,除了调用命令的文档,其他已经打开的文档都会抛出错误"eFileAccessErr"
可以从下面这个例子了解到:
[CommandMethod("save_test1", CommandFlags.Session)]
public void save_test1()
{
foreach (Document item in Acap.DocumentManager)
{
//当打开两份图纸的时候,用db.SaveAs都是会出错的.
var db = item.Database;
//using (item.LockDocument())//无论是否使用
{
//db.SaveAs(db.Filename, db.SecurityParameters); //无论是这种
db.SaveAs(db.Filename, DwgVersion.Current); //还是这种
}
}
}
但是文档上面也有一个保存函数,这个倒是成功的...不过就是会关闭文档罢了.
e大说:文档和db是分开的对象,文档占用了文件,db无法覆盖,所以用文档的Document.CloseAndSave可以成功.
[CommandMethod("save_test2", CommandFlags.Session)]
public void save_test2()
{
foreach (Document item in Acap.DocumentManager)
{
item.CloseAndSave(item.Database.Filename);
}
}
但是我程序处理保存的时候要同时处理三种状态: 1,前台打开(激活的) 2,前台打开(未激活) 3,后台打开的
同时,我不调用令人讨厌的Document.CloseAndSave
using Acap = Autodesk.AutoCAD.ApplicationServices.Application; private static void TiJiao(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)
{
try
{
//后台的数据库可以用这种方式保存
//这里错误会弹对话框,所以只能先判断是不是DocumentManager的
db.SaveAs(db.Filename, db.SecurityParameters);
}
catch
{ }
}
}
嘻嘻.感谢e大和福萝卜. |