AutoLISP入門 関数紹介

コマンドラインにメッセージを表示しよう!AutoLISPの表示関数4選

displayfunc_eyecatch
  • コマンドラインにメッセージを表示したい
  • princやprintなど、いくつかある表示関数の違いを知りたい
  • ファイルに文字列を書き出したい

プログラムの処理中や処理後でコマンドラインにメッセージを表示させたいけど、やり方がわからずお困りではないでしょうか。

私はAutoLISPを独学し、業務の自動化・効率化に役立つプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。

そもそもAutoLISPってなに?という方はこちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説

この記事ではAutoLISPの表示関数について解説します。ユーザーに向けたメッセージをコマンドラインに表示できるため、動作がわかりやすくなったり、プログラムが使いやすくなったりします。ファイルに値を書き出す機能もあるため、覚えておいて損はありません。

AutoCADを効率化させるだけでなく、ユーザー思いのプログラムを作成したい方はぜひ最後までお読みください。

princ、prin1、print、promptはコマンドラインに引数の値を表示できます。引数が文字列の場合、prin1とprintの表示結果は「”」で囲われますが、princとpromptの表示結果は「”」で囲われません。

また、princ、prin1、printは引数の値をファイルに書き出すことができます。promptはファイルへの書き出しができず、表示できるのは文字列のみなので注意してください。

AutoLISPの表示関数4選

displayfunc_1

AutoLISPの表示関数は以下の4つです。コマンドラインに文字列やリストなどを表示したいときに活用してください。

  • princ
  • prin1
  • print
  • prompt
はこさん。
はこさん。

1つずつ解説していきます。

princ

displayfunc_1-1

princは引数をコマンドラインに表示したり、ファイルに書き出したりする関数です。princには以下の特徴があります。

  • 表示(書き出し)される文字列は「”」で囲われない
  • 引数を省略すると空のシンボルを返す(何も表示されない)
  • 表示(書き出し)される文字列は制御文字の影響を受ける
  • 数値やリストなども表示(書き出し)できる
はこさん。
はこさん。

制御文字とファイルへの書き出し方については後述するのでお楽しみに。

たとえば、princに「”ABC”」という文字列を与えたときの表示結果は次のとおり。

displayfunc_1-2

「ABC」のあとに「”ABC”」と表示されているのはAutoLISPの仕様によるものです。AutoLISPは最後に評価した値を返すので、引数の「”ABC”」も表示されてしまいます。

princの返り値だけ表示させたい場合は、関数の最後に引数を省略したprincを追加しましょう。引数を省略したprincは空のシンボルを返すため、見た目上は何も表示されていないようにできます。

簡単な例は下記のとおりです。

(defun c:test ()
  (princ "ABC")
  (princ)
)

defun関数ってなに?という方はこちらの記事をご覧ください。
>>オリジナルの関数を作ろう!ユーザー関数を定義するAutoLISP関数「defun」

displayfunc_1-3
はこさん。
はこさん。

余計な文字列が表示されないので見た目がすっきりします。

prin1

displayfunc_2-1

前述したprincと同様にprin1も引数をコマンドラインに表示したり、ファイルに書き出したりできる関数です。prin1には以下の特徴があります。

  • 表示(書き出し)される文字列は「”」で囲われる
  • 引数を省略すると空のシンボルを返す(何も表示されない)
  • 文字列に含まれる制御文字はそのまま返す
  • 数値やリストなども表示(書き出し)できる
はこさん。
はこさん。

関数名の最後は数字の1です。アルファベットのlやtではないので注意してください。

prin1に「”ABC”」という文字列を与えたときの表示結果は次のとおり。

displayfunc_2-2

前述したように「”ABC”」が2つ表示されているのはAutoLISPの仕様によるものです。princで表示される文字列は「”」で囲われませんが、prin1で表示される文字列は「”」で囲われます。

princと同様に引数を省略したprin1は空のシンボルを返します。関数の最後に引数を省略したprin1を追加すると「”ABC”」の表示は1つだけになります。

(defun c:test ()
  (prin1 "ABC")
  (prin1)
)

上記のtest関数を実行したときの表示結果は次のとおり。

displayfunc_2-3
はこさん。
はこさん。

prin1でも表示結果の見た目を整えられますが、princを使う方が一般的です。

print

displayfunc_3-1

printもprincやprin1と同様に引数をコマンドラインに表示したり、ファイルに書き出したりする関数です。printの特徴は以下のとおり。

  • 表示(書き出し)される文字列は「”」で囲われる
  • 表示する(書き出す)文字列の前に改行が入り、後ろには半角スペースが1つ入る
  • 引数を省略すると空のシンボルを返す(何も表示されない)
  • 文字列に含まれる制御文字はそのまま返す
  • 数値やリストなども表示(書き出し)できる
はこさん。
はこさん。

printはprin1から派生した関数なので、基本的な動作はprin1と同じです。

たとえば、printを2つ記述した関数を実行するとコマンドラインの表示は次のようになります。

(defun c:test ()
  (print "ABC")
  (print "DEF")
)
displayfunc_3-2

