AutoLISP関数 関数解説

AutoCADの作業効率UP!AutoLISPのユーザー入力関数8選

user-input-function_eyecatch
  • どんな場面でどのユーザー入力関数を使えばいいのか分からない
  • 入力された値がどんな形で返ってくるか分からない(リスト? 数値? 文字?)
  • 日本語の情報が少なくて勉強しにくい

ユーザー入力関数はAutoCADをもっと便利に使うための強力なツールです。しかし、AutoLISP自体の情報が少なく、とくに日本語の解説は限られています。独学では「思った通りに動かない…」と悩む人も多いはず。

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

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

当記事ではユーザー入力関数それぞれの使い方や返り値について実例を交えながら解説します。初心者の方もすぐに試せる内容になっていますので、AutoCADをもっと便利に自分好みにカスタマイズしたい方はぜひ最後までお読みください。

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

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

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

AutoLISPのユーザー入力関数8選

user-input-function_caption1

今回ご紹介するユーザー入力関数は以下の8つです。

  • getpoint
  • getstring
  • getkword(initget)
  • getint
  • getreal
  • getdist
  • getangle
  • getorient
はこさん。
はこさん。

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

getpoint

user-input-function_getpoint

getpointとは図面上でユーザーに指定させた座標を返すAutoLISP関数です。getpointには下記のような特徴があります。

  • ユーザーが指定できる座標は1つのみ
  • 返り値は座標のリスト(x,y,[z])またはnil
  • 実行中にユーザーへのメッセージを表示できる
  • 引数に基準点を与えるとその点から現在のカーソル位置までラバーバンドを表示できる

getpointで取得できる座標はユーザーが指定した1点のみです。複数の座標を取得したい場合はその都度getpointを実行してください。取得した座標は以下のようなリスト形式で返します。

(100.0 200.0)

返り値は現在のUCS(ユーザー座標系)に従うため、3次元空間で実行しているときはz方向も含みます。

(100.0 200.0 0.0)

文字列を引数として与えるとユーザーへのメッセージを表示させることも。コマンドラインに案内が表示され、より直感的な操作ができます。

(setq pt (getpoint "\n挿入点を指定してください: "))
はこさん。
はこさん。

メッセージの前に\nを付けると、改行されてすっきり表示されます。

基準点を引数として与えた場合は、基準点から現在のカーソル位置までのラバーハンド(点線)が表示されます。始点と終点が視覚的にわかりやすくなるので、2つの座標を意識しながら座標を指定したいときに活用してください。

ちなみに、座標を指定するときは現在のオブジェクトスナップやグリッドの影響を受けます。意図しない座標を指定してしまうこともあるため、正確な位置を取得したい場合はgetpointの実行前にオブジェクトスナップやグリッドの設定を一旦オフにする必要があります。

オブジェクトスナップは「OSMODE」、グリッドは「SNAPMODE」のシステム変数で操作できます。システム変数の使い方についてはこちらの記事を参考にしてください。
>>【AutoCADの作業効率アップ】システム変数を操作するAutoLISP関数2選

はこさん。
はこさん。

getpointは単に座標を取得するだけでなく、ユーザーが操作しやすいようにサポートする機能もある便利な関数です。

getstring

user-input-function_getstring

getstringとはユーザーが入力した値を文字列として返すAutoLISP関数です。getpointの特徴は下記のとおり。

  • 入力した値が数値のみでも返り値は文字列になる
  • 引数のフラグをTにすると文字列内にスペースを含めることができる
  • 入力した文字列の円記号「\」は2つの円記号「\」に変換される
  • 入力した文字列の長さが132文字を超えているときは最初の132文字のみ返す
  • 文字列を入力せずにEnterを押した場合はnilを返す

入力した値が123などの数値だけの場合でも、返り値は文字列に変換されます。

(setq result (getstring "\n値を入力してください: "))
;;; ユーザーが「123」と入力 → resultは "123" という文字列

上記の場合は返り値が文字列なので、数値として使いたい場合はatoiやatofで数値に変換する必要があります。

atoiとatofについて知りたい方はこちらの記事をご覧ください。
>>文字列を使いこなそう!文字列を操作するAutoLISP関数8選

はこさん。
はこさん。

入力する値が常に数値なら、後述するgetintやgetrealを使った方が変換の手間を省けます。

引数のフラグがnilまたは省略されている場合、Enterかスペースを押すか入力した文字列にスペースが含まれていると、その時点で入力終了となります。たとえば「山田 太郎」と入力しても、取得できるのは「山田」だけです。

