cad.net 关于保存文件Database.SaveAs()出现eFileAccessErr错误的解决方法

前台开启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:保存并关闭文档

文档上面也有一个保存函数Document.CloseAndSave(),
这个倒是成功的,不过就是会关闭文档罢了.

跟e大讨论了之后,发现这要从cad程序架构来看,
文档doc和数据库db是分开的对象.

前台打开时候doc会占用db,所以不能直接操作db了,
所以用文档的函数可以成功.

而后台打开时候就没有doc占用,就能直接用db的保存.

using Acap = Autodesk.AutoCAD.ApplicationServices.Application;        

[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;        

public static void MySave(this Database db) {
    var doc = Acap.DocumentManager
        .Cast<Document>
        .FirstOrDefault(doc => doc.Database.Filename == db.Filename);

    if (doc is null) {
        // 后台开图,用数据库保存
        db.SaveAs(db.Filename, db.SecurityParameters); 
    }
    else {
        // 文档存在,表示前台开图,使用命令保存
        // 不需要切换文档
        doc.SendStringToExecute("_qsave\n", false, true, true);
    }
}

相关阅读

cad.net 事务栈上面写了一个完整的保存

posted @   惊惊  阅读(3289)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示