- 複雑な仕様でもミスなく作図したい
- なにかの条件を満たしたときだけ処理を切り替えたい
- AutoLISPのif文を知りたい
すばやく正確に作図したいけど、仕様が複雑でいまいち効率が上がらずお困りではないでしょうか。仕様が複雑になるほど、手動の操作では対応が難しくなります。仕様に合わせて自動的に処理を切り替えたいと思う方も多いはず。
私は独学したAutoLISPを活かし、AutoCADを自動化するプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまでさまざまなツールを作成してきました。
そもそもAutoLISPってなに?という方はこちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説
当記事では条件分岐のAutoLISP関数を解説します。最後まで読み終わるころには条件分岐の基礎が身に付くため、状況によって処理を切り替えられる実用的なAutoLISPプログラムを作成できます。
条件分岐を活用して、業務が楽になるプログラムの作成に役立ててください。
条件分岐とはプログラムの処理の切り替えのことです。条件分岐が1つのときはif、複数ある場合はcondを使ってください。
ifが条件分岐の後に実行できる式は1つだけです。複数の式を実行したいならprognで1つの式にまとめましょう。
条件分岐とは処理の切り替えのこと
条件分岐とはプログラムの処理の切り替えを指します。条件分岐には「分岐を判定する条件」と「分岐後の処理」が必要です。
たとえば、「もし宝くじが当たったら、海外旅行に行こう」という文章をイメージしてください。「宝くじが当たったら」が分岐を判定する条件、「海外旅行に行こう」は分岐後の処理にあたります。
条件分岐をいくつも組み合わせることで、さまざまな状況に対応できる柔軟なプログラムを作成できます。プログラムを思い通りに動かすためには条件分岐が欠かせません。
プログラミングで業務を楽にしたいなら、条件分岐の使い方は必ず覚えてください。
条件分岐のAutoLISP関数2選
今回ご紹介する条件分岐のAutoLISP関数は以下の2つです。
- if
- cond
分岐の条件が1つのAutoLISP関数「if」
ifは最も基本的な条件分岐のAutoLISP関数です。1つの条件に対して、条件を満たす場合と満たさない場合で処理を分けることができます。
条件には「<」「>=」などの比較演算や「and」「or」などの論理演算を使って、ねらい通りの条件を設定しましょう。
- 比較演算
- 値の大小を比べたり、値同士が等しいか調べたりする演算
- 論理演算
- 真か偽の入力値に対して、真か偽のどちらかを出力する演算
注意点は分岐後の処理がそれぞれ1つの式しか認識されないことです。分岐後に複数の式を処理したい場合は、prognで1つの式にまとめてください。
prognの使い方は使用例で解説します。
ifの構文と引数
ifの構文と引数は次のとおりです。
(if 条件 Then式 [Else式])
※[]内は省略可能
- 条件
- 処理の分岐を判定をする式
- Then式
- 条件を満たす(条件がnil以外を返す)場合に実行される式。Then式として認識されるのは1つの式のみ
- Else式
- 条件を満たさない(条件がnilを返す)場合に実行される式。Else式として認識されるのは1つの式のみ。Else式は省略可能
ifの返り値
ifの返り値は以下のようになります。
- 分岐後の式の結果
- 分岐後の式の結果がそのまま返り値となる
ifの使用例 座標を判定して作図する円を変える
指定した座標によって、作図する円を変えるプログラムをご紹介します。
プログラムを実行するためには、lspファイルの作成とロードが必要です。lspファイルやロードってなに?という方はまずこちらの記事をご覧ください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方
(defun c:test1 (/ center x)
;;;条件を満たすときに円を作図する画層(画層の色は赤)
(command "-layer" "M" "layer1" "C" 1 "layer1" "")
;;;Enterが押されるまで座標を取得
(while (setq center (getpoint "座標を指定してください。(Enterで終了)"))
;;;X座標を取得
(setq x (car center))
(if (and (<= 10 x)
(> 50 x))
;;;X座標が10以上かつ50未満の場合は「layer1」に円を作図
(progn
(setvar "clayer" "layer1")
(command "circle" center "D" 10)
)
;;;X座標が10未満または50以上の場合は「0」に円を作図
(progn
(setvar "clayer" "0")
(command "circle" center "D" 5)
)
)
)
)
プログラム中で使っている関数については、こちらの表を参考にしてください。
関数 | 内容 | 詳細記事 |
defun | ユーザー関数を定義 | 詳細を見る |
command | AutoCADコマンドを実行 | 詳細を見る |
while | 条件を満たすかぎり処理を繰り返す | 詳細を見る |
setq | 変数へ値を格納 | 詳細を見る |
getpoint | ユーザーに座標を指定させる | 詳細を見る |
car | リストのcar部を取得 | 詳細を見る |
and | ANDの論理演算 | 詳細を見る |
setvar | システム変数を書き換える | 詳細を見る |
実行結果と動作の解説
上記のプログラムを実行した結果は次のとおり。
プログラムの動作をまとめると以下の5つになります。
- 円を作図する画層"layer1"を作成
- ユーザーに座標を指定させる
- X座標が10≦x<50の範囲内にあるか判定
- 判定の結果によって現在層と直径を変えて円を作図
- Enterが押されるまで円の作図を続ける
ユーザーに座標を指定させ、X座標が10≦x<50なら"layer1"、範囲外のときは"0"に円を作図します。"layer1"の画層の色は赤色なので作図される円も赤色になります。
whileで処理を繰り返しているため、Enterが押されるまでプログラムは終了しません。
ちなみに、X座標が範囲内のときは円の直径が10になります。
prognはifの相棒
注目していただきたいのは、分岐後に実行される処理を「progn」でまとめているところです。prognとは複数の式をまとめて1つの式にできるAutoLISP関数のこと。
ifの場合、分岐後には1つの式しか実行できません。しかし、prognを使うことで分岐後に複数の式を実行できます。
今回の例では次の2つの式をprognで1つにまとめています。
- 現在層の変更
- 現在層に円を作図
ifを使いこなすためにはprognが欠かせません。ifとprognはセットで覚えてください。
分岐の条件が複数のAutoLISP関数「cond」
condとは分岐の条件が複数指定できるAutoLISP関数のこと。指定した条件のどれかを満たしたときに、対応する処理が実行されます。
分岐後の処理は複数の式を認識できます。ifのようにprognで1つの式にまとめる必要はありません。
条件は箇条書きのように並べて記述するため、プログラムの見た目もシンプルになります。条件の判定は上から順番に行うので、条件を記述する順番に注意してください。
condの構文と引数
condの構文と引数は次のとおりです。
(cond (条件 処理・・・) (条件 処理・・・)・・・ )
- 条件
- 処理の分岐を判定する条件。複数の条件を設定できる
- 処理
- 条件を満たした場合に実行される処理(1つ以上の式)。条件ごとに処理を設定できる
condの返り値
condの返り値は以下のとおりです。
- 分岐後の処理の結果
- 満たした条件に対応する、処理の結果がそのまま返り値となる
condの使用例 中心座標の位置によって円の色を変える
指定した中心座標の位置(象限)によって、円の色が変わるプログラムをご紹介します。
プログラムを実行するためには、lspファイルの作成とロードが必要です。lspファイルやロードってなに?という方はまずこちらの記事をご覧ください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方
(defun c:test2 (/ center x y)
;;;4つの画層を作成
(command "-layer" "M" "layer1" "C" 1 "layer1" "")
(command "-layer" "M" "layer2" "C" 2 "layer2" "")
(command "-layer" "M" "layer3" "C" 3 "layer3" "")
(command "-layer" "M" "layer4" "C" 4 "layer4" "")
;;;Enterが押されるまで座標を取得
(while (setq center (getpoint "座標を指定してください。(Enterで終了)"))
;;;X座標とY座標を取得
(setq x (car center))
(setq y (cadr center))
;;;X座標とY座標の値によって現在層を切り替え
(cond ((and (< 0 x)
(< 0 y))
(setvar "clayer" "layer1")
)
((and (> 0 x)
(< 0 y))
(setvar "clayer" "layer2")
)
((and (> 0 x)
(> 0 y))
(setvar "clayer" "layer3")
)
((and (< 0 x)
(> 0 y))
(setvar "clayer" "layer4")
)
(T
(setvar "clayer" "0")
)
)
;;;現在層に円を作図
(command "circle" center "D" 10)
)
)
プログラム中で使っている関数は、以下の表を参考にしてください。
関数 | 内容 | 詳細記事 |
defun | ユーザー関数を定義 | 詳細を見る |
command | AutoCADコマンドを実行 | 詳細を見る |
while | 条件を満たすかぎり処理を繰り返す | 詳細を見る |
setq | 変数へ値を格納 | 詳細を見る |
getpoint | ユーザーに座標を指定させる | 詳細を見る |
car、cadr | リストのcar部を取得 | 詳細を見る |
and | ANDの論理演算 | 詳細を見る |
setvar | システム変数を書き換える | 詳細を見る |
実行結果と動作の解説
実行結果は次のとおり。
プログラムの動作をまとめると以下のようになります。
- 円を作図する画層を4つ作成
- ユーザーに座標を指定させる
- 座標の象限によって現在層を切り替える
- 現在層に円を作図する
- Enterが押されるまで円の作図を続ける
まずはじめに、画層の色が異なる4つの画層("layer1"~"layer4")を作成。ユーザーが指定した座標を判定して、"0"または"layer1"~"latyer4"のいずれかに現在層を切り替えます。
現在層に円が作図されるので、座標によって円の色が変わります。ifの使用例と同じように、Enterが入力されるまで処理は終了しません。
最後のTは条件のもれを防げる
最後の条件には「T」と記述することをおすすめします。なぜなら、条件のもれを防げるからです。
Tとは真をあらわす定数です。
X軸上またはY軸上の座標を指定した場合、最後の条件以外はどの条件も満たしません。条件を満たさないと現在層は切り替わらないので、条件が合わない画層に円が作図されることに。
最後の条件がTなら、他の条件を満たさない場合にも現在層の切り替えが可能。どの座標を指定しても、条件を満たす画層に円を作図できます。
条件のもれは不具合のもと。慣れないうちは最後の条件に必ずTを記述するようにしましょう。
条件分岐を使いこなして業務を楽にしよう
今回解説した内容を以下にまとめます。
- 条件分岐とはプログラムの処理の切り替えのこと
- ifは1つの条件に対して、条件を満たす場合と満たさない場合で処理を分けることができる
- ifが認識できる分岐後の式は1つのみ
- prognは複数の式を1つの式にまとめることができる
- condは処理を分岐する条件が複数指定できる
- condは分岐後の式を複数認識できる
条件分岐はプログラミングにとって、なくてはならない存在です。上手に活用して業務が楽になるプログラムの作成に役立ててください。
AutoLISPの基礎を書籍で学びたい方には「AutoCAD 自動化攻略読本」がおすすめ。初心者向けに解説されており、AutoLISP以外の自動化方法も学べるお得な一冊。とにかくAutoCADで楽をしたい方はぜひご覧ください。