- AutoLISPのリストについて知りたい
- リストの作り方が分からない
- リスト同士をつなげて1つのリストにしたい
AutoLISPを覚えたいけど、リストの扱い方が分からずお困りではないでしょうか。そもそもリストって何?という方も多いはず。リストの扱い方が分からないと、AutoLISPを上手に活用することはできません。
私はAutoLISPを独学し、業務の自動化・効率化に役立つプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。
AutoLISPとは何か知りたい方は、こちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説
今回の記事ではリストについて解説した後、リストを作成するAutoLISP関数をご紹介します。AutoLISPで最も重要な内容が身に付くため、AutoCADの効率化・自動化に大きく近づけます。
リストの扱い方を覚えて、AutoLISPの基礎を固めてください。
リストを作成する場合はlistを使用します。ドットペアと呼ばれる特殊なリストはconsで作成してください。リスト同士をつなぎ合わせたいならappendを活用しましょう。
リストとは複数のデータを1つにまとめたもの
リストとは複数のデータを1つにまとめた、AutoLISP独特のデータ形式のこと。他のプログラミング言語で「配列」と呼ばれるデータ形式に似ています。
>>配列とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
リストにはAutoLISPで扱うあらゆるデータを格納できます。格納される各データは「要素」と呼ばれ、専用の関数で要素の取得が可能。
要素を取得する関数については、こちらの記事で解説しているので参考にしてください。
>>【AutoLISP】リストの要素を取得する関数「nth」「last」「assoc」
ちなみに、リストの内部はcar部、cdr部と呼ばれる2つのエリアで構成されています。car部には要素が格納され、cdr部の中はさらにcar部とcdr部に分かれる入れ子の構造になっています。
car部とcdr部、リストの構造については、以下の記事で解説しています。
>>【AutoLISP】car部とcdr部を取得する関数「car」「cdr」
また、要素が2つか3つの数値だけの場合、図面上の2D座標や3D座標として扱うことも。リストは作図の効率化には欠かせない、重要なツールの1つです。
リストを作成するAutoLISP関数3選
今回ご紹介するAutoLISP関数は次の3つ。どれもリスト作成の基礎となる重要な関数です。
- list
- append
- cons
リストを作成する list
listとは与えた引数をまとめて、1つのリストを作成する関数のこと。数値や文字列だけでなく、関数やリストなどAutoLISPで扱うあらゆるデータを引数として与えることができます。
例えば、以下のように様々な形式のデータをまとめて、1つのリストにできます。
(list 1 "hako" (list 10 15))
ちなみに、リストを表現する方法はlist以外にも。次の3つの式は同じリストを表しています。
(list 1 2 3)
(quote (1 2 3))
'(1 2 3)
quoteとは引数を評価せずにそのまま返す関数のことで、「'(シングルクォーテーション)」はquoteを簡略に表現したものです。listよりも「'」を使った方がプログラムは短くできます。他の関数と書き方を合わせたいなら、listを使いましょう。
特にこだわりがなければ、listを使う方法がおすすめです。
listの構文 / 引数 / 返り値
listの構文と引数、返り値は次のとおりです。
(list [要素・・・]) ※[]内は省略可能
引数 | 内容 |
要素 | 作成するリストの要素。省略可能 |
返り値 | 内容 |
リスト | 与えた引数を要素に持つリストが返る 引数を省略した場合はnilを返す |
使用例① 円の中心座標を作成する
中心座標をlistで表現して、円を作図するプログラムをご紹介します。
(setq center (list 10 15))
(command "circle" center "D" 10)
変数centerにはlistで作成した円の中心座標(10,15)を格納。commandで"circle"コマンドを呼び出すことにより、座標(10,15)を中心として円を作図できます。
ちなみに、作成される円の直径は10です。
commandとは、AutoCADコマンドを実行できる関数のこと。commandの使い方や使用例をもっと知りたい方は、こちらの記事をご覧ください。
>>【AutoLISP】コマンドを呼び出す関数「command」
使用例② 図形定義データを作成して作図する
listで図形定義データを作成して、作図するプログラムをご紹介します。図形定義データとは名前のとおり、図形を定義するために必要な項目をまとめたものです。
図形定義データについては、こちらの記事で解説しているので参考にしてください。
>>図形編集を自動化しよう!AutoLISPの図形名関数を解説
プログラムは以下のとおり。
(setq ent (list (cons 0 "circle") (cons 8 "0") (cons 10 (list 10 15)) (cons 40 5)))
(entmake ent)
変数entに格納されるリストは、作図する円の図形定義データを表しています。画層や座標など、円を定義するために最低限必要な情報をconsで作成。listで1つにまとめることにより、図形定義データとなります。
consについては後ほど解説するので、お楽しみに
consのすぐ右側の数値はグループコードと呼ばれ、図形を定義する各項目に対応しています。上記のプログラムで使用しているグループコードと、図形定義の項目との対応は次のとおり。
グループコード | 図形定義の項目 |
0 | 図形の種類 |
8 | 画層 |
10 | 座標(円の中心) |
40 | 円の半径 |
entmakeを実行すると、変数entの内容で円が作図されます。entmakeとは図形定義データをもとに作図する関数のこと。entmakeの詳細はこちらで解説しているので、よろしければご覧ください。
>>図形編集を自動化しよう!AutoLISPの図形名関数を解説
リストに要素を追加する append
appendとはリストに要素を追加して、1つの新しいリストを作成する関数のこと。要素が追加される位置は、リスト(先頭の引数)の一番後ろです。複数の引数を与えた場合は、与えた順番に要素が追加されます。
注意点はappendで追加できるデータがリストだけあること。リスト以外の要素を追加しようとすると、エラーで処理が止まります。リスト以外の要素を追加したい場合は、前述したlistなどであらかじめリストにしてください。
appendの構文 / 引数 / 返り値
appendの構文と引数、返り値は次のとおりです。
(append [リスト・・・]) ※[]内は省略可能
引数 | 内容 |
リスト | 先頭の引数:要素が追加されるリスト 先頭以外の引数:要素として追加するリスト |
返り値 | 内容 |
リスト | 与えた引数を順番に追加した新しいリストが返る 引数を与えない場合はnilを返す |
使用例 リストの一番後ろに別のリストを追加する
appendでリストの一番後ろに、別のリストを追加するプログラムをご紹介します。
(setq lst1 (list 1 2))
(setq lst2 (list 3 4))
(setq lst3 (list 5 6))
(setq lst4 (append lst1 (list lst2) lst3))
まず、変数lst1~lst3にリストを格納しています。appendで変数lst1の後ろに、変数lst2と変数lst3を順番に追加。返り値は変数lst4へ格納されます。
出力結果は以下のとおりです。
注目していただきたいのは、listによって変数lst2自体をリストの要素にしているところ。一旦リストにすることで、変数lst2は1つの要素として追加されます。
以下のように変数lst2をリストにしない場合は、上記のプログラムとは出力結果が異なります。
(setq lst1 (list 1 2))
(setq lst2 (list 3 4))
(setq lst3 (list 5 6))
(setq lst4 (append lst1 lst2 lst3))
出力結果は次のようになります。
変数lst2、lst3の要素がそれぞれ、変数lst1の要素として1つずつ追加されています。
「引数の番外側のかっこを取り除いて、1つにつなぎ合わせる」と覚えていただくと出力結果がイメージしやすいです。
ドットペアを作成する cons
consはドットペア(ドット対)を作成する関数です。ドットペアとは2つだけの要素を持ち、要素の間に「.(ドット)」をはさむ特殊なリストのこと。ドットペアはリストの基本構造であり、図形定義データの要素としても使われています。
リストの構造について知りたい方は、以下の記事をご覧ください。
>>【AutoLISP】car部とcdr部を取得する関数「car」「cdr」
図形定義データについては、こちらの記事が参考になります。
>>図形編集を自動化しよう!AutoLISPの図形名関数を解説
例えば、図形定義データで図形の種類が円である情報は、次のように表現されます。
(0 . "circle")
図形の種類を表すグループコードの「0」と、円を表す「"circle"」によってドットペアを構成。図形定義データは上記のようなドットペアをいくつも要素として持っているため、さまざまな図形を表現できます。
グループコードとは図形情報の項目を表す数字です。
また、リストはドットペアが入れ子になった構造をしているため、consで既存のリストに要素を追加することも。前述したappenndとは異なり、リストの先頭に要素が追加されます。
consの構文 / 引数 / 返り値
consの構文と引数、返り値は次のとおりです。
(cons 要素1 要素2)
引数 | 内容 |
要素1 | ・ドットペアのcar部 ・リストの先頭に追加する要素 |
要素2 | ・ドットペアのcdr部 ・要素1が追加されるリスト |
返り値 | 内容 |
ドットペア | 要素2がリスト形式でない場合、要素1と要素2のドットペアを返す |
リスト | 要素2がリスト形式なら、先頭に要素1を追加したリストを返す |
使用例① リストの先頭に別のリストを追加する
consでリストの先頭に、別のリストを追加するプログラムをご紹介します。
(setq lst1 (list 1 2))
(setq lst2 (list 3 4))
(setq lst3 (cons lst1 lst2))
最初に変数lst1と変数lst2へリストを格納。consによって、変数lst2の先頭に変数lst1が1つの要素として追加されます。
出力結果は次のとおりです。
consはappendのように、追加する要素をあらかじめリストにする必要がありません。
appendにはないconsのメリットです。
ただし、consはappendのように、一度に複数の要素を追加することができません。複数の要素を追加したい場合は、追加する要素の数だけconsを繰り返す必要があります。
繰り返しのAutoLISP関数についてはこちらをご覧ください。
>>【AutoLISP】指定の回数だけ繰り返す関数「repeat」
>>【AutoLISP】条件を満たすかぎり繰り返す関数「while」
使用例② 図形定義データを書き換える
consで図形定義データの要素を作成し、書き換えを行うプログラムをご紹介します。
(command "circle" (list 0 0) "D" 10)
(setq ent1 (entget (entlast)))
(setq ent2 (subst (cons 10 (list 10 10)) (assoc 10 ent1) ent1))
(entmod ent2)
最初にコマンドを呼び出して、座標(0,0)に直径10の円を作成。円の図形定義データをentgetで取得して、変数ent1へ格納します。
3行目では変数entから座標を表す要素(グループコードが10)をassocで検索。substで座標の情報を(10,10)に置き換えて、新しい図形定義データを変数ent2に格納しています。
assocはリストから特定の要素を検索する関数です。詳細は以下の記事をご覧ください。
>>【AutoLISP】リストの要素を取得する関数「nth」「last」「assoc」
4行目のentmodによって、最初に作成した円の図形定義データが書き換わり、中心座標が(0,0)から(10,10)へ移動します。
entmodは図形定義データを書き換える関数です。 詳細はこちらの記事で解説しています。
>>図形編集を自動化しよう!AutoLISPの図形名関数を解説
entmodは座標だけでなく、画層や色などさまざまな項目を一度に変更できるので、とても便利な関数です。
リストを使いこなしてAutoCADを効率化しよう
今回ご紹介した、リストを作成するAutoLISP関数を以下にまとめます。
構文 | 内容 |
(list [要素・・・]) ※[]内は省略可能 | 与えた引数で1つのリストを作成する |
(append [リスト・・・]) ※[]内は省略可能 | 引数を順番にリストへ追加して、1つの新しいリストを作成する |
(cons 要素1 要素2) | ・与えた2つの引数でドットペアを作成する ・リストの先頭に要素を追加する |
リストはAutoLISPの重要な基礎の1つです。使い方をしっかり身に付けて、AutoCADの効率化に役立ててください。
AutoLISPの基礎を書籍で学びたい方には「AutoCAD 自動化攻略読本」がおすすめ。初心者向けに解説されており、AutoLISP以外の自動化方法も学べるお得な一冊。とにかくAutoCADで楽をしたい方はぜひご覧ください。