みなさんこんにちは、AMDlabの森山です。AutoCADのアドインを作ることがあったのですが、日本語でのリファレンスが少なかったので、今回はその方法についてご紹介していきます。使用言語はC#です。
最終的な成果物としてはアイコンを作成し、CSVファイルからポリラインをつなげられるようなアドインを全2~3回程度で紹介できればと思います。
使用するもの
- VisualStudio2019
- AutoCAD2019
この二つです。バージョンが違うものを使用している場合でも大筋は同じなので、大丈夫です。AutoCADLTを使用している方は残念ながら対象外となります。
他に公式のリファレンスが分かりやすくまとまっている(しかも日本語)ので、併せてご参照ください。
VisualStudioの環境を整える
主なやり方としては二つあります。一つはObjectARX SDKを使用する方法、もう一つは手動でパスを通していく方法です。今回は手動でパスを通していく方法をご紹介します。
まずはVisualStudio(以下VSと表記)のプロジェクトを新規作成を選び、WPFアプリの作成を選択しましょう。今回は.NETFramework4.7以上を使用します。名前はAMDsampleに変更しておきます。
自動で生成されるxamlファイルやcsファイルは使わないので削除しておきましょう。
その後、ソリューションエクスプローラーから追加>参照から、acdbmgd.dll、accoremgd.dll、acmgd.dll、AcWindows.dllを参照しておきます。dllファイルはC:\Program Files\Autodesk\AutoCAD version\にあります。
次にデバッグ環境を整のえましょう。プロジェクトプロパティ>アプリケーションから、出力の種類をWindowsアプリケーションからクラスライブラリに変更します。そしてプロジェクトプロパティ>デバッグの開始動作から外部プログラムの開始を選択し、先ほどのdllファイルと同じディレクトリにあるacad.exeにパスを通しておきます。
現在時点での画面はこんな感じ。これでコードを書く準備ができました。
コードを書いていく
さて、今回は様式美ですが、HelloWorldをマルチテキストとして任意の位置のAutoCADに配置するプログラムを書いてみましょう。ソリューションエクスプローラー>追加>クラスでCommand.csとしてプログラムを作成します。
エディタに書き込んでいきましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; namespace AMDsample { public class Command { [CommandMethod("HelloWorld")] public static void HelloWorld() { //ドキュメント、データベースオブジェクトの作成 Document now_doc = Application.DocumentManager.MdiActiveDocument; Database db = now_doc.Database; //ユーザー入力の結果を代入するポイントの作成 PromptPointResult pt_res; PromptPointOptions pt_option = new PromptPointOptions(""); //ユーザーへの入力要求 pt_option.Message = "\n挿入点選択: "; pt_res = now_doc.Editor.GetPoint(pt_option); Point3d ptStart = pt_res.Value; //ESCキーなどでキャンセルしたときの処理 if (pt_res.Status == PromptStatus.Cancel) return; //トランザクションの開始 using (Transaction fir_trans = db.TransactionManager.StartTransaction()) { //ブロックテーブルの作成 BlockTable b_table; b_table = fir_trans.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord b_table_rec; b_table_rec = fir_trans.GetObject(b_table[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; //テキストの作成 using (MText text = new MText()) { text.Location = new Point3d(ptStart.X,ptStart.Y,0); text.Width = 40; text.Contents = "Hello World!"; b_table_rec.AppendEntity(text); fir_trans.AddNewlyCreatedDBObject(text, true); } //トランザクション終了 fir_trans.Commit(); } } } } |
基本的には[CommandMethod(“hoge”)]のhoge部分がコマンドとして作成されます。
また、途中using (Transaction fir_trans = db.TransactionManager.StartTransaction())
という表記が出てきました。
例えばusing(var hoge = new Hoge())
は
1 2 3 4 5 6 7 8 9 10 11 12 |
Hoge hoge = null; try { hoge = new Hoge(); } finaly { if(hoge != null) { hoge.Dispose(); } } |
と同じことです。公式リファレンスではこの書き方を推奨しています。
ではF5キーでデバッグしてみましょう。デバッグすると事前にパスを通しておいたAutoCADが立ち上がります。
その後、AutoCAD内で”netload”というコマンドを打ち、できたdllファイルを読み込みます。すると、警告が出てきますが、とりあえず一回ロードする、にしておきましょう。
ロードが成功したらHelloworldとコマンドラインで打ち込むと、動作します。
動作しましたか?次回はアイコンをリボンタブに作成して、今回作成したプログラムがアイコンをクリックして動作するようにしてみましょう。
COMMENTS