前回は AutoCAD 図面にブロックを登録しましたが、実際に使用する機会が多いのは登録よりもむしろ挿入の方でしょう。多くの場合テンプレートで代用できる登録と異なり、挿入はアプリケーションを自動化する上で様々な利点があります。そこで本稿では、ブロックを図面上に表示してみたいと思います。

なおサンプルコードは VisualStudio2005 の C# で作成し、 AutoCAD2007 / 2008 / 2009 で動作確認を行いました。

ブロック挿入のサンプル

ブロックを挿入する場合は、BlockReference クラスのインスタンスを new してからモデルスペースに登録します。このとき、対象のブロックが図面に登録されている必要があることに注意してください。

まずは下記のサンプルコードをビルドし、その成果物を [NETLOAD] してください。次にサンプル図面を開いてから [INSERT_SAMPLE] コマンドを発行すると、原点に "Sample" ブロックが挿入されます。
なおサンプル図面は、前回作成した [CREATE_SAMPLE] コマンドを使って "Sample" ブロック定義を登録したものです。

サンプルコード

[CommandMethod( "INSERT_SAMPLE" )]
public void InsertSample()
{
    Transaction trans = null;
    try
    {
        Document active_doc = Application.DocumentManager.MdiActiveDocument;
        Database active_db = active_doc.Database;
        trans = active_doc.TransactionManager.StartTransaction();

        // 1. ブロックテーブルを開く
        BlockTable blk_tbl
            = (BlockTable)trans.GetObject( active_db.BlockTableId, OpenMode.ForRead );

        // 2. Sampleブロックが登録されているかを確認する
        if( !blk_tbl.Has( "Sample" ) )
        {
            active_doc.Editor.WriteMessage( "\nSample ブロックが登録されていません" );
            return;
        }

        // 3. ブロック参照オブジェクトを生成する
        BlockReference sample_ref =
            new BlockReference( Point3d.Origin, blk_tbl[ "Sample" ] );

        // 4. ブロック参照オブジェクトを登録する
        ObjectId model_space_id = blk_tbl[ BlockTableRecord.ModelSpace ];
        BlockTableRecord model_space =
            (BlockTableRecord)trans.GetObject( model_space_id, OpenMode.ForWrite );
        model_space.AppendEntity( sample_ref );
        trans.AddNewlyCreatedDBObject( sample_ref, true );

        trans.Commit();
    }
    catch( System.Exception ex )
    {
        Editor edit = Application.DocumentManager.MdiActiveDocument.Editor;
        edit.WriteMessage( "\n" + ex.Message );
    }
    finally
    {
        if( trans != null )
        {
            trans.Dispose();
        }
    }
}

環境によっては、コンパイル時に "この参照を解決できませんでした" という警告が出ます。この場合 "acdbmgd.dll" と "acmgd.dll" を削除し、 AutoCAD のインストールディレクトリから参照しなおしてください。

実行結果

"Sample" ブロック挿入

Fig01: "Sample" ブロックの挿入

サンプルコード解説

ブロックテーブルを開く

データベースからブロックテーブルのオブジェクトIDを取得し、それを使ってブロックテーブルを開きます。前回と異なり、今回はブロック定義を参照するだけですので、ForRead で開いてください。

ブロック名のチェック

登録されていないブロック定義のオブジェクトIDを取得しようとすると、eKeyNotFound エラーが発生します。これを避けるには BlockTable.Has() メソッドを使って事前に存在チェックをしておきます。

挿入しようとしたブロックが登録されていない場合にどうするかはアプリケーション次第ですが、ここではメッセージを表示してコマンドを抜けることにしました。

ブロック参照オブジェクトを作成し、登録する。

BlockReference クラスのインスタンスを生成するとブロック参照オブジェクトを作成することができます。そして、そのブロック参照オブジェクトをモデルスペースに登録するとブロックが図面に表示されます。

BlockReference クラスのコンストラクタには、ブロック参照オブジェクトの挿入先座標と、参照するブロック定義のオブジェクトIDを指定します。ブロック定義のオブジェクトIDは BlockTable のインデクサにブロック名を与えると取得できます。AutoCAD のブロック名ですので、大文字と小文字を区別しません。

(MINERVA 深津貴成)