関数 if ではもし〇〇なら、それ以外なら、と2つしか選択肢ができません。
関数 cond を使うと、〇〇の場合、××の場合、△△の場合…、と、複数の条件式を設定できます。
関数 cond
cond は、多分岐条件関数と呼ばれる関数で、条件に合わせていくつもの選択肢を設定することができます。
関数を入れる( ) は、基本的には1つの関数につき1ペアですが、cond は、条件ごとに、さらに( ) が必要なので、注意してください。
(cond
((ここがTなら1) (これをする1))
((ここがTなら2) (これをする2))
((ここがTなら3) (これをする3))
((ここがTなら4) (これをする4))
( T (どの条件にも合わなければこれをする))
)
こんなイメージです。
もし、いくつもの条件が合う時は、先に条件が合った方が適用されます。
一番最後の条件にTを入れると、上から順番に条件をみて、すべて外れてきた要素が最後にきたとき、条件関係無くT なので、適用されるという仕組みです。
ifと違って、
((ここがTなら1) (これをする1) (これをする1) (これをする1))
のように、複数の処理を設定できます。
使用例) 外部参照の明るさ切替え
コマンドの内容
外部参照ファイルの表示の明るさは、システム変数 XDWGFADECTL でコントロールされています。0だと明るく表示され、90だと暗くなります。
関数 cond を使って、XDWGFADECTL の値が、
- 30未満なら 30
- 30以上60未満なら 60
- 60以上90未満なら 90
- それ以外なら 0
にするコマンドです。
実行する度に明るさが変わっていきます。一度コマンドを実行したら、エンターかスペースキーでコマンドが繰り返されるので、繰り返してみると、明るさが変わっていくのがわかると思います。
コマンド名は test です。
AutoLISP プログラム
(defun c:test ( / a )
(setq a (getvar "XDWGFADECTL"))
(cond
((< a 30) (setvar "XDWGFADECTL" 30))
((and (<= a 30)(< a 60)) (setvar "XDWGFADECTL" 60))
((and (<= a 60)(< a 90)) (setvar "XDWGFADECTL" 90))
( T (setvar "XDWGFADECTL" 0))
);cond
(princ))
AutoLISP の説明
(setq a (getvar “XDWGFADECTL”))
getvar で、システム変数 XDWGFADECTLの値を取得して、変数 a に入れています。
(cond
((< a 30) (setvar “XDWGFADECTL” 30))
((and (<= a 30)(< a 60)) (setvar “XDWGFADECTL” 60))
((and (<= a 60)(< a 90)) (setvar “XDWGFADECTL” 90))
(T (setvar “XDWGFADECTL” 0))
);cond
cond を使って、XDWGFADECTL を条件に合わせて変えていきます。
30未満なら 30の場合、
((< a 30) (setvar “XDWGFADECTL” 30))
条件式は (< a 30) です。< は2つの値で右側の方が大きければTを戻す関数です。AutoLISPでは関数は( の次に来るので注意してください。
30未満だとTが戻り、そのすぐ横の(setvar “XDWGFADECTL” 30)が実行されます。
システム変数を変更する関数setvarでシステム変数XDWGFADECTLの値を30に変更です。
((and (<= a 30)(< a 60)) (setvar “XDWGFADECTL” 60)
30以上、かつ60未満、2つの条件を、関数andでまとめています。
and は引数の条件がすべてTならTが戻り値になります。
(T (setvar “XDWGFADECTL” 0))
30未満、30から60、60から90、どれにも当てはまらない場合は XDWGFADECTL 0にします。
0になった後は、最初の30未満の条件に当てはまるので、コマンドを実行する度に数値が順番に変わっていきます。
まとめ
- cond は、複数の条件式を設定できる。
- 関数だけでなく、条件の数だけ( ) がある。
- 上から順番に条件が合ったら、その処理が実行される。
- 最後にTを入れておくと、どの条件からも外れたときに実行する処理を設定できる。
関連記事
if条件式について
条件が合う=T の意味がよくわからない。という場合はコチラを。
cond を使ったサンプル記事です。