AutoCAD .NET API で開いた図面上で新規にオブジェクトを作成したり、既存のオブジェクトを編集したりする際、トランザクション マネージャを利用して対象オブジェクトをオープン(既存オブジェクト編集時のみ)、編集、コミットの手順を踏んで処理します。作成/編集されたオブジェクトは、コミットの時点で編集内容が図面上に反映されます。
一方、AutoCAD Mechanical 上で同様の処理をおこなう場合、AutoCAD Mechanical 固有の アクティブ トランザクション(Active Transaction)という機構が有効になり、標準のトランザクションをラップする動作をします。言い方を変えるなら、AutoCAD Mechanical 側で最上位となるトランザクションを持つため、アドインが対象オブジェクトを編集するために用意したトランザクションは、この時点でネストされた状態になってしまいます。
この状態は、TransactionManager.TopTransaction プロパティで知ることが出来ます。
[CommandMethod("MyCommand", CommandFlags.Modal)]public void MyCommand() // This method can have any name{Database db = Application.DocumentManager.MdiActiveDocument.Database;DEditor ed = Application.DocumentManager.MdiActiveDocument.Editor;if (db.TransactionManager.TopTransaction != null){ed.WriteMessage("\nTopTransaction あり!");}else{ed.WriteMessage("\nTopTransaction なし");}}
上記 MyCommand コマンドを実装したアドイン アプリを AutoCAD 単体にロードして実行すると、次のように表示されます。
同じコマンドを AutoCAD Mechanical で実行すると、AutoCAD 単体時とは異なるメッセージが表示されるはずです。
アクティブ トランザクションは 、既に販売を停止した AutoCAD Mechanical Desktop から継承した内部機構です。常にオブジェクトのオープン状態を維持しておくことで、頻繁にオープン、コミット(クローズ)を繰り返しても、製品パフォーマンスが低下しないよう意図して用意されています。
オンラインヘルプ「トランザクションをネストする(.NET)」で説明されているように、トランザクションがネストしていると、一番外側のトランザクションが内側のトランザクションに影響を与えることになります。場合によっては図面に追加したオブジェクトや既存オブジェクトへの編集が、画面上に反映されない現象が発生してしまう場合があります。
AutoCAD Mechanical 上でアクティブ トランザクション機構を無効化することは出来ないので、即座の画面更新が要求される場合には、次のような対応を考える必要が出てきます。(アドインの実装にも依るので、期待した効果が得られない場合も考えられます。)
- 標準トランザクションの起動を TransactionManager.StartTransaction メソッドから TransactionManager.StartOpenCloseTransaction メソッドに置き換えてみる。
参考:トランザクションを使用してオブジェクトにアクセスする、オブジェクトを作成する(.NET) - アドイン側のトランザクションを使用して、次のように、対象オブジェクトのグラフィックスを強制的に更新してみる。
doc.TransactionManager.QueueForGraphicsFlush();
doc.TransactionManager.EnableGraphicsFlush(true);
doc.TransactionManager.FlushGraphics(); - 対象オブジェクトにグラフィックスの更新を伴うメソッドがあれば、編集結果がグラフィックスに反映されるか試してみる。
例)寸法の場合には Dimension.RecomputeDimensionBlock メソッド、表の場合には Table.RecomputeTableBlock メソッドなど
もし、AutoCAD Mechanical 上でのみ、アドイン実装で予期しない表示上の問題が発生する場合には、ぜひお試しください。
By Toshiaki Isezaki
コメント