【AutoCAD】LISP って何から始めたらいい?

2022年1月5日

階段をのぼる男性

これから LISP を勉強しようと思うんだけど…

なにから始めたらいいの?

こんにちは、メモだよ!!管理人です。

今回は、そんなあなたに、LISP の勉強を始めるときに、最初にやってみたらいいことを紹介します。

LISP 以外のプログラミングの経験がある場合は、いきなり 関数リファレンス(AutoLISP) を見てもいいかもしれません。

でも、プログラミングをやったことがないときは、それを見てもチンプンカンプンだと思います。

なので、最初は「こんな事ができるんだ」という簡単なものから体験してみるのがいいと思います。

では、早速見ていきましょう。

 

Hello World !!

プログラミングの勉強を始めるときは、やっぱり Hello World ですよね。

 

コマンド ラインにメッセージを表示する

LISP を一番手っ取り早く実行する方法は、コマンド ラインに LISP を入力することです。

コマンド ラインに (princ "Hello World!!") と入力してみてください。

F2キーを押して、テキスト ウィンドウを確認すると、以下のようになっています。

コマンド: (princ "Hello World!!")
Hello World!!"Hello World!!"

なにが起こったのか、順番に説明しますね。

コマンド: (princ "Hello World!!")

これは、 (princ "Hello World!!") と入力したので、それが表示されているだけです。

 

Hello World!!"\nHello World!!"

Hello World!!"Hello World!!" の Hello World!! の部分は、入力した LISP が実行された結果です。

LISP を実行するときは、「(」で始まって「)」で終わります。

