1

我正在使用 Visual Studio 2013 在 AutoCAD 2014 中工作。

使用我的代码,我从 DocumentManager 访问 MdiActiveDocument 的数据库。

使用数据库我启动一个事务并使用事务的 GetObject 方法来检索实体对象。

            Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                var obj = acTrans.GetObject(id, OpenMode.ForRead);
                if (obj is Entity)
                {
                   // do stuff
                }

                acTrans.Commit();
            }

当我在开发并从 Visual Studio 内部启动 AutoCAD 时,这工作正常。在开发中,我在应用程序属性的“调试”选项卡中设置了“启动外部程序”开关,因此它为我启动了 AutoCAD,一切正常。

我遇到的问题是,在生产中,当 AutoCAD 通过注册表设置(我使用按需加载)加载应用程序时,MdiActiveDocument 为空,因此代码崩溃。我发现 Application.DocumentManager 中有一个文档,但是当我将该文档中的数据库分配给 acCurDb 时,TransactionManager 会抛出一个错误,我尝试使用 StartTransaction 方法。

                if (Application.DocumentManager.Count > 0)
                {
                    foreach(Document doc in Application.DocumentManager)
                    {
                        acCurDb = doc.Database;
                        break;
                    }
                }

                using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
                {

                } 

有人可以帮助我理解为什么 MdiActiveDocument 为空和/或指导我在 AutoCAD 中获取 Transaction 对象的正确方法吗?

4

2 回答 2

1

从 2015 年开始,AutoCAD 在启动时可能会有一个空的活动文档,具体取决于用户系统变量。这只是您在运行例程之前必须添加的另一项检查。

于 2015-02-14T02:49:16.090 回答
0

正如@david-wolfe 所提到的,AutoCAD 2015 开始时可能没有活动文档(只是一个仪表板)。在这种情况下,MdiActiveDocument 可以为空。

现在您使用的是 AutoCAD 2014,因此可能会发生不同的情况:如果您的应用程序使用 AutoCAD 加载,您的代码可能会在任何东西真正准备好之前运行。你是如何运行代码的?它是命令方法吗?如果是命令,则用户只能从命令中运行它,因此它将是一个活动文档。但是,如果您从其他方法运行它(例如从功能区或从调色板直接调用),它可能为空。

于 2015-06-24T13:22:19.050 回答