こんにちは!はこです。
AutoLISPを独学し、5年以上業務で使用しています。
AutoLISPってなに?という方はまずこちらの記事をご覧ください。
AutoCADユーザーがAutoLISPを覚えるべきメリット3選
今回の記事では関数「subst」について解説していきます。
AutoLISPではリストと呼ばれる複数のデータを入れる箱が存在します。
リストの要素(リストの中身)を取り出したり、追加したりして様々な処理を行いますが、substは要素の置換を行うことができる便利な関数です。
使用例を交えて解説していきますのでぜひご覧ください。
【AutoLISP】リストの要素を置換する関数「subst」
substの動作
リストの要素を取得する関数はいくつかありますが、substは要素の置換ができる貴重な関数です。図形定義データの書き換えで使用することが多く、編集作業の自動化に大きく役立ちます。
図形定義データが分からないという方はこちらの記事をご覧ください。
図形編集を自動化しよう!AutoLISPの図形名関数を解説
substで置換を行うためには次の3つの引数が必要になります。
- 置換後の要素
- 置換対象の要素
- 対象のリスト
以下の連想リストを例にsubstの動作を説明していきます。ちなみに、連想リストとは2つの要素からなるリストを要素に持つリストのことです。
;;;置換前の連想リスト
((10 . "aa") (20 . "bb") (20 . "bb"))
先頭要素の(10 . "aa")を(40 . "dd")に置換する場合を考えます。対応する引数は次のとおりです。
- 置換後の要素 ⇒ (40 . "dd")
- 置換対象の要素 ⇒ (10 . "aa")
- 対象のリスト ⇒ ((10 . "aa") (20 . "bb") (20 . "bb"))
まず、置換前の連想リストをlistとconsを使って作成し、変数lstへ格納します。
listとconsについて知りたい方はこちらの記事をどうぞ。
【AutoLISP】リストを作成する関数「list」「cons」
;;;連想リストの先頭要素を置換
(setq lst (list (cons 10 "aa") (cons 20 "bb") (cons 20 "bb")))
(subst (cons 40 "dd") (cons 10 "aa") lst)
置換後の要素が(40 . "dd")、置換対象の要素が(10 . "aa")のためそれぞれを引数に指定し、最後に対象リストである変数lstを記述します。
この場合、置換後の連想リストは下記のようになります。
;;;置換後の連想リスト
((40 . "dd") (20 . "bb") (20 . "bb"))
置換後と置換前を比較すると、先頭要素のみ変更されていることが分かります。
また、substは対象リストの該当する要素すべてを置換します。そのため、上記の例で置換対象の要素を(20 . "bb")とした場合は2番目だけでなく3番目の要素も置換されるので注意が必要です。
;;;置換対象を(20 . "bb")とした場合の置換後の連想リスト
((10 . "aa") (40 . "cc") (40 . "cc"))
substの書式
substの構文と引数および返り値を箇条書きにまとめましたので参考にしていただけると幸いです。
- (subst new-item old-item lst)
- new-item
- 置換後の要素。
- old-item
- リスト内に存在する置換される側の要素。
- lst
- 置換を行うリスト。
- リスト
- lst内に存在するすべてのold-itemをnew-itemに置換したリストが返る。lst内にold-itemが存在しない場合はlstをそのまま返す。
まとめ
今回のまとめ
- substはリストの要素を置換できる
- リスト内で該当する要素はすべて置換される