1

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 でトランザクション オブジェクトを取得する適切な方法を教えてもらえますか?

4

2 に答える 2

1

2015 年以降、ユーザーのシステム変数によっては、AutoCAD の起動時に null のアクティブなドキュメントが表示される場合があります。これは、ルーチンを実行する前に追加する必要があるもう 1 つのチェックです。

于 2015-02-14T02:49:16.090 に答える
0

@david-wolfe が述べたように、AutoCAD 2015 はアクティブなドキュメントがない状態で起動する場合があります(ダッシュボードのみ)。この場合、MdiActiveDocument は null になる可能性があります。

現在、AutoCAD 2014 を使用しているため、別のシナリオが発生する可能性があります。AutoCAD でアプリをロードしている場合、実際に準備が整う前にコードが実行される可能性があります。コードをどのように実行していますか?コマンドメソッドですか?がコマンドの場合、ユーザーはコマンドからのみ実行できるため、アクティブなドキュメントになります。ただし、他の方法 (リボンやパレットからの直接呼び出しなど) から実行すると、null になる場合があります。

于 2015-06-24T13:22:19.050 に答える