AutoCAD Mechanical のアクティブ トランザクション

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 上でアクティブ トランザクション機構を無効化することは出来ないので、即座の画面更新が要求される場合には、次のような対応を考える必要が出てきます。(アドインの実装にも依るので、期待した効果が得られない場合も考えられます。)

doc.TransactionManager.QueueForGraphicsFlush();
doc.TransactionManager.EnableGraphicsFlush(true);
doc.TransactionManager.FlushGraphics();
  • 対象オブジェクトにグラフィックスの更新を伴うメソッドがあれば、編集結果がグラフィックスに反映されるか試してみる。
    例)寸法の場合には Dimension.RecomputeDimensionBlock メソッド、表の場合には Table.RecomputeTableBlock メソッドなど

もし、AutoCAD Mechanical 上でのみ、アドイン実装で予期しない表示上の問題が発生する場合には、ぜひお試しください。

By Toshiaki Isezaki

Discover more from Autodesk Developer Blog

Subscribe now to keep reading and get access to the full archive.

Continue reading