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

【AutoCAD】.NET API入門①|線分を自動生成するカスタムコマンドの作り方

【AutoCAD】.NET API入門|線分を自動生成するカスタムコマンドの作り方

この記事の難易度

AutoCADを使っていると、「図面をプログラムで自動生成できたら便利なのに」と思うことはありませんか?
たとえば、同じ線分を何度も作成する作業や、一定のルールで線分を引く作業は、自動化することで大幅に効率化できます。

C#とAutoCAD .NET APIを使えば、カスタムコマンドを追加して、線分をプログラムで描画することが可能です。
この記事では 「線分の基本的な作成方法」 を中心に解説します。

また、繰り返し使う処理をまとめた「ユーティリティ化」についても解説します。

この記事のポイント
  • AutoCADにカスタムコマンドを追加して線分を自動生成する方法
  • C#でのサンプルコードと動作の流れ
  • 共通処理をまとめる「ユーティリティ化」で開発効率を向上

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

  

カスタムコマンドの基本

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

C# 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と入力するとメッセージが表示されます。

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

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

 

線分を作成するコマンド(基本)

コマンド開発の前に線分について詳しく知りたい方は過去の記事を参照ください。
👉【AutoCADの基本】LINEコマンドで線分を作図!初心者でも簡単マスター

AutoCADに線分を作図するテンプレート

AutoCADで独自のコマンドを実行するためには、C#でCommandMethod属性を持つメソッドを定義します。
これにより、AutoCADのコマンドラインから直接呼び出せるようになります。

図形を書くための雛形がこちらです↓ これをクラスの中に入れて編集します。

図形を書くためのコマンドテンプレート(C#)
// 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#で作成してみましょう。

線分(LINE)の作図コード

線分(LINE)の作図コード(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)までの線分が作成されます。最初に試すのに最適なサンプルです。
  コマンドを実行するとこんな感じでコマンドが追加されて線分が作図できます↓

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

コードのポイント解説

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

線分(LINE)の作図コードの解説
  • 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行だけで 線分が描かれる と覚えて大丈夫です。
TransactionBlockTableRecord などは「おまじない」と思ってコピペでOK!

慣れてきたら、「トランザクションやモデル空間の仕組み」を学ぶと理解が深まります。

Line line = new Line(…); のnewとはどういう意味??

Lineを作るときにいろいろなところでnewが入りますよね?これは何でしょうか?

C#では new「新しいオブジェクトをメモリ上に作る」 ということを意味します。

もし new を付けずに書くとエラーになります。

こたろー
こたろー

最初は覚えることが多いですが、流れはシンプルですよ!

 

ユーティリティ化(コードの共通化)で効率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!

初心者でも、この記事で紹介したサンプルコードをそのままコピーして試すだけで、線分を自動作成するカスタムコマンドをすぐに作れます。

こたろー
こたろー

以上、こたろーでした。 


スポンサーリンク

コメントを残す

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

CAPTCHA