- 同じ作業を何度も繰り返すのはめんどくさい
- ミスなく正確に作図できるようになりたい
- 繰り返し処理ができるAutoLISPの関数を知りたい
めんどくさい作業を何度も繰り返すことにストレスを感じていないでしょうか。繰り返す回数が多くなるとミスが起きやすくなり、修正の手間もかかります。
私は独学したAutoLISPを活かし、AutoCADを自動化するプログラムを5年以上作成しています。数行の簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。
そもそもAutoLISPってなに?という方はこちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説
当記事では繰り返しの作業を自動化するAutoLISP関数をご紹介します。最後まで読んでいただければ、同じ作業の繰り返しを自動化できるため、AutoCADでの作図が楽になります。
繰り返しのAutoLISP関数を使いこなして、AutoCADのめんどくさい作業から解放されましょう。
繰り返しの作業を自動化すれば、時間の節約とミスの防止につながります。AutoLISPはAutoCADのあらゆる作業を自動化できる頼もしい存在です。
繰り返しのAutoLISP関数はrepeat、while、foreachの3つ。用途に合わせて関数を使い分けることが重要です。
繰り返しの自動化はAutoCADユーザーを楽にする
AutoCADで楽をしたいなら、繰り返しの作業を自動化することは非常に重要です。なぜなら、時間の節約とミスの防止につながるからです。
たとえば、以下のような円とテキストを格子状に作図する作業があるとしましょう。
格子状に並べるだけならまだしも、図形の数を増やしたり特定の図形だけ画層を変えたりすると、作業は複雑になる一方。手動では時間がかかるだけでなくミスも起きやすくなります。
より多くの作業をすばやく正確にこなすためには、作業の自動化が欠かせません。
AutoLISPなら繰り返しの作業を自動化できる
AutoLISPなら同じ作業の繰り返しを自動化できます。理由はAutoLISPのプログラムがユーザーの代わりに作業してくれるからです。
AutoLISP
LISPと呼ばれる言語をもとにしたAutoCAD専用のプログラミング言語。AutoCADコマンドの実行や図形の編集など、AutoCADのあらゆる作業を自動化できる。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説
1000個の円とテキストを格子状に並べたり、図面上にあるすべてのブロックを指定の画層へ移動させたり、手動では手間のかかる作業もすばやく正確にこなすことができます。
また、AutoCADに用意されている自動化機能の中でも、AutoLISPは習得と扱い方が簡単です。
AutoLISP以外のAutoCADを自動化する機能が知りたい方は、こちらの記事で紹介している書籍をご覧ください。
>>【AutoLISPの教科書】AutoCAD自動化攻略読本のメリット5選|おすすめ活用法も解説
AutoLISPはAutoCADユーザーを楽にしてくれる頼もしい存在です。
チェックポイント
AutoLISPでプログラムを作成するためにはエディタが必要です。エディタの使い方やプログラムの実行方法についてはこちらの記事をご覧ください。
>>【入門】AutoLISP開発をはじめよう!Visual LISP エディタの使い方
繰り返しを自動化するAutoLISP関数3選
繰り返しの処理を自動化できるAutoLISP関数は以下の3つです。
- repeat
- while
- foreach
関数とは毎回決まった動作をする、プログラムの部品と思ってください。
決まった回数だけ処理を繰り返すAutoLISP関数「repeat」
repeatとは決まった回数だけ処理を繰り返すAutoLISP関数です。あらかじめ繰り返したい回数が分かっているときに使用しましょう。
repeatの構文と引数
repeatの構文と引数は次のとおりです。繰り返しの回数は0以上の整数を指定してください。実数やnilだとエラーになります。
(repeat 繰り返し回数 式・・・)
- 繰り返し回数
- repeat内に記述した処理を繰り返す回数。0以上の整数でないとエラーになる。
- 式
- repeat内で実行される処理。複数記述できて省略も可能。
repeatの返り値
repeatの返り値は以下のとおりです。
- 最後に評価した式の結果
- repeat内で最後に評価した式の結果が返り値となる。
repeatの使用例 円の作図を3回繰り返す
repeatを活用して円の作図を3回繰り返すプログラムをご紹介します。
(defun test1 (/ n) ;;;変数nをローカル変数として定義
;;;変数nに0を格納する
(setq n 0)
;;;repeat内の処理を3回繰り返す
(repeat 3
;;;変数centerに円の中心座標(10n,0)を格納
(setq center (list (* 10 n) 0))
;;;変数centerを中心に直径10の円を作図
(command "circle" center "D" 10)
;;;変数nに1を足す
(setq n (1+ n))
)
)
プログラムを実行すると、以下のような3つの円が横並びに作図されます。
使用例の解説 X座標の移動がポイント
上記のプログラムの動作は次の3つです。
- 中心座標を算出して変数centerに格納
- 変数centerの座標に円を作図
- 中心座標の算出と円の作図を3回繰り返す
動作① 中心座標を算出して変数centerに格納
ユーザー関数のtest1を実行すると、最初の動作で変数nに0を格納します。理由は変数nの中身が空(nil)だと座標の算出ができないからです。
(defun test1 (/ n) ;;;変数nをローカル変数として定義
;;;変数nに0を格納する
(setq n 0)
・・・
)
ユーザー関数とは、ユーザーがAutoLISP関数を組み合わせて作ったオリジナルの関数のこと。ユーザー関数の作り方はこちらの記事を参考にしてください。
>>【初心者向け】関数を作ろう!ユーザー関数を定義するAutoLISP関数「defun」
次に、円の中心座標を算出して変数centerへ格納します。X座標は変数nの倍数なので、変数nの値によってX座標は移動します。Y座標は0まま移動しません。
;;;変数centerに円の中心座標(10n,0)を格納
(setq center (list (* 10 n) 0))
最初のループでは変数nが0なので、作図される円の中心座標は(0,0)です。
動作② 変数centerの座標に円を作図
circleコマンドで変数centerの座標に直径10の円を作図します。
;;;変数centerに直径10の円を作図
(command "circle" center "D" 10)
commandはAutoCADのコマンドを実行できるAutoLISP関数です。commandの使用例を知りたい方はこちらの記事をご覧ください。
>>【作図を自動化】コマンドを実行するAutoLISP関数「command」を解説
円を作図したら変数nに1を足します。X座標は変数nの10倍なので、次のループでは今のループよりもX方向に+10だけ移動します。
;;;変数nに1を足す
(setq n (1+ n))
1+とは引数に1を足すAutoLISP関数のこと。四則演算に関するAutoLISP関数はこちらの記事でご紹介しています。
>>【AutoLISP】四則演算の関数
動作③ 中心座標の算出と円の作図を3回繰り返す
repeatの繰り返し回数に3を記述しているので、中心座標の算出と円の作図は3回繰り返されます。X座標をずらしながら作図するため、最終的に3つの円が真横に並びます。
(repeat 3
・・・
)
繰り返しの回数を100にした場合は、100個の円が作図されるので試してみてください。
条件付きで処理を繰り返すAutoLISP関数「while」
whileとは特定の条件を満たすかぎり処理を繰り返すAutoLISP関数です。繰り返しの回数が決まっていない場合に使用してください。
whileの構文と引数
whileの構文と引数は以下のとおりです。nilを返さない(必ずnil以外を返す)条件の場合、繰り返しが無限に続いて処理を中止できないので注意してください。
(while 条件 式・・・)
- 条件
- 繰り返しを続けるか判定する条件。nilを返すと処理を中止してwhileのループを抜け出す。nil以外を返した場合は処理を続ける。
- 式
- while内で実行される処理。複数記述できて省略も可能。
whileの返り値
whileの返り値は次のとおりです。条件の評価結果ではなく、最後に評価した式の結果が返り値となります。
- 最後に評価した式の結果
- while内で最後に評価した式の結果が返り値となる。
whileの使用例 指定した座標に円とテキストを作図し続ける
ユーザーが図面上で指定した座標に、円とテキストを作図し続けるプログラムをご紹介します。
(defun test2 (/ center) ;;;変数centerをローカル変数として定義
;;;ユーザーが指定した座標を変数centerへ格納。Enterが押されたらwhileは終了する
(while (setq center (getpoint "\n中心座標を指定してください。"))
;;;変数centerに直径10の円を作図
(command "circle" center "D" 10)
;;;変数centerを中央として、高さ2.5で角度0のテキスト"A"を配置
(command "text" "J" "MC" center 2.5 0 "A")
)
)
プログラムを実行すると、 Enterが押されるまで以下のような円とテキストを作図し続けます。
使用例の解説 変数centerの値が重要
プログラムの動作は以下のとおりです。
- ユーザーが指定した座標を変数centerに格納
- 変数centerの座標に円とテキストを作図
- Enterが押されるまで座標の取得と作図を繰り返す
動作① ユーザーが指定した座標を変数centerに格納
ユーザー関数のtest2が実行されると、whileの条件が評価されます。今回の例では以下の式がwhileの条件です。
(setq center (getpoint "\n中心座標を指定してください。")
getpointとはユーザーに座標の指定を求めるAutoLISP関数のこと。ユーザーに操作を求めるAutoLISP関数については、以下の記事を参考にしてください。
>>AutoCADに情報を取り込もう!AutoLISPのユーザー入力関数を解説
getpointは図面上で指定した座標を返します。座標を指定せずにEnterを押した場合はnilを返すので、変数centerには座標かnilのどちらかが格納されます。
getpointに記述した文字列はユーザーへのメッセージとしてコマンドラインに表示できます。
動作② 変数centerの座標に円とテキストを作図
変数centerに座標が格納されたら、円とテキストを作図します。最初に作図されるのは、変数centerを中心とした直径10の円です。
;;;変数centerに直径10の円を作図
(command "circle" center "D" 10)
次に、変数centerを中央としてテキストの"A"を配置します。
;;;変数centerを中央として、高さ2.5で角度0のテキスト"A"を配置
(command "text" "J" "MC" center 2.5 0 "A")
テキストの高さは2.5、傾きは0度です。
textコマンドが開始された直後に”J"と入力すると「位置合わせオプション」の設定に移り、配置するテキストの基点をどこにするか選べます。"MC"は「中央」を表すため、テキストの中央が基点となります。
動作③ Enterが押されるまで作図を繰り返す
whileの条件が返す値は変数centerと同じです。ユーザーが座標を指定した場合は作図を続けますが、Enterを押した場合は処理が中止されてwhileは終了します。
;;;ユーザーが指定した座標を変数centerへ格納。Enterが押されたらwhileは終了する
(while (setq center (getpoint "\n中心座標を指定してください。"))
・・・
)
ちなみに、Escを押すとその時点でプログラムは終了します。
リストの要素の数だけ処理を繰り返すAutoLISP関数「foreach」
foreachとはリストの要素の数だけ処理を繰り返すAutoLISP関数です。リストの各要素を順番に取り出し、指定の変数に格納できます。リストの各要素に対して、同じ処理をしたい場合に活用してください。
foreachの構文と引数
foreachの構文と引数は次のとおりです。
(foreach 要素 リスト 式・・・)
- 要素
- リストの各要素が順番に入れ替わる変数。
- リスト
- 要素を取り出すリスト。リストの代わりにnilを指定した場合、foreachは何もせずそのまま終了する。
- 式
- foreach内で実行される処理。複数記述できて省略も可能。
foreachの返り値
foreachの返り値は以下のとおり。repeatやwhileと同様で、最後に評価した式の結果が返り値となります。
- 最後に評価した式の結果
- foreach内で最後に評価した式の結果が返り値となる。
foreachの使用例 リストへ格納した各座標に円を作図する
リストへ格納した各座標に円を作図する例をご紹介します。
(defun test3 (/ p1 p2 p3 lst center) ;;;変数p1~p3、lst、centerをローカル変数として定義
;;;変数pt1~pt3へ座標を格納
(setq p1 (list 0 0))
(setq p2 (list 5 5))
(setq p3 (list 10 10))
;;;変数p1~p3でリストを作成して変数lstに格納
(setq lst (list p1 p2 p3))
;;;変数lstの要素の数だけ処理を繰り返す
(foreach center lst
;;;変数centerに直径10の円を作図
(command "circle" center "D" 10)
)
)
プログラムを実行すると、以下のように3つの円が作図されます。
使用例の解説 変数centerの入れ替わりがポイント
プログラムの動作をまとめると次の2つになります。
- 中心座標のリストを変数lstに格納
- 変数lstの各要素を中心に円を作図
動作① 中心座標のリストを変数lstに格納
ユーザー関数のtest3を実行すると、変数p1~p3に円の中心座標が格納されます。
;;;変数p1~p3へ座標を格納
(setq p1 (list 0 0))
(setq p2 (list 5 5))
(setq p3 (list 10 10))
ちなみに、setqは一度に複数の変数へデータを格納できるため、1つの式にまとめることも。
>>【AutoLISP】変数にデータを格納する関数「setq」
今回は分かりやすさを優先して、1つずつ変数に座標を格納しています。
変数p1~p3でリストを作成して、変数lstへ格納します。リストを作成している理由は、foreachの引数にリストが必要だからです。
;;;変数p1~p3でリストを作成して変数lstに格納
(setq lst (list p1 p2 p3))
動作② 変数lstの各要素を中心に円を作図
foreachの処理がはじまると、変数lstの要素は順番に変数centerへ格納されるため、 変数centerの中身は変数p1→変数p2→変数p3の順で入れ替わります 。
;;;変数lstの要素の数だけ処理を繰り返す
(foreach center lst
;;;変数centerに直径10の円を作図
(command "circle" center "D" 10)
)
foreachは変数lstの要素の数だけ処理を繰り返すので、最終的には3つの円が作図されます。
繰り返しを自動化してAutoCADを楽にしよう
今回の内容を以下にまとめます。
- 繰り返しの自動化はAutoCADユーザーを楽にする
- AutoLISPなら繰り返しの作業を自動化できる
- repeatは決まった回数だけ処理を繰り返す
- whileは条件を満たすかぎり処理を繰り返す
- foreachはリストの要素の数だけ処理を繰り返す
繰り返しのAutoLISP関数を上手に活用して、AutoCADの自動化に役立てください。
AutoLISPの基礎を書籍で学びたい方には「AutoCAD 自動化攻略読本」がおすすめ。初心者向けに解説されており、AutoLISP以外の自動化方法も学べるお得な一冊。とにかくAutoCADで楽をしたい方はぜひご覧ください。