スペースも含めた文字列を入力したいときは引数にTを与えてください。

(setq name (getstring T "\n氏名を入力してください(スペース可): "))

また、入力した文字列の円記号「\」は自動的に2つの円記号「\\」に変換される仕様になっています。

(setq path (getstring "\nパスを入力してください: "))

上記で「C:\Data\Test」と入力した場合、返り値は以下のようになります。

"C:\\Data\\Test"

ちなみに132文字を超える文字列が入力されたときは、超過分がカットされて最初の132文字だけが返り値となります。長文の入力が必要なときは注意してください。何も入力せずにEnterを押した場合はnilを返します。

はこさん。
はこさん。

getstringは任意の文字列を入力したいときに役立つ関数です。

getkword

user-input-function_getkword
  • キーワードは別のAutoLISP関数(initget)で設定する
  • 大文字と小文字は区別されない
  • キーワード以外を入力した場合は再度入力を求める
  • メッセージ内のキーワードを[]で囲うとクリックできる選択肢として表示できる

getkword単体ではキーワードの制御はできません。事前にinitgetを使って有効なキーワードを設定する必要があります。下記のように書くことでユーザーはADD、DELETE、MODIFYの3つの内から1つを選べるようになります。

(initget "ADD DELETE MODIFY")
(setq result (getkword "\n操作を選択してください: "))
はこさん。
はこさん。

initgetについては後述しますのでお楽しみに。

キーワードの入力時に大文字と小文字は区別されないので、次のような入力はすべて有効です。

  • Add
  • add
  • ADD
  • AdD

キーワードとして設定されていない文字列や数値を入力した場合、無効な入力として扱われ再入力を求めてきます。たとえば、下記でユーザーがYellowや123と入力しても無効となります。正しい入力がされるまで再入力を求めてくるので、次の処理に進むことができません。

(initget "RED BLUE GREEN")
(setq color (getkword "\n色を選んでください: "))

また、メッセージの中でキーワードを「/」で区切って[]で囲うと、通常のコマンドのように選択肢をクリックするだけでキーワードの入力が可能。以下の例文ではメッセージ内のキーワードが青くハイライトされ、キーワードをクリックできるようになります。

(initget "RED Blue Green")
(setq color (getkword "\n色を選んでください [RED/Blue/Green]: "))
user-input-function_getkword_image1

入力の手間が省けるだけでなく、どんな選択肢があるかわかりやすくなるので、入力ミスや混乱が大きく減ります。ちなみにキーワードの頭文字だけ大文字にしている場合、ハイライトされるのは頭文字だけです。

はこさん。
はこさん。

ユーザーにとって使いやすいプログラムを作成する上で、getkwordはとても役立つ便利な関数です。

initget

user-input-function_initget

initgetはユーザー入力関数で入力を求める前にキーワードや入力の条件を設定するAutoLISP関数です。initgetには次のような特徴があります。

  • 複数のキーワードを半角スペースで区切って設定する
  • 入力が必要な部分だけ大文字にすると、大文字部のみの入力でキーワードを指定できる
  • Enterや0だけの入力など、特定の入力を禁止できる
  • 設定した内容は直後のユーザー入力関数にのみ有効

複数のキーワードを設定する場合、キーワードごとに半角スペースで区切って指定します。たとえば、Red、Green、Blueをキーワードとしたい場合は次のように記述してください。

(initget "Red Green Blue")
(setq color (getkword "\n色を選んでください [Red/Green/Blue]: "))

キーワードの一部を大文字にしておくと、ユーザーは大文字部を入力するだけでキーワードを指定できます。上記の例では「r」と入力するだけで「Red」のキーワードが指定できるので入力が楽になります。

また、initgetの最初の引数に以下の数値を与えることで、特定の入力を許可または禁止することも可能。よく使う数値は下表のとおりです。

数値内容
1Enterのみの入力を禁止
20の入力を禁止
4負の値の入力を禁止

表の数値は足し合わせて使うこともできます。たとえば、以下のように3を与えるとEnterと0の入力を禁止にできるため、Enterか0が入力されたときは再入力を求めるようになります。

(initget 3)
(setq num (getint "0以外の整数を入力してください: "))

引数に指定できる数値は他にもいくつかあります。表に記載していない数値を知りたい方は公式サイトのヘルプをご覧ください。
>>AutoCAD 2025 ヘルプ|initget (AutoLISP)

