AutoLISP関数 関数解説

図形選択の効率アップ!選択セットを操作するAutoLISP関数6選|ssgetが重要

selection-set_eyecatch
  • 図形を何度も選択するのはめんどくさい
  • 選択セットを使って図形の選択を自動化したい
  • 選択セットが操作できるAutoLISP関数を知りたい

複数の図形を手動で選択することは手間がかかったり、選択のミスが起きたりするので効率的ではありません。しかし、AutoCADを使うなら図形を選択する作業は避けて通れないため、自動化したいと思う方も多いはず。

そもそもAutoLISPってなに?という方はこちらの記事をご覧ください。
>>AutoCADユーザー必見【AutoLISPを覚えるべきメリット5選】デメリットも解説

はこ
はこ

私はAutoLISPを独学で習得し、業務に役立つプログラムの作成を5年以上続けています。数行の簡単なプログラムから1000行以上の複雑なものまで、さまざまなプログラムを作成してきました。

この記事では選択作業を自動化したい方に向けて、選択セットを操作するAutoLISP関数を解説します。ほしい図形だけを一瞬で選択できるようになるため、めんどくさい選択作業から解放されます。

図形の選択を自動化してAutoCADをスマートに使いこなしましょう。

選択セットとは選択した図形をまとめたグループのことです。選択セットを新規で作成するにはssgetまたはssaddを使いましょう。選択セット内の特定の図形を取得したい場合はssnameを使います。

ssdelは選択セット内の図形を取り除けます。選択セット内に含まれる図形の数を知りたいならsslength、指定の図形が含まれているか調べたいならssmembを活用してください。

あなたに代わってAutoLISPプログラムを作成します

AutoLISPで作業を自動化したいけど、プログラミングに詳しくないのでツールが作れずにお悩みの方へ。5年以上のAutoLISP経験を活かしてAutoCADを自動化するツールを作成します。既にお持ちのAutoLISPプログラム修正も対応可能です。

AutoCADの面倒くさい作業から解放されたい方は、下記リンク先の「ココナラ」からお気軽にご相談ください。
>>AutoCADが楽になるプログラムを作成します|ココナラ

選択セットとは選択図形のグループ

selection-set_image1

選択セットとは図面上で選択した図形を1つのグループにまとめたものです。複数の図形を操作するときに役立ちます。

専用の関数を使うことで選択セットに図形を追加したり、取り除いたりできるため、図形を手動で選択する必要がありません。一度作成した選択セットは再利用することもできます。

たとえば、図面全体から円だけを選択したり、既存の選択セットから赤い図形だけを選び出して新しい選択セットを作成したりできるため、めんどくさい選択作業が楽になります。

選択セットを使いこなすことはAutoCADの効率化につながるので、使い方をしっかり覚えてください。

選択セットを操作するAutoLISP関数6選

selection-set_image2

ご紹介するAutoLISP関数は次の6つです。

  • ssget
  • ssname
  • ssadd
  • ssdel
  • sslength
  • ssmemb
はこ
はこ

関数名の先頭に付いている「ss」とは「selection set(選択セット)」の略です。

選択セットを作成するAutoLISP関数「ssget」

ssgetとは図面上で選択した図形から選択セットを作成するAutoLISP関数です。選択する範囲や図形の種類などを絞り込むことができるため、ほしい図形だけで選択セットを作成できます。

ssgetの構文と引数、返り値は次のとおり。図形を選択できた場合は作成された選択セットを返し、選択できなかったときはnilを返します。

ssgetの構文

selection-set_image3-1
はこ
はこ

引数の詳細は以下の表をご覧ください。ちなみに、各引数は省略することもできます。

選択方法
選択方法を表す文字列内容
"C"指定した範囲内と範囲に交差するすべての図形
(交差選択)
"CP"指定したポリゴン(多角形)内とポリゴンに交差するすべての図形
(ポリゴン交差選択)
"W"指定した範囲内の図形
(窓選択)
"WP"指定したポリゴン内の図形
(ポリゴン窓選択)
"X"図面上のすべての図形
"F"指定の線分に触れるすべての図形
(フェンス選択)
"L"最後に作成した図形
"P"直前の選択セット
座標1、座標2、座標リスト
引数内容
座標1選択範囲の(対角)1点目
座標2選択範囲の対角2点目
座標リスト選択範囲の頂点座標を順番に並べたリスト
フィルターリスト
図形の情報をまとめた特殊なリスト。該当する図形のみ選択セットに追加される。
内容
(list (cons 0 "line"))線分のみ
(list (cons -4 "<NOT") (cons 8 "0") (cons -4 "NOT>"))画層が"0"でない図形のみ
はこ
はこ

フィルターリストの書き方は後述するssgetの使用例で解説します。

ssgetの使用例

