初歩のLISP
<項目>
・LISPの基礎
1.計算をしてみよう
2.変数を使ってみよう
3.円を描いてみよう
4.LISPファイルを作成してみよう
5.単線コマンドを作成してみよう
6.寸法線コマンドを作成してみよう
7.寸法線コマンドに変数を使ってみよう
8.補助線コマンドを作成してみよう。(システム変数)
9.コメントを入れておこう。
BricsCADはClassic、Pro。Platinumのすべてで、LISPを使用することができます。
LISPは比較的簡単な言語です。手作業のみでなく、簡単なLISPコマンドを作成し、自動化すると便利です。
マクロとの違いは、リターンキーを押した時に再度そのコマンドが実行することができます。
マクロの場合、処理を中止して、再度、リターンキーを押しても同じ処理は実行できません。
その点、LISPで作成した場合、LISPをロードしていれば、CADが終了するまでリターンキーで再度実行することができ、とても便利です。
また、はるかに、処理出来る内容が違います。
ここでは、初歩のLISPの勉強をしていただければと思います。
LISPに関しては、インターネット上に様々、情報がありますので、探してみてください。
LISPの基礎
LISPとは?
歴史が古く、安定している言語です。AutoCADなどで、バージョンアップした場合も、比較的そのまま使用できます。バージョンアップがあった場合も、移植が簡単に行えます。
LISP言語であれば、VBAよりも処理が高速です。ほとんどの処理が可能です。(不得意な部分もあります)
LISPはテキストファイルですから、テキストエディター(メモ帳等)があれば、誰でも作成できます。保存時の拡張子を○○○.lspとするだけです。
1.計算をしてみよう。
Bricscadのコマンドラインに次の式を入力しリターンキーを押してみてください。
(+ 10 20)
30
コマンドプロンプトに30と表示されたかと思います。
※ "(" や "+" 、 "10" 、"20" は全て半角です。
"+" 、 "10" 、"20"の間は半角スペースを入れてください。
これは、10+20=30 の計算式です。
LISP式は必ず括弧"()"でくくられている必要があります。
また、括弧の先頭が命令語となります。
四則演算は次の様になります。
20-10 → (- 20 10)
20+10 → (+ 20 10)
20×10 → (* 20 10)
20÷10 → (/ 20 10)
また、括弧の中に括弧を入れることもできます。
(10+20+30)÷3 → (/ (+ 10 20 30) 3)
LISP式は以下の様になります。
(関数 引数 引数 引数 引数 ・・・)
引数はいくらあってもOKです。
注意)
LISPの中で扱う数字は、整数と実数があります。
少数点以下の数値を求める場合、計算式の値に注意してください。
例) 6÷5の計算
(/ 6 5) の計算結果と
(/ 6.0 5) の計算結果は違います。
1 と 1.2 という計算結果になったかと思います。
この様に、少数点以下の値まで必要な場合、計算する値も少数点以下
まで入力してください。整数と整数の場合、結果も整数となります。
- その他の関数
四則演算 + - * / べき乗 expt 平方根 sqrt
各コマンドに数値を入力する時に、計算式を入力すると便利です。
2.変数を使ってみよう。
<TOP>
Lispでは変数を使用することが出来ます。
変数をyすると、yに次の値を代入する場合、下記の様に記載します。
y = 30 ÷ 10
(setq y (/ 30 10))
[setq] はある値を変数に代入する関数です。
※LISPの場合、他のプログラム言語の様に変数の型を宣言する必要はありません。大文字と小文字の区別もありません。
・変数の値を確認する方法
変数の前に [!] を付けてコマンド入力してください。
!y
:3
この場合、括弧は不要です。そのまま入力してください。
※変数に代入された値は、Bricscadが終了するまで記憶しています。新しい値を代入すれば値は書き換わります。
(setq y (+ y 40)) :43
!y
:43
と、変数の値が書き換わります。
変数には、数値のみでなく文字列も代入できます。
: (setq y "moji") : "moji"
コマンド | オプション | 内容 |
---|---|---|
setq | 変数に値を代入する関数 |
3.円を描いてみよう。
<TOP>
では、ここで、変数に値を入れ、その値で円を描いてみます。
:(setq x (/ 100 2)) :circle[enter]
次に
2点(2P)/..../<中心>:
と確認があるので、適当な位置をマウスでポイントして
直径(D)/<半径> :!x
変数の値をコマンドへ渡す場合も、”!” を変数の前に付けます。
これで、半径50 の円が描けたと思います。
では、ここで、マウスの座標値を返すコマンドを使ってみます。
getpoint
CAD上でマウスがポイントした座標の値を返してくれる、LISP関数です。
:(setq p (getpoint "ポイントを指示"))[enter]
ポイントの座標をpの変数に代入します。
:circle[enter] 2点(2P)/..../<中心>: !p[enter] 直径(D)/<半径> :!x [enter]
これで、先ほどの入力された変数も加え、全て変数によって入力できました。
コマンド | オプション | 内容 |
---|---|---|
getpoint | マウスのポイント座標を返す関数 |
4.LISPファイルを作成してみよう。
<TOP>
今までは、全て、コマンドラインに入力していましたが、その場合、複数行にわたるプログラムは入力できません。
そこで、いよいよ、LISPファイルを作成し、複数行にわたるプログラムを作成してみましょう。
まず、どこでも最初に書かれている初歩のプログラムから作成してみます。
(defun c:hello() (princ "Hello!") )
上記を、何でも良いので、テキストエディタで記入し、拡張子を lsp として登録してください。
例) hello.lsp
ここでは、一番簡単な実行方法を説明します。
まず、Bricscadを起動してください。
起動したら、hello とコマンドラインに入力してみてください。
: hello コマンドを認識できません "HELLO". 再度実行してください。
と表示されれば、正常です。Bricscadには、hello というコマンドはありません。
次に、先ほど作成した lspファイルをドラッグして、Bricscadの作図画面にドロップしてください。
これで、lspファイルがロードされます。
再度、コマンドラインにhelloと入力し、[enter] を押してください。
:hello[enter]
: hello Hello!"Hello!"
と、表示されましたか?
これで、hello というコマンドが新しく追加されました。
Bricscadにコマンドを追加する場合は、最初に (defun c:・・・()・・・) という関数からはじめます。
書式としては、
(defun c:コマンド名() (LISP式) )
と、なります。
コマンド | オプション | 内容 |
---|---|---|
princ | コマンドラインに制御文字を考慮にいれた文字を表示する関数 | |
defun | リスプ機能を定義します。 |
5.単線コマンドを作成してみよう。
<TOP>
command 関数を使います。これは、LISPからBricsCADのコマンドを実行することができる関数です。
ファイル名は適当に [tline.lsp] とでもしてみましょう。
(defun c:LINE1() (command "line" pause pause "") )
入力したら、ファイルをBricsCADの作図エリアにドロップアウトしてください。
ファイルがロードされ、コマンドラインに 「line1」と入力すると、BricsCADのLINEコマンドが起動して、始点と終点で終了するはずです。
pause はユーザー入力待ち ”” は[Enter]キーと同じです。
ですから、今回は、LINE コマンドを実行し、ユーザー入力、始点、終点を確認して
Enter キー を押したのと同じ動作です。
コマンド | オプション | 内容 |
---|---|---|
command | BricsCADのコマンドを実行する為の関数 | |
line | BricsCADの直線コマンド | |
pause | 入力待ちのコマンド | |
"" | 空白の入力で[Enter]キーと同じ動作 |
6.寸法線コマンドを作成してみよう。
<TOP>
初歩のDIESELマクロのサイトでもご紹介しているマクロで作成する寸法線コマンドをLISPで作成してみましょう。
^C^C_-LAYER;M;DIM;C;2;DIM;;_DIMLINEAR;¥¥¥_-LAYER;S;0;
このマクロを1つづつLISPにしていけばOKです。
(defun C:DIM2() (command "_-layer" "M" "DIM" "C" "6" "DIM" "" "_dimlinear" pause pause pause "_layer" "S" "0" "" ) )
そのままの動作をLISPにしているだけです。
LISPの場合、好きなところで改行しても問題ありません。
大文字、小文字の区別はありません。
他にもいろいろ変更してみてください。
※注意点 :コマンド名称の付け方ですが、既に存在するコマンド名と重複しないコマンド名にしてください。同じコマンド名の場合、後にロードされたLISPに置き換わってしまいます。注意してください。
コマンド | オプション | 内容 |
---|---|---|
-LAYER | M | 画層作成 |
C | 画層の色指定 | |
S | 現在画層にする設定 | |
DIMLINER | 寸法線 |
色番号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|
色 | 赤 | 黄 | 緑 | 水色 | 青 | 紫 | 白 |
7.寸法線コマンドに変数を使ってみよう。
<TOP>
変更することが多い文字で、何箇所かに出てくる文字は変数を使うと便利です。
(defun C:DIM2() (command "_-layer" "M" "DIM" "C" "6" "DIM" "" "_dimlinear" pause pause pause "_layer" "S" "0" "" ) )
上記では、DIM画層に変数を使用してみます。
(defun C:DIM2() (setq gaso "DIM") (command "_-layer" "M" gaso "C" "6" gaso "" "_dimlinear" pause pause pause "_layer" "S" "0" "" ) )
注意点は、変数名に" " をつけないことです。
" " を付けると文字として扱われてしまいます。
変数を使用すると、画層名を変更したい場合
(setq gaso "DIM")
の一か所の画層名を変更するだけでOKとなります。
わかりやすく、修正ミスが少なくなります。
何度も出てくる値は、変数で扱うと便利です。
コマンド | オプション | 内容 |
---|---|---|
setq | 変数に値を代入する関数 |
8.補助線コマンドを作成してみよう。(システム変数)
<TOP>
では、作図にあると便利な構築線を使用した補助線のコマンドをつくてみましょう。
寸法線の時は、寸法線を引く画層に変更して寸法線を引き、その後に0画層に戻していましたが、ここでは、システム変数を使用して、現在作図している画層に再び戻す処理としてみましょう。
(defun C:hojo() (setq mgaso (getvar "clayer")) (setq gaso "HOJYO") (command "_-layer" "M" gaso "c" "5" gaso "" "_xline" "H" pause "") (setvar "clayer" mgaso) (command "_draworder" "L" "" "B") )
ここで新たに出てきたのが、LISP関数である getvar と setvar です。
そして、システム関数である clayer です。
clayer は現在画層の情報を取得します。
getvar はシステム変数の値を取得します。
最後に setvar はシステム変数に値を返します。
ここでは、現在画層を元の画層に戻す動作となります。
最後にあるコマンド
(command "_draworder" "L" "" "B")
上記は補助線が図形に被らない様に、最背面に移動させるコマンドです。
draworder 表示順序を変更するコマンドです。
B を指定することにより、選択された図形を最背面に移動します。
L は、最後に作図した図形を選択するコマンドです。
getvar と setvar は最初の値を取得して、最後に値を戻す場合にペアでよく使われます。
覚えておきましょう。
コマンド | オプション | 内容 |
---|---|---|
getvar | システム変数の値を取得する | |
setvar | システム変数を指定する値でセットします | |
clayer | 現在画層の情報を取得する | |
draworder | B | 表示順を変更する。 最背面へ移動 |
select | L | 最後に作図した図形を選択する |
9.コメントを入れておこう。
プログラムの中にコメントを入れておくことは大切です。
プログラムの見直しが出てきた場合、自分以外の人が見る場合、コメントが
無いとそのプログラムを理解するまでに時間がかかってしまいます。
プログラムを作る時は、コメントを入れるクセをつけておきましょう。
コメント入力は 「 ;(セミコロン)」をコメントの先頭に付けて書きます。
行末までがコメント扱いとなり、何が書いてあっても無視されます。
;++++++++++++++++++++++++++++++++++++++ ;補助線削除コマンド ;++++++++++++++++++++++++++++++++++++++ (defun C:hojo() (setq mgaso (getvar "clayer")) ;現在画層を変数 mgaso にセット (setq gaso "HOJYO") ;gaso 変数に HOJYO 画層名をセット (command "_-layer" "M" gaso ;HOJYO画層がなければ作成、あれば無視 "c" "5" gaso "" ;HOJYO画層を青色に変更 "_xline" "H" pause "") ;構築線の水平線を指定入力待ち (setvar "clayer" mgaso) ;現在画層を作図前の画層に変更 (command "_draworder" "L" "" "B") ;直前に作図された図形の表示順序を最背面へ移動 )
a:30349y:3 t:6