カスタム入力関数

カスタム入力関数とは

コマンド実行中の AutoCAD ユーザーに必要な情報をリアルタイムで表示したり、入力に対して独自の反応をリアルタイムで応じたりすることで、わかりやすく使いやすいコマンドになります。

AutoLISP の既存の入力関数と同等の機能にすることは、最初は大変ですが一度作ってしまえばいろんな用途に使える汎用性の高い関数とすることは可能です。カスタム入力関数の作成のためには、リアルタイムに表示したり入力を検知したりすることが必要です。ここではリアルタイム処理をおさえたうえで、カスタマイズ可能な入力関数を作成します。

リアルタイム文字表示

AutoLISP関数
(grtext [box text [highlight]])
box:整数
text:文字列
highlight:整数
ステータスバーまたはスクリーンメニュー領域に文字を表示します。
戻り値:文字列、またはnil

grtext 関数は、【ステータスバー】または【スクリーンメニュー】領域に文字を表示します。

prompt 関数と大きく異なる点は、【コマンドライン】ではバッファが効いて prompt 関数ではリアルタイムな文字の更新は必ずしも保証されません。そのため、長い時間がかかる処理の進行状況などをAutoCADユーザーに知らせる目的で使うのは不適切な場合があります。一方、grtext 関数による文字の表示はリアルタイムで処理されます。

box 引数は、表示する領域を表す整数を指定します。指定する整数の意味は以下のとおりです。

box 引数 説明
0 と正の整数 【スクリーンメニュー】領域の、指定した整数をインデックスとしたメニューの場所。インデックスの最初の要素は 0 から始まります。とることができる【スクリーンメニュー】ボックスの最大数は、システム変数 SCREENBOXES で調べることができます。
-1 【モードステータスバー領域】
-2 【座標ステータスバー領域】

リアルタイム座標表示をオンにしている場合、【座標ステータスバー領域】に表示してもマウスを動かすと直ちにクリアされて表示が上書きされます。

プログラムから表示をクリアするためには、grtext 関数を引数なしで呼び出します。すべての領域がクリアされます。

【スクリーンメニュー】表示の場合に、highlight引数に正の整数を指定するとメニューがハイライトされ、0とするとハイライトが解除されます。

スクリーンメニューとステータスバー領域

【スクリーンメニュー】は DOS 時代の AutoCAD の古いインターフェースで、現在でも使われている方は少数でしょう。【スクリーンメニュー】は作図画面の右側に、縦にメニューを表示します。【スクリーンメニュー】を有効にするにはAutoCADの【オプション】ダイアログの【表示】タブ内の【ウィンドウの要素】から【スクリーンメニューを表示】をオンにします。

【座標ステータスバー領域】は、ステータスバーで通常も座標が表示されている部分です。【モードステータスバー領域】は普段は見えていませんが、【座標ステータスバー領域】の左に表示されます。

autolisp grtext

【モードステータスバー領域】にテキストでプログレッシブバーを表示する関数を作成します。

(defun make-list (counter initial-element /)
  (if (< 0 counter)
    (cons initial-element (make-list (1- counter) initial-element))
  )
)

(setq *progressBar:string* ""
       *progressBar:length* 10
      *progressBar:total* 0
      *progressBar:current* 0
)

(defun progressBar:begin (string blength total)
  (grtext)
  (setq *progressBar:string* string
         *progressBar:length* blength
        *progressBar:total* total
        *progressBar:current* 0
  )
)

(defun progressBar:increment (/ temp clength)
  (setq temp (1+ *progressBar:current*)
        *progressBar:current*
         (rem temp (1+ *progressBar:total*))
        clength
         (* (/ (float *progressBar:current*) *progressBar:total*) *progressBar:length*)
  )
  (grtext -1
          (strcat *progressBar:string*
                  (vl-list->string
                    (append (make-list clength (ascii "#"))
                            (make-list (- *progressBar:length* clength) (ascii "_"))
                    )
                  )
          )
  )
  nil
)

(defun progressBar:end ()
  (grtext)
)

progressBar:begin 関数で変数の初期化をします。string 引数はバーの左に表示する説明の文字列、blength 引数はバーの文字数長さを整数で与えます。total 引数は、何回 progressBar:increment 関数を呼び出せばバーが 100 %の表示になるかを整数で与えます。初期化の後、progressBar:increment 引数を引数なしでループなどの中から呼び出すと、バーが伸びていきます。progressBar:end 関数は表示をクリアします。

(defun progressBarTest ()
  (progressBar:begin "TEST : " 10 20)
  (repeat 20 (progressBar:increment) (ACET-SYS-SLEEP 500))
  (progressBar:end)
)