Visual Studio 2013 を使用して AutoCAD 2014 で作業しています。
私のコードでは、 DocumentManager から MdiActiveDocument のデータベースにアクセスします。
データベースを使用してトランザクションを開始し、トランザクションの GetObject メソッドを使用して Entity オブジェクトを取得します。
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がnullであるため、コードがクラッシュすることです。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 でトランザクション オブジェクトを取得する適切な方法を教えてもらえますか?