ssgetは与える引数次第で選択する図形を自由に絞り込めます。使用例をご紹介するので参考にしてください。ただし、絞り込みの条件を設定するためには図形の定義データについて理解しておく必要があります。

図形の定義データってなに?という方はこちらの記事をご覧ください。
>>図形編集を自動化しよう!AutoLISPの図形名関数を解説

線分だけを選択する

次のプログラムでは選択する図形を線分だけに絞り込めます。

(ssget (list (cons 0 "line")))

条件を追加して選択する図形をさらに絞り込むことも。画層が"0"であることを追加するとプログラムは次のようになります。

(ssget (list (cons 8 "0") (cons 0 "line")))
図面全体から円だけを選択する

図面全体から円だけ選択して選択セットを作成するときは、以下のようにプログラムを書いてください。

(ssget "X" (list (cons 0 "circle")))

"X"は選択範囲が図面全体であることを表す記号です。図面上にある図形を漏れなく選択できるメリットがあります。

選択範囲を指定する

選択範囲の対角2点を与えることで、図形の選択範囲を指定できます。下記のプログラムでは(0,0)と(10,10)を対角とする四角を、選択範囲として図形を交差選択します。

(ssget "C" (list 0 0) (list 10 10))
はこ
はこ

選択範囲を指定する場合、選択方法も指定しないと返り値はnilになるので注意してください。

また、座標を1つだけ与えた場合は、与えた座標を通る図形が選択されるので覚えておきましょう。

(ssget (list 0 0))
選択範囲を多角形にする

通常の選択範囲は四角形ですが、頂点座標のリストを引数として与えると選択範囲を多角形にできます。頂点座標は時計回り、反時計回りのどちらでもかまいませんが、必ず順番どおりに並べて書いてください。

(setq pt-list (list (list 10 10) (list 0 15) (list -10 10) (list -10 -10) (list 10 -10)))
(ssget “CP” pt-list)
論理演算と比較演算で選択する図形を絞り込む

選択する図形を絞り込む条件には、論理演算と比較演算が使えます。

論理演算
真の値(True:条件が成立)と偽の値(False:条件が成立しない)という2つの値による演算のこと。論理積(AND)や否定(NOT)など演算方法にはいくつか種類がある。
>>論理演算とは - ITを分かりやすく解説
比較演算
<や=などの演算子を使って、値の大小や同一性を比較する演算のこと。比較の結果は真の値(True:条件が成立)または偽の値(False:条件が成立しない)で返す。
>>比較演算子とは|「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

たとえば、論理演算を使って図面全体から線分以外を選択するプログラムは次のとおり。

