为什么MdiActiveDocument在AutoCAD 2015+的开头是null?

时间:2015-02-13 21:36:52

标签: autocad autocad-plugin

我使用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为null和/或指导我在AutoCAD中获取Transaction对象的正确方法吗?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

现在您正在使用AutoCAD 2014,因此可能会出现另一种情况:如果您的应用程序正在加载AutoCAD,您的代码可能会在任何事情准备就绪之前运行。你是如何运行代码的?它是CommandMethod吗?如果是命令,则用户只能从命令运行它,因此它将是活动文档。但是如果你从其他方法运行它(比如从Ribbon或调色板直接调用),它可能是null。