AutoLISP を使用して、AutoCAD の組み込みコマンドの機能を定義解除したり、置き換えることができます。
UNDEFINE[コマンド定義解除]コマンドを使用して AutoCAD の組み込みコマンドを無効にすることができ、次に AutoLISP を使用して、それを defun 関数を使用して定義した同じ名前のユーザ定義コマンドに置き換えることができます。コマンドは、現在の編集セッションでのみ定義解除された状態が保持されます。コマンドの組み込み定義は、REDEFINE[再定義]コマンドを使用して復元することができます。
定義解除された後も、前にピリオド(.)を付けてコマンド名を指定することにより、そのコマンドの組み込み定義を実行することができます。たとえば、QUIT[AutoCAD の終了]が定義解除されていても、AutoCAD のコマンド プロンプトに対して .quit と入力することにより、本来の QUIT コマンドにアクセスできます。これは、組み込みコマンドが定義解除されていても、ユーザ定義関数およびユーザ定義コマンドが予想どおりに動作することを確実にするために、AutoLISP の command 関数内で使用すべき構文でもあります。
すべてのコマンドに対し、コマンドの前にピリオドを付けることで、メニュー、スクリプト、および AutoLISP プログラムを保護することをお勧めします。そうしておけば、アプリケーションでは、再定義されたコマンドではなく、確実に組み込みコマンド定義が実行されます。
次の例を考えてみます。LINE[線分]コマンドを使用するとき、AutoCAD が必ず PLINE[ポリライン]コマンドの使用について確認してくるようにしたいとします。次のように AutoLISP の C:LINE 関数を定義すると、通常の LINE コマンドを変更できます。
(defun C:LINE ( ) (princ "Shouldn't you be using PLINE?\n") (command ".LINE") (princ) ) C:LINE
この例では、C:LINE 関数はメッセージを表示した後で、標準の LINE コマンドを実行します(command 関数で .LINE を使用)。AutoCAD で LINE コマンドのユーザ定義を使用できるようにするには、その前に組み込みの LINE コマンドを定義解除しなければなりません。次のコマンドを入力して、組み込みの LINE コマンドを定義解除します。
(command ".undefine" "line")
コマンドを定義解除した後、AutoCAD のコマンド プロンプトに対して line と入力すると、AutoLISP の C:LINE 関数が実行されます。
コマンド: line
PLINE を使用しなくてもよろしいですね?
.LINE 1 点目を指定: 1 点目を指定
このコードの実行例は、システム変数 CMDECHO が 1(オン)に設定されていることを前提にしています。CMDECHO を 0(オフ)に設定すると、AutoCAD は command 関数呼び出し中にプロンプトをエコー表示しません。次のコードは、システム変数 CMDECHO を使用して、LINE コマンドのプロンプトを繰り返し表示しないようにしています。
(defun C:LINE ( / cmdsave ) (setq cmdsave (getvar "cmdecho")) (setvar "cmdecho" 0) (princ "Shouldn't you be using PLINE?\n") (command ".LINE") (setvar "cmdecho" cmdsave) (princ) ) C:LINE
これで、AutoCAD のコマンド プロンプトに対して line と入力すると、次のように表示されます。
PLINE を使用しなくてもよろしいですね?
1 点目を指定:
コマンドを定義解除および再定義することにより、たとえば、図面管理システムを作成することができます。NEW[新規作成]、OPEN[開く]、QUIT[AutoCAD の終了]コマンドを再定義することにより、図面を作成した後、および編集セッションを終了する前に、ログ ファイルに作業情報を書き込むことができます。