AutoLISP入門 関数紹介

【ssget】複数の図形をまとめて編集!選択セットを操作するAutoLISP関数6選

選択
  • 複数の図形をまとめて編集したい
  • 条件に合う図形だけ選択したい
  • 選択セットを操作できる関数が知りたい

複数の図形をまとめて編集するには、編集したい図形のみ選ぶ必要があります。しかし、大量の図形からほしい図形だけを、楽に選ぶ方法が分からずお困りではないでしょうか。

そんな方には「選択セット」の活用をおすすめします。

はこ
はこ

選択セットとは簡単に言うと、複数の図形を1つにまとめたものです。

私はAutoLISPを独学し、業務の自動化・効率化に役立つプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。

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

当記事では選択セットを操作する関数について解説します。1つずつ使用例を交えて解説するので、誰でも選択セットを使いこなせるようになります。複数の図形をまとめて編集できれば、めんどくさい作業からの解放も夢ではありません。

選択セットを上手に使って、AutoCADの自動化・効率化を目指しましょう。

選択セットはssgetという関数で作成できます。ssnameは選択セットから図形名を取得できる関数です。

選択セットに図形を追加したい場合はssadd、除去したい場合はssdelを使ってください。選択した図形の数を知りたいならsslength、指定の図形が含まれているか検索したいときはssmembを活用します。

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

ss-image1

選択セットとは?

選択セットとは、図面上で選択した複数の図形を、1つのグループにまとめたもの。英語では「Selection Set」と表現されるため、選択セットと呼ばれています。
>>概要 - オブジェクトの選択と選択セット(AutoLISP)|AUTOCAD 2018 ヘルプ

選択セットはほしい図形だけを1つにまとめられるので、編集のたびに図形を探す手間がはぶけます。今回ご紹介する関数を使うことにより、選択セット内の図形が編集しやすくなるので、編集の効率化に大きく役立ちます。

たとえば、選択セットから図形名を取得する関数と、繰り返し関数の組み合わせ。選択セット内の全図形をまとめて編集できるため、手動の作業が削減されます。

ちなみに、AutoLISPの繰り返し関数について知りたい方はこちらの記事をご覧ください。
>>【AutoLISP】指定の回数だけ繰り返す関数「repeat」
>>【AutoLISP】条件を満たすかぎり繰り返す関数「while」

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

ss-iamge2

今回ご紹介する関数は以下の6つです。関数名の先頭についている「ss」は「Selection Set」の略称を表しています。

  • ssget
  • ssname
  • ssadd
  • ssdel
  • sslength
  • ssmemb

選択図形から選択セットを作成 ssget

ssgetは選択した図形から選択セットを作成する関数です。ssgetの構文と引数、返り値は以下のとおり。

(ssget [選択方法] [座標1] [座標2] [座標リスト] [フィルターリスト])  ※[]内は省略可能

引数内容
選択方法選択方法を指定する文字列(下表参照)
座標1選択範囲を示す四角形の頂点座標
座標2座標1と対角になる、選択範囲の頂点座標
座標リスト選択範囲を示す多角形の頂点座標をまとめたリスト
フィルターリスト選択図形を絞り込むための図形情報
返り値内容
選択セット図形が選択された場合は選択セットを返す
nil何も選択されなかったときはnilが返る

ssgetの特徴 図形の選択をコントロールできる

ssgetには次のような特徴があります。

  • フィルタ機能で選択する図形を絞り込める
  • 選択範囲の指定ができる

ssgetは選択したい図形の条件を引数に記述することで、選択する図形の絞り込みが可能。条件には数値の大小関係(<、>など)、論理演算(AND、ORなど)、ワイルドカード(*)を使用できます。

選択範囲は図面全体にしたり、座標を指定したりできるため、図形の選択を手動で行う必要がありません。

使用例① 「画層1」にある円で選択セットを作成する

画層名が「画層1」の画層から、円のみ選択して選択セットを作成する場合、プログラムは次のようになります。

(ssget (list (cons 8 "画層1") (cons 0 "circle")))

プログラム中のlistとconsは、リストと呼ばれるデータを作成する関数です。listとconsについて、もっと知りたい方はこちらの記事をご覧ください。
>>【AutoLISP】リストを作成する関数「list」「cons」

consのすぐ右側に記述している数字はグループコードです。グループコードとは、図形情報の各項目に割り当てられている、ラベルと考えてください。
>>AutoCAD 2011 ヘルプ - グループ コード(番号順)

はこ
はこ

8は画層名、0は図形の種類に対応しています。

上記のプログラムを実行して図形を選択すると、条件に当てはまる図形だけハイライトされます。

使用例② 半径が10以上の円を図面全体から選択する

半径が10以上の円を、図面全体から選択するプログラムは以下のとおりです。

(ssget "X" (list (cons -4 ">=") (cons 40 10)))

ssgetのすぐ右側に「"X"」と記述すると、図面全体から図形を選択できます。図面全体以外の選択方法については、以下の表を参考にしてください。

