AutoLISP には特定のタイプの入力をユーザに要求するために設計された関数セットが用意されていますが、入力デバイスから生の入力を収集することもできます。
ユーザからの入力を取得するために使用することができる関数の一部は、次のとおりです。
grread 関数は、キーボードやポインティング デバイス(マウスやディジタイザ)からの「生の」ユーザ入力を返します。grread の呼び出しでトラッキングが使用可能な場合、この関数はドラッグなどに使えるディジタイズされた座標を返します。grread 関数が返す値はリストで、最初の文字はユーザが提供した入力のタイプを定義します。
次のサンプル コードは、grread 関数を使用して、提供された入力がキーボードからのものかどうかをチェックします。
(defun c:GetCharacter ( / code) (prompt "\nEnter a single character: ") (setq code (grread)) (if (= 2 (car code)) (progn (prompt (strcat "\nCharacter entered was: " (chr (cadr code)))) (prompt (strcat "\nASCII code: " (itoa (cadr code)))) ) (prompt "\nInput was not from the keyboard.") ) (princ) )
このサンプル コードをロードして実行すると、次のプロンプトが表示されます。
単一の文字を入力してください:
キーボードのあるキーを押すと、該当するキーの文字と ASCII コードが AutoCAD のコマンド プロンプトに表示されます。たとえば、1 つの文字を入力するように求められたときに、[Caps Lock]が無効である状態でまたは[Shift]を押さずに[F]を押すと、次のように表示されます。
入力された文字: f
ASCII コード: 102
AutoLISP には、ユーザが AutoCAD のコマンド プロンプトに対して行った基本的な入力を取得するための関数がいくつか用意されています。これらの関数では、点の入力、文字または数字の入力、さらには分岐コマンドを実行するためのキーワードの使用を要求することができます。各ユーザ入力 getXXX 関数は、ユーザが特定のタイプのデータを入力するまで待機し、入力された値を返します。これらの関数の 1 つを呼び出すアプリケーションでは、ユーザ入力を待つ前に表示するオプションのプロンプトを指定することができます。initget 関数は、一部の getXXX 関数では機能しません。
initget 関数を使用して、次に呼び出す getXXX 関数をコントロールすることができます。この関数は bits と keywords の 2 つの引数を受け付けます。これらの引数は両方とも省略可能です。bits 引数に、1 つまたは複数のコントロール ビットを指定することにより、次に呼び出すユーザ入力関数に対して、特定の入力値を許可または禁止にします。keywords 引数には、次の getXXX 関数呼び出しが認識する 1 つまたは複数のキーワードを指定します。initget により設定されたコントロール ビットおよびキーワードは、次に呼び出される getXXX 関数にのみ適用されるので、この呼び出し後に破棄する必要はありません。
次のコードは、ユーザに整数の入力を要求するために getint 関数を使用しています。
(defun c:AskForInteger ( / ) (setq int (getint "\nEnter an integer: ")) (if int (prompt (strcat "\nUser entered: " (itoa int))) (prompt "\nUser did not provide an integer.") ) (princ) )
このサンプル コードをロードして実行すると、次のプロンプトが表示されます。
整数を入力してください:
有効な整数を入力すると、getint 関数に対して入力した値が返され、その値がプロンプト「ユーザ入力:」の一部として AutoCAD のコマンド プロンプトに表示されますが、無効な整数を入力するとメッセージ「整数値を入力してください」が表示されて、ユーザは再度整数を入力するように求められます。値を入力する前に[Enter]を押すと、メッセージ「ユーザは整数を入力しませんでした」というメッセージが表示されます。
意図しないユーザ エラーからコードを保護してください。AutoLISP のユーザ入力関数 getXXX は、ほとんどのエラーから保護してくれます。ただし、getXXX 関数ではチェックできない、プログラムの他の要件を順守しているかどうかをチェックすることが重要です。入力の有効性をチェックしないと、プログラムの整合性に重大な問題が生じることがあります。