AutoCAD コマンドと指定された入力を実行します。
サポートされているプラットフォーム: Windows および Mac OS
(command-s [cmdname [arguments ...]])
タイプ: 文字列
実行するコマンドの名前です。
タイプ: 整数、実数、文字列、リスト
実行するコマンドに指定するコマンド入力です。
command 関数の arguments 引数には、文字列、実数、整数、座標値を指定することができ、これらは実行するコマンドのプロンプト シーケンスの要求によって決まります。空の文字列("")は、キーボードで[Enter]を押すのと同じです。
タイプ: nil
指定された引数を使用してコマンドを実行すると、関数から nil が返されます。関数が正常に完了しなかったときは、*error* が返されます。
詳細については、このトピックの後の方のセクションを参照してください。
次の例は、AutoCAD の CIRCLE[円]コマンドを実行し、直径が 2.75 の円を作成する方法を示しています。
Command: (command-s "._circle" "5,4" "_d" 2.75) nil
次の例は、円の中心点を入力するように求めるプロンプトをユーザに表示する方法を示しています。
Command: (setq cPt (getpoint "\nSpecify center point: ")) (5.0 4.0 0.0) Command: (command-s "._circle" cPt "_d" 2.75) nil
次に、command-s 関数を使用したユーザ入力のプロンプトの不適切な使用例を示します。
Command: (command-s "._circle" (getpoint "\nSpecify center point: ") "_d" 2.75)
command-s 関数は command 関数のバリエーションの 1 つであり、コマンド トークンのコンテンツにいくつか制限がありますが、command よりも高速であり、内部ロジックが違うので *error* ハンドラで使用できます。
コマンド トークンは、command-s 関数に用意されている 1 つの引数です。コマンド トークンには、文字列、実数、整数、点、図形名、一覧などを指定できます。次の例には、AutoCAD の LINE[線分]コマンドと 3 つのコマンド トークンを示します。
(command-s "._line" "0,0" "5,7" "")
「-s」サフィックスは、指定したコマンド トークンの「サブルーチン」の実行を表します。このフォームでは、AutoCAD は AutoLISP から直接呼び出され、指定したコマンド トークンは、メインのドキュメント コマンド プロセッサとは異なる一時コマンド プロセッサで処理されて戻り、一時コマンド プロセッサは終了します。実行するコマンドは、同じ command-s 関数で開始し、完了する必要があります。
一方、command 関数は、指定したコマンド トークンの「コルーチン」を実行した状態のままになります。このとき、AutoLISP は 1 つずつトークンを評価し、結果を AutoCAD に送信して戻り、AutoCAD がそのトークンを処理できるようにします。次に、AutoCAD は AutoLISP を呼び出し、AutoLISP は進行中の式の評価を再開します。このロジック フローでは、後続のトークン式で、前のトークン処理の結果を AutoCAD にクエリーして、使用することができます。
まとめると、「コルーチン」形式のコマンド トークン処理は機能の点でより強力ですが、実行中にのみ使用できるという制約があります。「サブルーチン」形式のコマンド トークン処理はより幅広い状況で使用できますが、すべてのコマンド トークンは事前に処理され、実際の実行は対話的ではありません。コマンド トークンのセットが同じ場合、command-s 関数の方が大幅に高速になります。
command-s 関数を使用する場合、次の点を考慮する必要があります。
(command-s "._line") (command-s "2,2" "12.25,9" "")
次に、有効ではない command-s 関数の使用例を示します。
(command-s "._line" "0,0" PAUSE "")
*error* ハンドラで command 関数を使用する場合、次の方法を使用してカスタムの *error* ハンドラの定義方法を変更してみてください。
プログラムの以前の状態を復元する必要があり、いくつかの一括コマンドを実行する一般的な *error* ハンドラの場合、(command <...>)の代わりに(command-s <...>)を指定できます。*error* ハンドラはこれまでと同様に同じコンテキストから呼び出されます。
次に、command-s 関数を使用した基礎の *error* ハンドラを示します。
(defun my_err(s) (prompt "\nERROR: mycmd failed or was cancelled") (setvar "clayer" old_clayer) (command-s "._undo" "_e") (setq *error* mv_oer) ) (defun c:mycmd () (setq old_err *error* *error* my_err old_clayer (getvar "clayer") ) (setq insPt (getpoint "\nSpecify text insertion: ")) (if (/= insPt nil) (progn (command-s "._undo" "_be") (command-s "._-layer" "_m" "Text" "_C" "3" "" "") (command-s "._-text" insPt "" "0" "Sample Text") (command-s "._undo" "_e") ) ) (setvar "clayer" old_clayer) (setq *error* mv_oer) (princ) )
command-s 関数の使用が必須ではない場合は、command 関数を使用できますが、ローカル シンボルにはアクセスできなくなるという欠点があります。通常、ローカル シンボルは *error* 処理の時点で AutoLISP コール スタック上にあります。
次に、*error* ハンドラで command 関数を引き続き使用するために必要な事項の概要について説明します。
AutoLISP コール スタック上のすべてのローカル シンボルはスコープ外に除外されます。これは、*error* ハンドラに移行する前に AutoLISP の評価がリセットされるためです。
これで command 関数を *error* ハンドラ内で使用できるようになります。
ただし、プログラムがエラー ハンドラを操作の一部として実際にプッシュおよびポップするか、他の不明な AutoLISP ロジックを呼び出している間に AutoLISP ロジックを呼び出すことができる場合、必要な手順の数がいくつか増えます。