【AutoCAD】ダイナミックブロックまとめ記事10選 について図面がダウンロードできない不具合を修正しました。

【AutoCAD】.NET API入門⑥|ブロック参照を自動配置するカスタムコマンドの作り方

【AutoCAD】.NET API入門⑥|ブロック参照を自動配置するカスタムコマンドの作り方

AutoCADを使っていると、同じブロックを何度も挿入する作業や、一定の位置にまとめて配置する作業が面倒に感じることはありませんか?

.NET APIを使えば、C#で独自のカスタムコマンドを作成し、ブロックをプログラムで自動的に配置できます。

この記事では 「ブロック参照の基本的な自動配置方法」 を中心に解説します。
また、共通処理をまとめる「ユーティリティ化」の考え方についても紹介します。

この記事のポイント
  • AutoCADにカスタムコマンドを追加してブロックを自動配置する方法
  • C#でのサンプルコードと動作の流れ
  • 共通処理をまとめる「ユーティリティ化」で効率アップ

※事前準備でVisualStudioのインストールやファイルの設定が必要です。
 ファイルの作り方やライブラリの参照方法などは過去の記事を参考に設定をお願いします。

👉過去の.NET APIコーディングに関する記事はこちら
【AutoCAD】.NET API入門①|線分を自動生成する方法
【AutoCAD】.NET API入門②|ポリラインを自動生成する方法
【AutoCAD】.NET API入門③|円・楕円を自動生成する方法
【AutoCAD】.NET API入門④|円弧を自動生成するカスタムコマンドの作り方
【AutoCAD】.NET API入門⑤|文字(DBText・MText)を自動配置するカスタムコマンドの作り方

スポンサーリンク

 

カスタムコマンドの基本

カスタムコマンドで図形を追加する前に、コマンドラインで「HelloWorld」と表示させるコードはこちらになります。テンプレートをベースにコードを書いてみてください↓

HelloWorldコマンド(C#)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//AutoCAD用のライブラリ追加
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
namespace HelloWorld
{ public class Class1 {
    //コマンドの作成 [CommandMethod("HelloWorld")] public void HelloWorld() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.WriteMessage("\nHelloWorld!"); } }
}

CommandMethod 属性を使えば、AutoCADのオリジナルコマンドとして登録できます。

このコードをVisualStudioでリビルドしてから、NETLOADコマンドで作成したdllファイルを読み込みます。

NETLOADコマンドでdllファイル読み込み
NETLOADコマンドでdllファイル読み込み

次にコマンドラインで 「HelloWorld」と入力するとメッセージが表示されます↓

HELLOWORLDコマンドの実行
HELLOWORLDコマンドの実行
こたろー
こたろー

ライブラリの参照や追加方法については過去の記事を参考にしてください!

 

ブロック参照を作成するコマンド(基本)

ブロック挿入コード

ブロック参照を配置するには、次の流れになります。

  1. 図面内に対象の「ブロック定義」があることを確認
  2. モデル空間にブロック参照(BlockReference)を作成
  3. 必要な座標に配置

それでは、サンプルコードを見てみましょう。
今回はBlockSampleクラスInsertMyBlockコマンドを作成しました↓

ブロック挿入コマンドテンプレート(C#)
// AutoCADのカスタムコマンドを定義する属性
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
public class BlockSample
{ [CommandMethod("InsertMyBlock")] public void InsertMyBlock() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; using (Transaction tr = db.TransactionManager.StartTransaction()) { // ブロックテーブルを取得 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); // 例として "MyBlock" という名前のブロック定義を取得 if (!bt.Has("MyBlock")) { doc.Editor.WriteMessage("\nMyBlock が図面に存在しません。"); return; } BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); // ブロック定義IDを取得 ObjectId blockDefId = bt["MyBlock"]; // 配置座標(今回は(200,100,0)の座標に配置) Point3d insPt = new Point3d(200, 100, 0); // ブロック参照を作成 BlockReference br = new BlockReference(insPt, blockDefId); // モデル空間に追加 btr.AppendEntity(br); tr.AddNewlyCreatedDBObject(br, true); tr.Commit(); } }
}

コードのポイント解説

線分コードのポイントについて簡単に解説します。

ブロック挿入コードの解説
  • if (!bt.Has(“MyBlock”))
     ブロック定義の有無を確認します。
     今回はif文でMyBlockというブロックが存在しないと挿入できないようにしました。
  • ObjectId blockDefId = bt[“MyBlock”];
     ブロック定義IDを取得します。
     今回はMyBlockというブロックのIDを自動で取ってくれます。
  • Point3d insPt = new Point3d(200, 100, 0);
     配置座標を設定します。今回は原点座標(200, 100 ,0)にブロックを配置します。
  • BlockReference br = new BlockReference(insPt, blockDefId);
     ブロック参照を作成します。
    👉BlockReferenceの引数に③で設定した座標と④のブロックIDを入れます。
  • btr.AppendEntity(br);
      tr.AddNewlyCreatedDBObject(br, true);
     ブロック参照を図面に追加し、トランザクション(AutoCADのデータベース)に登録します。
    👉「ブロックがAutoCADでちゃんと管理できるようにする処理」と覚えておけばOK!

 

動作確認

それでは作成したコードの動作確認を行いましょう。
dllをロードする前にMyBlockというブロックが要るので作ります↓

MyBlockブロックの作成
MyBlockブロックの作成

今回はこんな感じの図形にしました。名前もMyBlockになっていますね。

ブロックの中身確認
ブロックの中身確認
こたろー
こたろー

ブロックの作成方法について詳しく知りたい方は過去記事を参照ください!


NETLOADコマンドでdllファイルをロードすると、作成したコマンドが表示されるので実行しましょう。すると、設定した座標(200, 100, 0)を原点に作成したブロックが挿入されました↓

InsertMyBlockコマンド 実行結果
InsertMyBlockコマンド 実行結果

ちなみにMyBlockという名前のブロックがない場合は、以下のように表示されます↓

MyBlockブロックがない場合
MyBlockブロックがない場合
こたろー
こたろー

ブロック名がない場合のデバッグ処理も必要です!

 

ユーティリティ化(コードの共通化)

複数のコマンドを作ると、「トランザクション開始」「BlockTable取得」「ModelSpace追加」 といった処理が何度も出てきます。
これを関数化してまとめておくと便利です。

ブロック挿入コマンド ユーティリティ化
// AutoCADのカスタムコマンドを定義する属性
public static void AddEntityToModelSpace(Entity ent, Database db, Transaction tr)
{ BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); btr.AppendEntity(ent); tr.AddNewlyCreatedDBObject(ent, true);
}

該当箇所に作成したAddEntityTomodelSpaceメソッドを入れると1行だけで処理を書けるになります。

こたろー
こたろー

このユーティリティを使えば、各コマンドはスッキリ書けます。

 

まとめ

今回は「【AutoCAD】.NET API入門⑥|ブロック参照を自動配置するカスタムコマンドの作り方」として、C#とAutoCAD .NET APIを使ったカスタムコマンドの作成例を紹介しました。

CommandMethod 属性でAutoCADのコマンドラインから独自コマンドを呼び出せる
 
BlockReference クラスを使ってブロック参照を配置できる
 
・共通処理をユーティリティ化すると、コードが整理され効率アップ
 Transaction開始、BlockTable取得などを関数にまとめると保守性UP!

これで「一度定義したブロックを任意の位置に自動配置」するカスタムコマンドが作れます。
次回は応用編として 「複数点にまとめて配置」「属性を同時設定」 といった実務的な自動化も解説予定です。

こたろー
こたろー

以上、こたろーでした。 


スポンサーリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA