
こんにちは!はこです。
業務で5年以上AutoLISPを使用しています。
AutoLISPってなに?という方はまずこちらの記事をご覧ください。
AutoCADユーザーがAutoLISPを覚えるべきメリット3選
プログラミングの強みは同じ動作を正確に繰り返すことができる点にあります。今回の記事で解説する関数「repeat」は繰り返し処理が行えるため、まさに強みの象徴です。
AutoLISPでAutoCADの作業を効率化したい方とって非常に有益な内容となっています。使用例と合わせて解説してきますのでぜひご覧ください。
ちなみに、repeat以外にも「while」という条件を満たすかぎり繰り返し処理を続ける関数があります。こちらの記事ではwhileについて解説していますのでご覧いただけると幸いです。
【AutoLISP】条件を満たすかぎり繰り返す関数「while」
【AutoLISP】指定の回数だけ繰り返す関数「repeat」

repeatの動作
repeatは同じ処理を指定回数だけ繰り返す関数です。repeat内には繰り返したい処理を複数記述することができます。繰り返しの回数には整数を指定してください。
使用例① 5つの同心円を作成する
繰り返し処理で5つの同心円を作成する例です。中心は(0,0)として、半径を1ずつ大きくしていきます。
(setq center (list 0 0))
(setq radius 1)
(repeat 5
(command "circle" center radius)
(setq radius (1+ radius))
)
まずはじめに中心座標(0,0)を変数centerに格納して、最初の円の半径である数値の1を変数radiusに格納しています。この例では分かりやすくするため、setqを2行に分けてそれぞれの変数に値を格納していますが、1行にまとめても問題ありません。
setqを1行にまとめる書き方についてはこちらの記事をご覧ください。
【AutoLISP】変数にデータを格納する関数「setq」
repeatの後ろに記述しているのが繰り返しの回数です。今回は5つ円を作成するので数値の5を指定しています。円を作成するコマンドcircleを呼び出して円を作成したのち、次に作成する円の半径を1だけ増加させる動作が繰り返されます。

実行結果はこんな感じになります。

ちなみに変数の値を1だけ増加させる演算をインクリメントと呼びます。AutoLISPでは「1+」という関数で実行することが可能です。また、1だけ減少させる演算はデクリメントと呼ばれて「1-」で表現できます。
インクリメントとデクリメントについては四則演算と合わせてこちらの記事で紹介していますのでよろしければご覧ください。
【AutoLISP】四則演算の関数
使用例② リストに格納された座標を中心として円を作成する
リストに格納された座標を順番に取り出して円を作成する例です。円の半径は1とします。
(setq pt1 (list 0 0))
(setq pt2 (list 2 2))
(setq pt3 (list 4 4))
(setq lst (list pt1 pt2 pt3))
(setq n 0)
(repeat (length lst)
(command "circle" (nth n lst) 1)
(setq n (1+ n))
)
変数pt1~pt3に座標を格納したのち、それらの座標を変数lstへリストとして格納します。lengthで取得した変数lstの要素数がrepeatの繰り返し回数です。この例では3回繰り返します。
インクリメントの変数nとn番目の要素を取得する関数nthにより、繰り返しのたびに中心座標が変わっていくのでそれぞれの座標に円を作成することができます。

実行結果はこんな感じになります。

リストの要素を取得する関数はnth以外にも存在します。こちらの記事で解説していますのでよろしければご覧ください。
【AutoLISP】car部とcdr部を取得する関数「car」「cdr」
【AutoLISP】リストの要素を取得する関数「nth」「last」「assoc」
repeatの書式
repeatの構文と引数および返り値は次のようになります。
- (repeat int [expr ...])
- int
- 繰り返しの回数。整数で指定。
- expr
- 繰り返す処理。複数記述できて省略も可能。
- 最後の評価結果 / nil
- 繰り返しの最後に評価された結果が返る。exprが省略されている場合はnilを返す。
まとめ
今回のまとめ
- repeatは指定の回数だけ同じ処理を繰り返す
- 指定する繰り返しの回数は整数にする