我使用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对象的正确方法吗?
答案 0 :(得分:1)
从2015年开始,AutoCAD可能在启动时具有空活动文档,具体取决于用户系统变量。这只是在运行例行程序之前必须添加的另一项检查。
答案 1 :(得分:0)
正如@ david-wolfe所提到的,AutoCAD 2015可能从没有活动文档(只是仪表板)开始。在这种情况下,MdiActiveDocument可以为null。
现在您正在使用AutoCAD 2014,因此可能会出现另一种情况:如果您的应用程序正在加载AutoCAD,您的代码可能会在任何事情准备就绪之前运行。你是如何运行代码的?它是CommandMethod吗?如果是命令,则用户只能从命令运行它,因此它将是活动文档。但是如果你从其他方法运行它(比如从Ribbon或调色板直接调用),它可能是null。