(ssget ”X" (cons -4 ”<NOT”) (cons 0 “line”) (cons -4 “NOT>”))

否定を表す条件の間に線分の情報を入れることで、線分以外が選択されます。ちなみに、-4は論理演算や比較演算の演算子を指定するためのグループコードです。

グループコードについてはこちらの記事をご覧ください。
>>図形編集を自動化しよう!AutoLISPの図形名関数を解説

論理演算の演算子はグループ演算子と呼ばれ、上記のように必ずペアで使います。グループ演算子の先頭には”<”、最後には”>”が付くので注意しましょう。複数のグループ演算子を組み合わせて、絞り込みの条件を追加することもできます。

以下のプログラムでは比較演算により、中心のX座標が2以上の円だけを図面全体から選択します。

(ssget “X” (list (cons 0 “circle”) (cons -4 “>=,*,*”) (cons 10 (list 2,0,0))))

アスタリスク(*)を書いているため、y座標とz座標は選択図形の絞り込みに影響しません。また、画層や線種など、比較する情報が文字列の場合には比較演算が使えないので注意してください。

はこ
はこ

画層や線種で絞り込みたいときは前述した論理演算を活用しましょう。

選択セットから図形名を取得するAutoLISP関数「ssname」

ssnameは選択セット内の図形から図形名を取得するAutoLISP関数です。要素番号と呼ばれる選択セットに追加された順番を指定することで、対象の図形名を取得できます。

図形名とは図面上の図形ごとに割り当てられた数値ラベルのこと。図形の定義データを取得するときに必要です。
>>図形編集を自動化しよう!AutoLISPの図形名関数を解説

ssnameの構文

ssnameの構文と引数、返り値は以下のとおり。指定した要素番号に該当する図形が見つかったら、その図形名を返します。見つからなかった場合はnilが返り値となります。

selection-set_image4-1

次のプログラムでは図面全体の図形から選択セットを作成し、その選択セット内の2番目の図形から図形名を取得します。

(setq ss (ssget "X"))
(ssname ss 1)
はこ
はこ

選択セット内の要素番号は0から始まるため、2番目の図形は1が要素番号となります。

選択セットに図形を追加するAutoLISP関数「ssadd」

ssaddとは既存の選択セットに図形を追加するAutoLISP関数のこと。追加しようとする図形が選択セットに含まれている場合、ssaddは無視されてエラーにはなりません。

引数をすべて省略して中身がない空のセットを作成することも。図形名だけ与えた場合はその図形を含む新しい選択セットを作成できます。

ssaddの構文

ssaddの構文と引数、返り値は次のとおり。

selection-set_image5-1

以下のプログラムは作成した円を既存の選択セットに追加します。

(setq ss (ssget))
(command “circle” (list 0 0) “D” 5)
(ssadd (entlast) ss)

entlastは最後に作成した図形の図形名を取得できるAutoLISP関数です。作成した円の図形名を変数ssの選択セットに追加します。

選択セットから図形を取り除くAutoLISP関数「ssdel」

ssdelは既存の選択セットから図形を取り除くAutoLISP関数です。

図形を取り除いた新しい選択セットを返すのではなく、既存の選択セットそのものから取り除くので注意してください。選択セットに含まれていない図形を取り除こうとした場合はnilを返します。

はこ
はこ

選択セットから取り除かれるだけで、図形自体は削除されません。

ssdelの構文

ssdelの構文と引数、返り値は次のとおりです。

selection-set_image6-1

以下のプログラムは、最後に作成した図形を既存の選択セットから取り除きます。

(setq ss (ssget))
(ssdel (entlast) ss)

entlastで最後に作成した図形の図形名を取得しています。選択セット内に図形が含まれていない場合はnilを返します。

選択セット内の図形を数えるAutoLISP関数「sslength」

sslengthは選択セットに含まれる図形の数を取得するAutoLISP関数です。中身がない空の選択セットの場合は0を返します。空の選択セットはnilとは異なるので注意してください。

はこ
はこ

空の選択セットは前述したssaddで作成できます。

sslengthの構文

sslengthの構文と引数、返り値は以下のようになります。

selection-set_image7-1

図面全体にある図形の数を知りたいときは次のようにプログラムを書いてください。

(setq ss (ssget “X”))
(sslength ss)

図形の数が3つの場合は整数の3を返します。図形が何もないときは0が返り値となります。

選択セットに含まれる図形か調べるAutoLISP関数「ssmemb」

ssmembとは対象の図形が選択セットに含まれているか調べるAutoLISP関数のこと。選択セットに含まれている場合は対象の図形名を返し、含まれていないときはnilを返します。

ssmembの構文

ssmembの構文と引数、返り値は以下のとおり。

selection-set_image8-1

次のプログラムは、最後に作成した図形が特定の範囲内に作成されたものか調べることができます。

(setq pt1 (list 5 5))
(setq pt2 (list 10 10))
(setq ss (ssget “W” pt1 pt2))
(ssmemb (entlast) ss)

(5,5)と(10,10)を対角とする範囲の窓選択によって、範囲内に含まれる図形だけで選択セットを作成します。その選択セットとentlastの返り値をssmembに与えることで、最後に作成した図形の図形名が選択セット内に含まれているか判定できます。

判定の結果から処理を分岐させたい場合は、ifというAutoLISP関数を使ってください。
>>【初心者向け】処理を自由に切り替えよう!条件分岐のAutoLISP関数2選

選択セットを使ってAutoCADを効率化しよう

selection-set_image-last

今回ご紹介した選択セットを操作するAutoLISP関数を以下にまとめます。

関数構文内容
ssget(ssget [検索方法] [座標1] [座標2] [座標リスト] [フィルターリスト])条件を満たす図形で選択セットを作成する
ssname(ssname 選択セット 要素番号)選択セットから図形名を取得する
ssadd(ssadd [図形名 [選択セット]])既存または新規の選択セットに図形を追加する
ssdel(ssdel 図形名 選択セット)既存の選択セットから指定の図形を取り除く
sslength(sslength 選択セット)選択セットに含まれる図形の数を取得する
ssmemb(ssmemb 図形名 選択セット)選択セットに指定の図形が含まれているか調べる

選択セットを活用すると複数の図形をまとめて操作できるため、AutoCADの効率化につながります。さまざまな場面で使える便利なツールなので、使い方をしっかりマスターしてください。

AutoLISPの基礎を書籍で学びたい方には「AutoCAD 自動化攻略読本」がおすすめ。初心者向けに解説されており、AutoLISP以外の自動化方法も学べるお得な一冊。とにかくAutoCADで楽をしたい方はぜひご覧ください。

>>【AutoLISPの教科書】AutoCAD自動化攻略読本のメリット5選|おすすめ活用法も解説

AutoCADが楽になるプログラムを作成します AutoCADを効率化して面倒な作業から解放されましょう!

-AutoLISP関数, 関数解説