「(」の直後にあるのが関数です。

なので、今回は princ という関数を実行したということです。

princ 関数は、その後に書いた文字列をコマンド ラインに表示するとというものです。

なので、その後に書かれている Hello World!! がコマンド ラインに表示されています。

"Hello World!!" のように、関数のあとに書いたものを引数といいます。

 

Hello World!!"Hello World!!" の "Hello World!!" の部分は、princ 関数の戻り値です。

関数を実行すると、必ず戻り値というものがあります。

princ 関数の戻り値は、princ のあとに入力した文字列です。

なので、 "Hello World!!" が表示されます。

ん~…

なんだかよくわからない…

最初はよくわからなくても大丈夫です。

やっていけば、そのうちわかっていくと思います。

最初は、以下のことがなんとなくわかれば OK です。

LISP では関数を実行する。
関数のあとに引数をつけることができる。
関数には戻り値がある。

Hello World!!"Hello World!!" とコマンド ラインに表示されてますが、 Hello World!! だけ表示したいですよね。

そこで、コマンド ラインに (princ "Hello World!!") (princ) と入力してみてください。

F2キーを押すと、以下のように表示されます。

コマンド: (princ "Hello World!!")(princ)
Hello World!!

ちゃんと Hello World!! だけが表示されましたね。

 

このように、戻り値を表示させたくないときは、最後に (princ) を追加します。

 

警告画面にメッセージを表示する

警告画面を表示するには、alert 関数を使用します。

引数の文字列がメッセージとして表示されます。

なので、(alert "Hello World!!") と入力すると、以下の画面が表示されます。

 

command 関数でコマンドを実行する

command 関数を使用すれば、コマンドを実行することができます。

例えば、始点が 0,0、終点が 100,100 の線分を描く LISP は以下になります。

(command "_line" "0,0" "100,100" "")

最初の引数には、コマンド名を入力します。

今回は線分を作成するので、LINE コマンドを実行するために、"_line" としています。

line はわかるけど…

そのまえにある _ はなに?

line の前にある _ は、「英語版のコマンドを実行しますよ」という意味です。

日本語版の AutoCAD でだけ使用するときは、付けても付けなくても一緒です。

日本語版の AutoCAD では、線分を描きたいときはコマンド ラインに「線分」ではなく「LINE」と入力しますよね。
他の言語の AutoCAD では、コマンド名もその言語のものになっています。
たとえばフランス語版では、線分を描くときはフランス語の「LIGNE」コマンドを実行します。
なので、「LINE」と入力しても「そのようなコマンドはありません。」と言われてしまいます。

そこで、フランス語版で LISP で線分描くときに (command "ligne") としたりすると、フランス語版でその LISP は使えますが、日本語版など他の言語では使えなくなってしまいます。
そうすると、言語ごとの LISP が必要ということになっちゃいますよね。
そんなことがないように、コマンド名の前に _ をつけると、英語版のコマンドが実行されるということになります。

なので、フランス語版の AutoCAD で (command "_line") と実行すると、英語版の LINE コマンドが実行されるので、問題なく実行されます。
これで、_ を付けておけば、どの言語の AutoCAD でも同じ LISP を使用できるようになります。

 

2 番目と 3 番目の引数は、座標値です。

始点が 0,0、終点が 100,100 の線分を作成する記述になっています。

 

最後の引数の ”” は、Enterキーを押す動作になります。

LINE コマンドで線分を描くと、Enterキーを押すまで次の点を聞かれますよね。

なので、”” と書くことでEnterキーを押したときと同じ動作となるので、LINE コマンドがここで終了します。

 

では、同じように LISP で円を描いてみましょう。

(command "_circle" "100,100" "50")

この LISP で、中心が 100,100、半径が 50 の円が作成されます。

 

ポリラインも、同じように command 関数を使用して描けます。

(command "_pline" "0,0" "100,0" "100,100" "0,100" "_c")

この LISP で、一辺が 100 の正方形のポリラインが作成されます。

 

現在層を変更

図形を作成できるようになったので、次は、画層の設定をしてみましょう。

現在層を変更したいときは、-LAYER コマンド > M オプション > <現在層にしたい画層名> でできます。

なので、LISP にするとこうなります。

(command "_layer" "_m" "画層1" "")

この LISP で、現在層が「画層1」になります。

※ M(現在層の新規作成)オプションを使用しているので、画層1 が図面になかったときは 画層1 が作成されて、それが現在層になります。

 

また、システム変数 CLAYER の値を変更することでも、現在層を変更することができます。

システム変数を変更するには、setvar 関数を使用します。

(setvar "CLAYER" "画層1")

command 関数よりも、setvar 関数のほうが早く終わります。

一回実行するだけでは違いはわかりませんが、何度も何度も実行すると違いがでてきます。

ただし、setvar 関数では、-LAYER コマンドの M オプションとは違って、画層1 が図面にないときに 画層1 が作成されるということはありません。

 

画層を作成

では、LISP で画層を作成してみましょう。

今までと同じように command 関数を使用して画層を作成することができます。

(command "_layer" "_n" "画層1" "")

また、以下の LISP でも画層を作成できます。

(setq document (vla-get-ActiveDocument (vlax-get-Acad-Object)))
(setq layerCollection (vla-Get-Layers document))
(setq newLayer (vla-add layerCollection "画層1"))

3 行ありますが、1 行ずつコマンド ラインに入力してみてください。

ちょっといきなり難しくなってしまいましたが、これで「画層1」という名前の画層を作成することができます。

ここでは、細かいことは気にしないで、「この LISP の ”画層1” の部分を作成したい画層名にすればいい」とだけわかればいいです。

画層の作成は、command 関数を使用してもできますが、こっちの方が早く終わります。
作成する画層が少ないときは違いはわかりませんが、非常の多くの画層を作成するときは、違いがわかります。

command 関数は簡単に使用できますが、他の方法で行ったほうがパフォーマンスがいいものもあります。

 

図形のプロパティを変更

では、次に図形のプロパティを変更してみましょう。

change コマンドで図形のプロパティを変更することができるので、command 関数を使用して以下のようにして、作成した円の色を赤色にすることができます。

(command "_circle" "0,0" "100")
(command "_change" "_l" "" "_p" "_c" "1" "")

最初の行で、中心が 0,0 で半径が 100 の円を作成しています。

次の行で、作成された図形の色番号を 1(赤)に変更しています。

 

コマンドの作成

では最後に、今回使用した関数を使って、以下の作業を LISP で実行してみましょう。

  1. 中心が 100,100 で半径が 50 の円を作成する。
  2. 画層1 という名前の新規画層を作成する。
  3. 作成した円を、画層1 に移動する。
  4. 作成した円の色を赤色にする。
  5. 作業が完了したという警告メッセージを表示する。
(defun C:test01 ()
  (command "_circle" "100,100" "50")
  (command "_layer" "_n" "画層1" "")
  (command "_change" "_l" "" "_p" "_la" "画層1" "")
  (command "_change" "_l" "" "_p" "_c" "1" "")
  (alert "作業が完了しました。")
  (princ)
)

ん?

最初に見たことない defun って関数があるけど…

これってなに?

LISP は、今までやってきたように、1 行ずつコマンド ラインに入力して実行することができます。

1 行や 2 行ならそれでも構いませんが、行数が多くなってくると面倒ですよね。

そこで、LISP は ロード することによって、複数の行を一度に実行することができます。

 

また、LISP で実行したい内容を、コマンドに割り当てておけば、コマンド名を入力するだけで LISP を実行することができます。

そのコマンドを作成する関数が defun 関数です。

defun 関数の最初の引数で C: のあとにコマンド名を指定します。

また、その後に () を記述しておきます。

なので、「(defun C:test01 ()」の部分で、これから描かれた内容を test01 というコマンドが呼び出されたときに実行しますということを設定しています。

2 行目移行は、test01 コマンドが実行されたときに行う内容です。

最後の行の「)」は、defun 関数の終わりを示しています。

 

上記 LISP をメモ帳などに貼り付けて test.lsp という名前で保存して、Windows のエクスプローラーからそれをドラッグして AutoCAD の作図画面にドロップすると、test.lsp がロードされます。

その結果、test01 というコマンドを使用できるようになります。

test01 コマンドを実行すると、LISP が実行されて「作業が完了しました。」と表示されます。😄

LISP が実行された。

 

※ ロードは、図面ごとに行われます。そのため、ある図面でロードしても、他の図面でその LISP で作成されたコマンドを実行するためには、再度ロードする必要があります。
※ ロードは、図面を開いたときに自動的にロードすることもできます。

AutoCAD では、LISP をどの図面でも使用できるように、自動的にロードにすることができます
やり方がわからないときは、以下の記事を見てください。
【AutoCAD】AutoLISP の実行方法 ー 図面を開いたときに自動的にロードする

-API
-