非后台情况时,在cad使用保存函数db.Save(),无论如何都会出错.
但是当使用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); //还是这种 } } }
但是文档上面也有一个保存函数,这个倒是成功的...不过就是会关闭文档罢了.
e大说:文档和db是分开的对象,文档占用了文件,db无法覆盖,所以用文档的 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 ", false, true, true); //不需要切换文档 flag = false; break; } } if (flag) { //后台的数据库可以用这种方式保存 db.SaveAs(db.Filename, db.SecurityParameters); } }
嘻嘻.感谢e大和福萝卜.