initgetで設定した内容は直後のユーザー入力関数にのみ適用されます。複数の入力が続く場合は、以下のように毎回initgetを呼び出す必要があるので注意してください。

(initget 1 "Yes No")
(setq first (getkword "\n最初の選択 [Yes/No]: "))

(initget 1 "Red Blue")
(setq second (getkword "\n次の選択 [Red/Blue]: "))
はこさん。
はこさん。

initgetを活用することで入力ミスを防いだり、選択肢を明確にしたり、プログラムの信頼性と使い勝手がアップします。

getint

user-input-function_getint

getintはユーザーに整数を入力させるAutoLISP関数です。getintの特徴は下記のとおり。

  • 整数以外を入力した場合は再入力を求める
  • 実行中にユーザーへのメッセージを表示できる
  • 入力せずにEnterを押したときはnilを返す

getint はあくまで「整数を取得する関数」なので、ユーザーが小数(例:3.14)や文字列(例:"abc")を入力した場合、無効と判定され再入力が自動的に求められます。

はこさん。
はこさん。

ちなみに0と負の値もgetintで取得できます。

他のユーザー入力関数と同様に引数として文字列を与えると、ユーザへのメッセージを表示させることも可能。

(setq height (getint "\n文字の高さを整数で入力してください: "))

何も入力せずにEnterキーだけを押したときはnilを返します。以下のように省略可能な入力やデフォルト値を使う処理ではnilを返す動作が役立ちます。

(setq num (getint "\n整数を入力してください(省略可): "))
(if (not num)
  (princ "\n入力が省略されました。")
  (princ (strcat "\n入力された数値: " (itoa num)))
)
はこさん。
はこさん。

getintは入力値の安全性とユーザーの利便性を両立できる関数です。

getreal

user-input-function_getreal

getrealはユーザーに実数を入力させるAutoLISP関数です。getrealには以下のような特徴があります。

  • 整数も実数として受け取る
  • 実行中にユーザーへのメッセージを表示できる
  • 整数と実数以外を入力した場合は再入力を求める
  • 入力せずにEnterを押したときはnilを返す

getrealは小数だけでなく整数も実数として受け取ります。たとえば、ユーザーが「10」と入力しても「10.0」という実数として処理されます。

(setq x (getreal "\n長さを入力してください: ")) 
;;; 10 → 10.0

引数に文字列を与えると、コマンドラインにわかりやすい案内メッセージを表示させることも可能。ユーザーが正しい形式で入力しやすくなりミスの防止につながります。

getintと同様に文字列や記号など数値以外が入力された場合は無効とみなされ、再入力が自動的に求められます。たとえば、「abc」や「12a」 といった数値以外の入力は無効となり、正しい値が入力されるまで次の処理には進めません。

何も入力せずにEnterだけを押した場合、getrealはnilを返します。getintと同じく、入力の省略やデフォルト値を使う処理ではnilを返す動作が役立ちます。

(setq scale (getreal "\nスケール値を入力(Enterで既定値): "))
(if (not scale)
  (setq scale 1.0)
)
はこさん。
はこさん。

getrealは小数が必要な場面で役立つ関数です。

getdist

user-input-function_getdist

getdistはユーザーが指定した2点間の距離を返すAutoLISP関数です。getdistの特徴は次のとおり。

  • 2点目を指定するときは1点目からのラバーハンドが表示される
  • 実行中にユーザーへのメッセージを表示できる
  • 基点を与えた場合は2点目だけ指定する
  • 距離を数値で入力することもできる

ユーザーが図面上で2点目を指定するときは、1点目からマウスカーソルの位置までラバーバンド(ゴム線)が表示されます。2点間の距離を「目で見て」確認しながら操作できるため、距離をイメージしやすいです。

また、他のユーザー入力関数と同様に引数として文字列を与えると、ユーザーへのメッセージを表示できます。

(setq len (getdist "\n長さを入力するか、2点をクリックしてください: "))

引数として基点を与えた場合、ユーザーが指定するのは2点目のみ。

(setq pt1 (getpoint "\n基点を指定してください: "))
(setq len (getdist pt1 "\n2点目を指定して距離を取得: "))
はこさん。
はこさん。

1点目はプログラム側で固定できるため、使い方の幅が広がります。

ちなみに距離は図面上で2点をクリックしてもよいですし、キーボードから数値で直接入力してもOK。正確な数値がわかっているときは直接入力、不明なときは図面上で指定と、どちらの使い方にも対応できる柔軟性があります。

