【AutoCAD】GUIカスタマイズ入門 1(dcl) -20分-

AutoCAD

概要

以下のような確認ダイアログ画面を作成します。

  • AutoCADではAutoLispが使用できます。AutoCADの各エンティティにアクセスして様々な動作を定義することができます。但し、ダイアログ画面などで入力して処理を行うことはできません。
  • ダイアログ ボックスをダイアログ コントロール言語(DCL)で記述し、AutoLispでCallして処理します。
  • ダイアログ の定義は、例えばMyDialogs.dclとして保存し、AutoCADのパスの通っているフォルダーの入れます。例えば、C:\Program Files\Autodesk\AutoCAD 2022\Support です。
  • AutoCADのパスは、”オプション”でファイルのパスを設定・参照することができます。

DCL(Dialog Control Language)

  • 以下は、前述のダイアログ画面を定義するDCLの例です。
  • AutoLispと記述文法が異なるので留意が必要です。

全ソース(DCL)

//-----------------------------------
// MyOkCancel
//-----------------------------------
MyOkCancel : dialog {
  label = " My Ok Cancel";
  spacer;
  : row {
    fixed_width = true;
    alignment = centered;
    : ok_button {
      width = 11;
    }
    : cancel_button {
      width = 11;
    }
  }
}

コメントと定義

  • コメントは//です。
  • MyOkCancel : dialog {}で定義します。MyOkCancelは任意の名前です。
//----------------------------------------------------------------------------------
// MyOkCancel
//----------------------------------------------------------------------------------
MyOkCancel : dialog {


~ 省略 ~

}

タイトルと初期化処理

  • labelはダイアログのタイトルを設定します。
  label = " My Ok Cancel";
  spacer;
  • spacerは、空白行です。spacerを入れた時(左図)とspacerを入れない時(右図)の違いは以下の通りです。

行の定義:row

  • 行(raw)の定義の中にボタン(XX_button)の定義を行います。
  • DCLでは、ボタンや編集ボックスなどのダイアログ ボックスの要素を「タイル」と呼びます。
 : row {
    fixed_width = true;
    alignment = centered;
    : ok_button {
      width = 11;
    }
    : cancel_button {
      width = 11;
    }
  }

属性の定義は、以下の通りです。

No項目内容
1alignment上、中央、下です。この属性は、中のボタンなどの子タイルの垂直方向の配置を指定します。
2children_alignmenttop、centered、およびボタンです。この属性は、場合の水平および垂直の位置を制御し タイルに特定の配置値がないます。 
3children_fixed_heighttrueまたはfalseのいずれかです。プロセス中にボタンが成長するのを防ぎます。
4children_fixed_width上記と同様。
5fixed_height上記と同様。
6fixed_width上記と同様。
7height整数または実数です。タイルの高さを文字の高さの単位(画面の高さ 行間隔を含む文字の)で指定します。
8width整数または実数です。タイル幅を文字幅単位で指定します。

ボタン定義

  • ok_button 、 cancel_button は組み込まれているボタンです。属性は、以下のようになります。
ok_button : retirement_button {
        label           = "  OK  ";
        key             = "accept";
        is_default      = true;
}

cancel_button : retirement_button {
        label           = "Cancel";
        key             = "cancel";
        is_cancel       = true;
}
No項目内容
1label  ボタン内に表示されるテキストを指定します。
2keyボタンタイルを参照するための引用符で囲まれた文字列(一意の名前)です。
3is_default trueまたはfalseです。ユーザーがEnterキーを押したときにこのボタンを選択するかどうかを指定します。通常、[OK]ボタンには 
この属性が割り当てられます

AutoLisp

  • コメントは、;です。

全ソース(AutoLisp)

;-------------------
; c:MyOkCancel
;-------------------
(defun c:MyOkCancel (/ Dcl_Id Return)
  (princ "\nMyOkCancel")(princ)

  (setq Dcl_Id (load_dialog "MyDialogs.dcl"))
  (new_dialog "MyOkCancel" Dcl_Id)

  (action_tile "accept" "(done_dialog 1)")
  (action_tile "cancel" "(done_dialog 0)")
  (setq Return (start_dialog))

  (unload_dialog Dcl_Id)
  (princ "\n")(princ Return)
  (princ)
)

関数作成 : defun

  • defunは関数定義です。形式は、以下のものです。
(defun symbol_name ( args / local_variables )
  expressions
)
No項目内容
1 symbol_name 関数の名前です。
定義関数名の先頭に「c:」を付けるとユーザー定義関数がコマンド化されます。
c:MyOkCancel
2( args / local_variables )関数の引数です。
/の無い変数はグローバル変数です。
/ 以降は関数内で使用するローカル変数です。
/ Dcl_Id Return

表示関数 : princ

  • princ でMyOkCancel をコマンドラインに表示します。
  • 引数無しのprincは、何も表示されません。さて、なぜこの何も戻さない機能が重要なのかと言うと、AutoLISPで作ったコマンドは、最後の戻り値をコマンドラインに表示します。なので、余計な文字や数字がコマンドラインに出てきます。出てきても問題は無いのですが、(princ)を最後に付けて、最後の戻り値を表示させない方がキレイなプログラムだと考える人は多いです。
 (princ "\nMyOkCancel")(princ)

変数設定 : setq

  • 変数 Dcl_Id に( load_dialog “MyDialogs.dcl” )の戻り値のDCL 識別番号を設定します。
  • load_dialog でdclファイルを読み込みます。dclファイルはAutoCADのパスの通っているフォルダーに入れておく必要があります。
(setq Dcl_Id (load_dialog "MyDialogs.dcl"))

ダイアログ作成 : new_dialog

  • new_dialog に、引数としてダイアログ名と DCL 識別番号を渡します。
(new_dialog "MyOkCancel" Dcl_Id)

イベントハンドラ : OK CANCEL

  • トリガーとする文字列(key 属性として指定)の “accept”の場合 、アクション “(done_dialog 1)” を呼び出します。
  • “cancel”の場合 、アクション “(done_dialog 0)” を呼び出します。
  • done_dialogは、OKが1、キャンセルが0です。
(action_tile "accept" "(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")

ダイアログ表示

start_dialog でダイアログを表示して、 Return に戻り値を設定します。

 (setq Return (start_dialog))

ダイアログのアンロード : unload_dialog

  • Dcl_Id(前の new_dialog 関数呼び出しで取得)に関連付けられた DCL ファイルをメモリからロード解除します。
(unload_dialog Dcl_Id)

実行方法

  • 全ソース(DCL)を、MyDialogs.dclとして保存し、AutoCADのパスの通っているフォルダーの入れます。例えば、C:\Program Files\Autodesk\AutoCAD 2022\Support です。
  • 全ソース(autolisp)をsample01.lspとして保存します。
  • sample01.lspをAutoCADにD&D(ドラック&ドロップ)します。以下のようなメッセージが出力されますので、”常にロードする”を選択します。
  • AutoCADのコマンドにMyOKCancelと打ち込み、実行します。
  • ダイアログが表示されます。

参考

ヘルプ

ヘルプ

DCLの仕様書