引数「選択方法」の記述例内容
(ssget)標準の方法でユーザーに図形の選択を求める
(ssget "X")図面内すべての図形を選択する
(ssget "P")直前に選択した図形を選択する
(ssget "L")最後に追加された図形を選択する
(ssget "C" p1 p2)四角形内または四角形と交差する図形を選択する
(ssget "W" p1 p2)四角形内の図形を選択する
(ssget "F" (list p1 p2))線分に交差する図形を選択する
(ssget "CP" (list p1 p2 p3 p4))多角形内または多角形と交差する図形を選択する
(ssget "WP" (list p1 p2 p3 p4))多角形内の図形を選択する

比較の演算子を使うときは、「-4」という特殊なグループコードを必ず記述します。今回の例で「-4」の右側に記述している「">="」は「以上」を表す演算子です。

グループコードの40は円の半径に対応しているため、上記のプログラムは図面全体から半径10以上の円を選択することができます。

「">="」以外の比較演算子については、次の表をご覧ください。

演算子内容
"*"ワイルドカード(すべてのもの)
"="等しい
"!="等しくない
"/="等しくない
"<>"等しくない
"<"より小さい
"<="以下
">"より大きい
">="以上

使用例③ 半径が10または15の円で選択セットを作成する

半径が10または15の円だけ選択して、選択セットを作成するプログラムは次のようになります。

(ssget (list (cons -4 "<or") (cons 40 10) (cons 40 15) (cons -4 "or>")))

「"<or"」と「"or>"」は「いずれか」を表す論理演算の演算子です。論理演算の演算子を使用するときは、使用例②と同様に-4のグループコードが必須。

「-4」の右側に記述している「"<or"」は条件の始まりを指し、「"or>"」は条件の終わりを表しています。選択したい図形の条件は「"<or"」と「"or>"」のconsの間に記述してください。

上記のプログラムでは半径の情報を記述しているため、半径が10または15の円だけを選択できます。

他の論理演算については知りたい方は、次の表を参考にしてください。

始まりの演算子終わりの演算子内容
"<and""and>"すべての条件を満たす図形を選択する
"<or""or>"いずれかの条件を満たす図形を選択する
"<xor""xor>"2つの条件のうち、どちらかを満たす図形を選択する
"<not""not>"条件を満たさない図形を選択する

選択セット内の図形から図形名の取得 ssname

ssnameは選択セットに含まれる図形を1つ選び、選んだ図形の図形名を取得する関数です。ssnameの構文と引数、返り値を以下にまとめます。

(ssname 選択セット 要素番号)

引数内容
選択セット図形名を取得する選択セット
要素番号取得したい図形の要素番号
返り値内容
図形名要素番号に対応する図形の図形名を返す
nil 要素番号がマイナス、または要素番号に対応する図形がない場合はnilが返る

ssnameの特徴 要素番号が不可欠

ssnameの特徴は次の2つ。

  • 選択セット内の図形を要素番号で指定する
  • 要素番号は0から始まる

ssnameで取得できる図形名とは、図形1つ1つに付けられたラベルです。図形名は図形単体を特定するときに役立ちます。

要素番号とは図形が選択セットに追加された順番を表す数字のこと。要素番号は0から始まるため、要素番号の1は2番目に追加された図形と対応しています。

使用例 選択セットの先頭図形から図形名を取得する

選択セットへ最初に追加された図形から、図形名を取得するプログラムは次のように記述します。

(ssname ss 0)

変数ssには既存の選択セットが格納されていると考えてください。変数ssの後ろに記述しているのが要素番号です。上記の例では最初に追加された図形を指定するので、0を記述しています。

はこ
はこ

引数の順番に気を付けてください。選択セットが先です。

選択セットに図形を追加 ssadd

ssaddは既存の選択セットへ指定した図形を追加する関数です。ssaddの構文と引数、返り値は次のとおり。

(ssadd [図形名 [選択セット]]) ※[]内は省略可能

引数内容
図形名選択セットに追加する図形名
選択セット図形を追加する既存の選択セット
返り値内容
選択セット引数の図形名を追加した既存の選択セットを返す。引数を省略した場合は、空の選択セットが返る

ssaddの特徴 新規の選択セットを作成できる

ssaddには2つの特徴があります。

  • 追加する図形は図形名で指定する
  • 中身が空の選択セットを作成できる

追加する図形は図形名で指定するため、前述したssnameと組み合わせて使ってください。図形名を指定しない場合は、中身が空の選択セットを新規で作成できます。

使用例① 最後に作成した図形を選択セットに追加する

図面上で最後に作成した図形を、既存の選択セットへ追加するプログラムは次のように記述します。

(ssadd (entlast) ss)

前述したssnameの使用例と同様に、変数ssには選択セットが格納されていると思ってください。entlastは最後に作成した図形の図形名を返す関数です。

entlastについてはこちらの記事で解説していますので、参考にしてください。
>>図形編集を自動化しよう!AutoLISPの図形名関数を解説

変数ssの選択セットにentlastで取得した図形が追加され、変数ssの選択セットがssaddの返り値となります。

はこ
はこ

ssaddの場合、選択セットは最後に記述します。

使用例② 中身が空の選択セットを作成する