1行目のprintでは「”ABC”」を表示したあとに半角スペースが1つ入ります。2行目のprintでは文字列を表示する前に改行が入るので「”DEF”」は改行された位置に表示されます。

引数を省略した場合は空のシンボルを返すので、返り値には改行と半角スペースが入りません。princやprin1と同様に、引数を省略したprintを関数の最後に追加すると表示結果の見た目がすっきりします。

prompt

displayfunc_4-1

promptは引数の文字列をコマンドラインに表示する関数です。promptの特徴は次のとおり。

  • 表示される文字列は「”」で囲われない
  • 引数に指定できるのは文字列のみ
  • 表示される文字列は制御文字の影響を受ける
  • 返り値は必ずnilになる
  • ファイルへの書き出しはできない

promptに「”ABC”」の文字列を与えるとコマンドラインには以下のように表示されます。

displayfunc_4-2

promptは文字列しか表示できません。文字列以外を与えるとエラーになります。ファイルへの書き出しもできないため、前述した3つの関数に比べて用途は限られます。

はこさん。
はこさん。

文字列しか表示しない、表示結果に「”」を付けたくない場合など用途がはっきりしているなら、promptを活用してみるのも一つの手です。

ファイルへの書き出し方

princ、prin1、printはコマンドラインに数値や文字列を表示するだけでなく、ファイルに書き出すこともできます。ファイルへ書き出すためには、書き出しモードまたは追加モードで開かれたファイルディスクリプタも引数として与える必要があります。

ファイルディスクリプタ

ファイル ディスクリプタとはopen関数で開いたファイルの場所を示すものです。ファイルの読み込みや書き出し、ファイルを閉じるなど、ファイルを扱う関数で使用します。
>>概要 - ファイル ディスクリプタ(AutoLISP)

たとえば、princでファイルに書き出す場合は以下のように記述してください。

(defun c:test ()
  (setq path "")
  (setq f (open path "w"))
  (princ "ABC" f)
  (close f)
)

open関数とclose関数についてはこちらの記事で解説しています。
>>ファイルを操作しよう!AutoLISPのテキストファイル関数を解説

はこさん。
はこさん。

print、prin1の場合も上記の例と同様に記述してください。

制御文字の使い方

制御文字とはコンピューターに指示を出すときに使われる、特別な意味を持つ文字です。文字列中に含めることで改行や円記号(\)を表現できます。
>>制御文字とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

princ、promptで使用できる制御文字は以下のとおり。ちなみにprin1、printは制御文字の影響を受けないので注意してください。

制御文字内容
\\1つの円記号(\)
\”1つの「”」
\eEscキーと同じ
\n改行(Enterキーと同じ)
\r復帰改行(カーソルを左端に移動させて、次の行に改行する)
\tTabキーと同じ
\nnn8進コードがnnnのASCIIコードに変換

ASCIlコードとはアルファベット文字を表す整数のことです。8進コードとの対応は下記のサイトで「ASCII」と「8進数」の欄を見比べてください。
>>ASCII、10 進数、16 進数、8 進数、およびバイナリーの変換表

princで制御文字を含む文字列をファイルに書き出すと次のようになります。式中の「f」はファイルディスクリプタを表しています。

princの式書き出し結果
(princ "\\ABC" f)\ABC
(princ "\"ABC" f)”ABC
(princ "ABC\e" f)ABC
(princ "AB\nC" f)AB
C
(princ "AB\rC" f)AB
C
(princ "AB\tC" f)AB C
(princ "\100ABC" f)@ABC
はこさん。
はこさん。

「\n」と「\r」の動作はどちらも同じです。

表示関数を使いこなしてユーザー思いのプログラムを作成しよう

displayfunc_last

今回ご紹介した4つの表示関数を以下にまとめます。

princ
引数の値をコマンドラインやファイルに出力する。文字列は「”」で囲われない。
prin1
引数の値をコマンドラインやファイルに出力する。文字列は「”」で囲われる。
print
引数の値をコマンドラインやファイルに出力する。文字列は「”」で囲われる。出力の直前に改行が入り、最後には半角スペースが1つ入る。
prompt
引数の文字列をコマンドラインに出力する。文字列は「”」で囲われない。出力できるのは文字列のみ。

それぞれの関数は出力結果に特徴があります。用途やユーザーの好みによって使い分け、ユーザー思いのプログラム作成に役立ててください。

あなたに代わってAutoLISPプログラムを作成します

AutoLISPで作業を自動化したいけど、プログラミングに詳しくないのでツールが作れずにお悩みの方へ。5年以上のAutoLISP経験を活かしてAutoCADを自動化するツールを作成します。既にお持ちのAutoLISPプログラム修正も対応可能です。

AutoCADの面倒くさい作業から解放されたい方は下記リンクからお気軽にご相談ください。
>>AutoCADが楽になるプログラムを作成します

AutoCADが楽になるプログラムを作成します AutoCADを効率化して面倒な作業から解放されましょう!

-AutoLISP入門, 関数紹介