はこさん。
はこさん。

getdistは距離を正確に測ったり、目で見て確認しながら作図したいときに役立つ関数です。

getangle

user-input-function_getangle

getangleはユーザーが指定した2点の角度を返すAutoLISP関数です。getangleには次のような特徴があります。

  • 実行中にユーザーへのメッセージを表示できる
  • 2点目を指定するときは1点目からのラバーハンドが表示される
  • 基点を与えた場合は2点目だけ指定する
  • 反時計回りで増加するように角度を計測する
  • 0度の方向はシステム変数「ANGBASE」の設定に従う
  • 返り値の単位はラジアン
  • 角度を数値で入力することもできる

getangleは引数として文字列を与えると、ユーザーへのメッセージを表示させることが可能。どのような入力が必要か伝えられるので操作ミスの防止にもなります。

(setq ang (getangle "\n角度をラジアンで入力、または2点をクリックしてください: "))

2点目を指定するときは1点目からのラバーハンド(ゴム線)が表示されるため、どの方向を選んでいるかが見た目でわかり操作しやすくなります。引数として基点を与えた場合は2点目だけ指定すれば角度を返します。

(setq basePt (getpoint "\n基点を指定してください: "))
(setq ang (getangle basePt "\n2点目を指定してください: "))

getangleは反時計回りで増加するように角度を計測します。0度とする方向はシステム変数「ANGBASE」の値によって変わるので注意してください。

ANGBASEの詳細については公式のヘルプで確認できます。
>>AutoCAD 2025 ヘルプ|ANGBASE (システム変数)

返り値の単位は度ではなくラジアンであることにも注意が必要です。

ラジアン

弧度法で表すときの角度の単位。一般的な度数法の角度を180度で割り、π(円周率)をかけた値で表現される。
>>ラジアン|単位プラス|大日本図書

また、角度をマウスで指定せずに、キーボードから直接ラジアンで入力することも可能。正確な角度を知っている場合はこちらが便利です。

はこさん。
はこさん。

getangleは角度をわかりやすく入力できる便利な関数です。

getorient

user-input-function_getorient

getorientはユーザーが指定した2点がなす角度を返すAutoLISP関数です。getorientの特徴は次のとおり。

  • 実行中にユーザーへのメッセージを表示できる
  • 2点目を指定するときは1点目からのラバーハンドが表示される
  • 基点を与えた場合は2点目だけ指定する
  • 反時計回りで増加するように角度を計測する
  • 0度の方向は必ず右(東)向き
  • 返り値の単位はラジアン
  • 角度を数値で入力することもできる

getangleと同じく引数として文字列を与えると、ユーザーへのメッセージを表示できます。どのような入力が必要か伝えられるので操作ミスの防止にもなります。

(setq ang (getorient "\n回転方向を指定してください: "))

2点目を指定するときは1点目からのラバーハンド(ゴム線)が表示されるため、どの方向を選んでいるかが見た目でわかりやすいです。あらかじめ始点(基点)を与えると、ユーザーは2点目だけを選ぶことで角度を取得できます。

(setq basePt (getpoint "\n基点を指定してください: "))
(setq ang (getorient basePt "\n2点目を指定してください: "))

また、getangleはシステム変数「ANGBASE」の値によって0度とする方向が変わりますが、getorientの0度とする方向はシステム変数や設定によって変わりません。必ず右(東)向きを0度として角度を計測します。

getangleと同様に計測される角度の単位は度ではなく、ラジアンなので注意してください。角度はキーボードから直接入力することも可能です。

はこさん。
はこさん。

getorientはどんな設定でも基準を変えずに角度を計測したいときに使える関数です。

ユーザー入力関数をマスターして作業をスマートにしよう

user-input-function_caption2

今回の内容を以下にまとめます。

関数入力タイプ備考
getpoint座標グリッドの影響あり、ラバーハンドあり
getstring文字列スペースの入力や文字数に注意
getkwordキーワードinitgetと併用
getint整数負の値は入力可、整数以外は入力不可
getreal実数整数は実数に変換される
getdist距離距離専用、直接値の入力も可
getangle角度0度方向はANGBASEに依存
getorient角度0度方向は常に右(東)向き

それぞれの関数には向いている用途があり、場面によって使い分けることで、わかりやすく使いやすいプログラムが作れるようになります。ユーザー入力関数を正しく活用し、作業の効率化に役立ててください。

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

-AutoLISP関数, 関数解説