NuGetでAutoCAD .NET API用クラスライブラリを作成する


はじめに

  • AutoCAD .NET APIの開発で新規プロジェクト作成する際の簡単な方法は
    • ObjectARXのインストールとAutoCAD .NET API Wizardsをインストール
    • 新規プロジェクトから選ぶ

ですが

  • 現状ではNuGetから必要なファイルを入手できるようになっています
  • 以下はその方法を記したものです

前提

  • Visual Studio 2019がインストールされている
  • AutoCAD 2021がインストールされている
  • NuGetが問題なく利用できる

作成手順

プロジェクト作成手順

  1. Visual Studioを起動し、[ファイル(F)]-[新規作成(N)]-[プロジェクト(P)]を選択します。

  2. 「新しいプロジェクトの作成」画面が表示されたら、クラスライブラリ(.NET Framework)を選択します。

  3. 「新しいプロジェクトを構成します」画面でプロジェクト名、保存先を設定します。

NuGet

  1. [ツール(T)]-[NuGetパッケージマネージャー(N)]-[ソリューションのNuGetパッケージの管理(N)...]を選択しNuGetを起動します

  2. [参照]のページで「AutoCAD」を検索し、AutoCAD.NETを選択

  3. 画面右のプロジェクト名をチェックし、[インストール]ボタンを押します

  4. [変更のプレビュー]画面を確認し、[OK]ボタンを押します

  5. [ライセンスへの同意]画面を確認し、[同意する]ボタンを押します

  6. [ソリューションエクスプローラー]の[参照]に「Ac」で始まる参照が追加されます

コードの追加

ロード時・開放時用のクラス

  • 「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」クラスファイルを作成します
  • これだけだと、ローカライズ(多国語対応)時に認識されないので、リソースファイルも追加します
  1. [プロジェクト]を右クリック、[追加(D)]-[新しい項目(W)]を実行

  2. ファイル名を「myCommands.resx」にして追加項目は「リソースファイル」を選択

    • ファイル名に注意してください
    • 下記画像では「My・・・」になっていますが、「myCommands.resx」です

  3. ファイルが次のように認識されているはずです

  • コードを追加します。
  • コードのクラス名は「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からクラスライブラリを用意した場合での異なる部分を強調したく、ローカライズをあえて取り上げました

  • 開発者の皆様のお役に立てれば幸いです