この記事の難易度
AutoCADを使っていると、「図面をプログラムで自動生成できたら便利なのに」と思うことはありませんか?
たとえば、同じ線分を何度も作成する作業や、一定のルールで線分を引く作業は、自動化することで大幅に効率化できます。
C#とAutoCAD .NET APIを使えば、カスタムコマンドを追加して、線分をプログラムで描画することが可能です。
この記事では 「線分の基本的な作成方法」 を中心に解説します。
また、繰り返し使う処理をまとめた「ユーティリティ化」についても解説します。
- AutoCADにカスタムコマンドを追加して線分を自動生成する方法
- C#でのサンプルコードと動作の流れ
- 共通処理をまとめる「ユーティリティ化」で開発効率を向上
※事前準備でVisualStudioのインストールやファイルの設定が必要です。
ファイルの作り方やライブラリの参照方法などは過去の記事を参考に設定をお願いします。
カスタムコマンドの基本
カスタムコマンドで図形を追加する前に、コマンドラインで「HelloWorld」と表示させるコードはこちらになります。テンプレートをベースにコードを書いてみてください↓
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 {
// HelloWorldコマンドを追加する [CommandMethod("HelloWorld")] public void HelloWorld() { Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; ed.WriteMessage("\nHelloWorld!"); } }
}
AutoCAD上で HelloWorld
と入力すると、コマンドラインにメッセージが表示されます。
CommandMethod
属性を使えば、AutoCADのオリジナルコマンドとして登録できます。
このコードをVisualStudioでリビルドして、コマンドラインで 「HelloWorld」と入力するとメッセージが表示されます。


ライブラリの参照や追加方法については過去の記事を参考にしてください!
線分を作成するコマンド(基本)
コマンド開発の前に線分について詳しく知りたい方は過去の記事を参照ください。
👉【AutoCADの基本】LINEコマンドで線分を作図!初心者でも簡単マスター
AutoCADで独自のコマンドを実行するためには、C#でCommandMethod属性を持つメソッドを定義します。
これにより、AutoCADのコマンドラインから直接呼び出せるようになります。
図形を書くための雛形がこちらです↓ これをクラスの中に入れて編集します。
// AutoCADのカスタムコマンドを定義する属性
[CommandMethod("MyCommand")]
public void MyCommand()
{ // 現在アクティブな図面(ドキュメント)を取得 Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; // トランザクション開始(DB操作を安全に行うため) using (Transaction tr = db.TransactionManager.StartTransaction()) { // ブロックテーブルを読み取り専用で取得、モデル空間のブロックテーブルレコードを編集モードで取得 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); // ★ここに図形を追加する処理を書く★ tr.Commit(); }
}
CommandMethodでコマンド名を設定して、using (Transaction tr = ⋯の中に作図の処理を書いていきます。難しそうですが、おまじないだと思いましょう。

ライブラリの参照やファイルの作り方を間違えるとエラーがでます。
過去の記事を参考に設定してください。
次に、本題の「線分」をC#で作成してみましょう。
[CommandMethod("CreateLine")]
public void CreateLine()
{ Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; // トランザクション開始 using (Transaction tr = db.TransactionManager.StartTransaction()) { // モデル空間を取得 BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
// ★★★★★ここに図形を追加する処理を書く★★★★★ // 始点 (0,0,0) → 終点 (100,100,0) の線分を作成 Line line = new Line(new Point3d(0, 0, 0), new Point3d(100, 100, 0)); // モデル空間に追加 btr.AppendEntity(line); tr.AddNewlyCreatedDBObject(line, true);
// ★★★★★追加はここまで★★★★★ // 保存 tr.Commit(); }
}
💡 原点(0,0)から(100,100)までの線分が作成されます。最初に試すのに最適なサンプルです。
コマンドを実行するとこんな感じでコマンドが追加されて線分が作図できます↓

線分コードのポイントについて簡単に解説します。
- ① Line line = new Line(…);
ここで線分を作っています。new Point3d(x, y, z)
で始点と終点を指定します。
今回は(0,0,0)
から(100,100,0)
までの線分となっています。
👉Point3d
は「3次元座標」を表すクラスですが、Z座標は0にすると2D線分として扱えます。 - ② btr.AppendEntity(line);
作った線分をモデル空間に追加する命令です。
👉「この線を図面に描画してね」と伝えるイメージです。 - ③ tr.AddNewlyCreatedDBObject(line, true);
追加した線分をトランザクション(AutoCADのデータベース)に登録します。
👉「作った線をAutoCADがちゃんと管理できるようにする処理」と覚えておけばOK!
とりあえずは、この3行だけで 線分が描かれる と覚えて大丈夫です。Transaction
や BlockTableRecord
などは「おまじない」と思ってコピペでOK!
慣れてきたら、「トランザクションやモデル空間の仕組み」を学ぶと理解が深まります。

最初は覚えることが多いですが、流れはシンプルですよ!
ユーティリティ化(コードの共通化)で効率UP!
ここまで紹介したコードは、それぞれのコマンドで同じような処理を繰り返しています。
例えば「Transactionを開始」「BlockTableを取得」「ModelSpaceを取得」などです。
このような共通処理を1つのメソッドにまとめて再利用できるようにすることをユーティリティ化(コードの共通化)といいます。
この処理をクラスの中に入れれば、コードをコンパクトにしたり、保守性を上げられます!
今回の例ではブロックテーブルを宣言してデータベースに処理を書き込む工程↓
// ★★★★★ユーティリティ化した関数の追加★★★★★
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);
}
このメソッドを使うと、各コマンドでは図形作成だけを書けばよくなります。
[CommandMethod("CreateLine2")]
public void CreateLine2()
{ Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; using (Transaction tr = db.TransactionManager.StartTransaction()) { Line line = new Line(new Point3d(0, 0, 0), new Point3d(100, 100, 0));
// ★★★★★ユーティリティ化した関数を入れる★★★★★
AddEntityToModelSpace(line, db, tr);
// ★★★★★★★★★★★★★★★★★★★★★★★★★ tr.Commit(); }
}
このようにユーティリティ化すると、コードがすっきりしてコーディングの効率も上がります!

1つ関数をつくってコピペすればいろんなところで利用できますね。
まとめ
今回は「【AutoCAD】.NET API入門|線分を自動生成するカスタムコマンドの作り方」として、C#とAutoCAD .NET APIを使ったカスタムコマンドの作成例を紹介しました。
・CommandMethod
属性でAutoCADのコマンドラインから独自コマンドを呼び出せる
・線分(Line)は始点と終点を Point3d
で指定するだけで簡単に作成可能
・線分の自動生成は繰り返し作図やルールに沿った図形作成で威力を発揮
・共通処理(Transaction開始、BlockTable取得など)を関数にまとめると保守性UP!
初心者でも、この記事で紹介したサンプルコードをそのままコピーして試すだけで、線分を自動作成するカスタムコマンドをすぐに作れます。

以上、こたろーでした。