中身が空の選択セットを新規で作成したい場合、プログラムは以下のように記述してください。

(ssadd)

ssaddで新規の選択セットを作成する場合、引数の図形名と選択セットは不要です。中身が空なので、後述する選択セット内の図形数を返す関数では、数字の0を返します。

選択セットから図形を除去 ssdel

ssdelとは既存の選択セットから、指定した図形を除去する関数のこと。ssdelの構文と引数、返り値を以下にまとめます。

(ssdel 図形名 選択セット)

引数内容
図形名選択セットから除去する図形の図形名
選択セット図形を除去する選択セット
返り値内容
選択セット引数の図形名を除去した選択セットが返る

ssdelの特徴 図形そのものは削除されない

ssdelの特徴は次の2つです。

  • 除去する図形は図形名で指定する
  • 指定した図形そのものは削除されない

前述したssaddと同様に、選択セットから除去したい図形は図形名で指定します。選択セットから除去されるだけなので、図形そのものは図面上から削除されません。

ちなみに、図面上から図形を削除するにはentdelという関数を使います。entdelについて知りたい方はこちらを参考にしてください。
>>図形編集を自動化しよう!AutoLISPの図形名関数を解説

使用例 最初に追加した図形を選択セットから除去する

最初に追加した図形を、選択セットから除去するプログラムは次のとおりです。

(setq figname (ssname ss 0))
(ssdel figname ss)

要素番号が0の図形から図形名を取得して、変数fignameへ格納します。変数ssには既存の選択セットが格納されていると考えてください。

ssdelでは変数fignameの図形が変数ssから除去されるため、最初に追加した図形を選択セットから除去することができます。

はこ
はこ

ssaddと同様に、選択セットは最後に記述してください。

選択セット内の図形を数える sslength

sslengthは既存の選択セットに含まれる、図形の数を返す関数です。sslengthの構文と引数、返り値は以下のとおり。

(sslength 選択セット)

引数内容
選択セット含まれている図形の数を調べる選択セット
返り値内容
整数選択セット内に含まれている図形の数を返す

sslengthの特徴 0以上の整数を返す

sslengthには2つ特徴があります。

  • 返す数値は整数
  • 選択セットの中身が空の場合は0を返す

sslengthは図形の数を返す関数なので、返り値は0以上の整数となります。引数が選択セットでない場合、エラーで処理が止まってしまうため注意してください。

使用例 選択セット内の図形の数だけ同じ処理を繰り返す

選択セット内の図形の数だけ、同じ処理を繰り返すプログラムは次のようになります。

(repeat (sslength ss)
  (print "LISPで楽になる")
)

repeatは指定の数だけ同じ処理を繰り返す関数です。repeatについてはこちらの記事をご覧ください。
>>【AutoLISP】指定の回数だけ繰り返す関数「repeat」

変数ssは既存の選択セットを表しています。sslengthが返す整数が繰り返しの回数となるため、選択セット内の図形の数だけ処理の実行が可能。

”LISPで楽になる"という文字列が、繰り返しの数だけコマンドライン上に表示されます。

選択セットに指定した図形が含まれているか検索 ssmemb

ssmembは既存の選択セット内に、指定した図形が含まれているか検索する関数です。ssmembの構文と引数、返り値を以下にまとめますので、参考にしてください。

(ssmemb 図形名 選択セット)

引数内容
図形名選択セット内を検索する図形の図形名
選択セット指定した図形を検索する選択セット
返り値内容
図形名図形が見つかった場合は検索対象の図形名を返す
nil図形が見つからなかったときはnilが返る

ssmembの特徴 図形名で検索する

ssmembの特徴は次の2つ。

  • 検索したい図形は図形名で指定する
  • 図形が見つかった場合、見つけた図形の図形名を返す

選択セット内に指定の図形を見つけた場合、見つけた図形の図形名を返します。図形が見つからなかったときは、nilが返り値となります。

引数が選択セットでなかったり、省略されていたりする場合、エラーとなって処理が止まってしまうので注意してください。

使用例 最後に作成した図形が選択セットに含まれているか検索する

最後に作成した図形が、既存の選択セットに含まれているか検索するプログラムは次のとおりです。

(ssmemb (entlast) ss)

前述したプログラムと同様、変数ssには既存の選択セットが格納されていると考えてください。entlastは最後に作成した図形の図形名を取得できる関数です。

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

最後に作成した図形が変数ssの選択セットに含まれていれば、ssmembはentlastで取得した図形名と同じ図形名を返します。含まれていない場合、ssmembの返り値はnilとなります。

選択セットを使いこなして図形の編集を楽にしよう

ss-image_last

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

関数内容
ssget選択した図形から選択セットを作成する
ssname 選択セット内の図形から図形名の取得する
ssadd選択セットに図形を追加する
ssdel選択セットから図形を除去する
sslength選択セット内の図形数を返す
ssmemb選択セットに指定した図形が含まれているか検索する

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

だれでも簡単にAutoCADを自動化

-AutoLISP入門, 関数紹介

AutoLISPのおすすめ書籍はコチラ
AutoLISPのおすすめ書籍はコチラ