はじめに
-
AutoCAD .NET APIの開発で新規プロジェクト作成する際の簡単な方法は
- ObjectARXのインストールとAutoCAD .NET API Wizardsをインストール
- 新規プロジェクトから選ぶ
ですが
-
現状ではNuGetから必要なファイルを入手できるようになっています
-
以下はその方法を記したものです
前提
- Visual Studioがインストールされている
- AutoCADがインストールされている
- NuGetが問題なく利用できる
- AutoCADバージョンと.NET Frameworkの関係は以下参照のこと
AutoCADバージョン | .NET Frameworkバージョン |
---|---|
2017 | 4.6 |
2018 | 4.6 |
2019 | 4.7 |
2020 | 4.7 |
2021 | 4.8 |
2022 | 4.8 |
2023 | 4.8 |
2024 | 4.8 |
- AutoCADのサポートされるバージョンは現行版から3世代前まで。(現状であれば2021まで)
作成手順
プロジェクト作成手順
NuGet
コードの追加
ロード時・開放時用のクラス
- 「MyPlugin.cs」クラスファイルを作成し、以下のコードを入力します。
using Autodesk.AutoCAD.Runtime;
[assembly: ExtensionApplication(typeof(nugetTest.MyPlugin))]
namespace nugetTest
{
/// <summary>
/// ロード・開放時の動作
/// </summary>
public class MyPlugin : IExtensionApplication
{
/// <summary>
/// ロード時動作
/// </summary>
public void Initialize()
{
}
/// <summary>
/// クローズ時動作
/// </summary>
public void Terminate()
{
}
}
}
-
先頭の属性は、AutoCADにこれがプラグインだと認識させるおまじないです
-
{ネームスペース}.{クラス名}
を認識させています -
MyPluginクラスが利用するインタフェイス、[IExtensionApplication]はプラグインのロード時・開放時の挙動を制御するためのインタフェイスです
- Initializeがロード時
- Terminateが開放時
のコードを記述します
コマンド用クラス
-
「myCommands.cs」クラスファイルを作成します
-
これだけだと、ローカライズ(多国語対応)時に認識されないので、リソースファイルも追加します
2024/1/29追記:AutoCAD2024ではローカライズにリソースファイルが必要なくなった?ようです。下記、1~3までは古いバージョンでは必要かと思うので下記記述は残します。2024では読み飛ばしてください。- 2024/1/29追記2:嘘でした、リソースファイルの追記はローカライズに必要です。
-
リソースファイルを追加しない場合、コンパイルは可能ですが、AutoCADでNETLOADした際にエラーが発生し、ロードされません。
-
[プロジェクト]を右クリック、[追加(D)]-[新しい項目(W)]を実行
-
ファイル名を「myCommands.resx」にして追加項目は「リソースファイル」を選択
- ファイル名に注意してください
- 下記画像では「My・・・」になっていますが、「myCommands.resx」です
-
ファイルが次のように認識されているはずです
- コードを追加します。
- コードのクラス名は「MyCommands」でファイル名をつけるときとは変更しています。
- これはリソースファイルのコードと区別のためです。
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
// これはコマンドですよ、という宣言
[assembly: CommandClass(typeof(nugetTest.MyCommands))]
namespace nugetTest
{
/// <summary>
/// コマンド用クラス
/// </summary>
public class MyCommands
{
/// <summary>
/// コマンドラインから実行するコマンドの定義
/// </summary>
[CommandMethod("MyGroup", "MyCommand", "MyCommandLocal", CommandFlags.Modal)]
public void MyCommand()
{
}
/// <summary>
/// 先に図形をピックしてある前提で動作するコマンドの定義
/// </summary>
[CommandMethod("MyGroup", "MyPickFirst", "MyPickFirstLocal", CommandFlags.Modal | CommandFlags.UsePickSet)]
public void MyPickFirst()
{
PromptSelectionResult result = Application.DocumentManager.MdiActiveDocument.Editor.GetSelection();
if (result.Status == PromptStatus.OK)
{
// ----->>> 図形が選択されていた場合の動作
}
else
{
// ----->>> 図形が選択されていない場合の動作
}
}
/// <summary>
/// セッションで有効なコマンド動作
/// </summary>
[CommandMethod("MyGroup", "MySessionCmd", "MySessionCmdLocal", CommandFlags.Modal | CommandFlags.Session)]
public void MySessionCmd()
{
}
/// <summary>
/// Lisp関数を自作する際のコード
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
[LispFunction("MyLispFunction", "MyLispFunctionLocal")]
public int MyLispFunction(ResultBuffer args)
{
return 1;
}
}
}
- リソースにも追記します
名前 | 値 | コメント |
---|---|---|
MyCommandLocal | MyCommand | |
MyLispFunctionLocal | MyLispFunction | |
MyPickFirstLocal | MyPickFirst | |
MySessionCmdLocal | MySessionCmd |
# 終わりに
-
ローカライズを含まない場合は、リソースを作成せずクラスファイルだけで進められます
その場合は、以下のようにコードを記載してください
[CommandMethod("MyGroup", "MyCommand", CommandFlags.Modal)]
-
自分で実施の際、このローカライズにかなりの時間迷ったので、ウイザードで作成した場合と自分で1からクラスライブラリを用意した場合での異なる部分を強調したく、ローカライズをあえて取り上げました
-
開発者の皆様のお役に立てれば幸いです