- 数値を文字列に、または文字列を数値に変換したい
- 複数の文字列をつなぎ合わせたい
- 文字列の一部を取り出したい
文字列(テキスト)を活用して便利なプログラムを作りたいけど、文字列を操作する方法が分からずお困りではないでしょうか。ユーザーとプログラムの橋渡しができるので、文字列を使いたい場面は多いはず。
私はAutoLISPを独学し、業務の自動化・効率化に役立つプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。
そもそもAutoLISPってなに?という方はこちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説
当記事では文字列を操作するAutoLISP関数をご紹介します。今回ご紹介する関数を覚えれば、文字列の扱いでつまずくことはありません。文字列の扱い方が分かると、ユーザーが理解しやすく使いやすいプログラムを作れます。
文字列を活用して、ユーザーに優しいプログラム作成を目指しましょう。
数値を文字列に変えたいなら、itoaまたはrtosを使用してください。文字列を数値にしたいときは、atoiまたはatofを使います。文字列を抽出するならsubstr、いくつかの文字列をつなぎ合わせたい場合はstrcatを活用しましょう。
アルファベットの大文字小文字の切り替えはstrcaseで実行できます。文字数を数えたいならstrlenを使用してください。
文字列を操作するAutoLISP関数8選
今回ご紹介するAutoLISP関数は次の8つ。どの関数も文字列の操作には欠かせない関数です。
- itoa/rtos
- atoi/atof
- substr
- strcat
- strcase
- strlen
数値を文字列に変換 itoa / rtos
itoaは整数を文字列に変換します。ただし、整数以外を引数にするとエラーとなるので注意してください。
rtosとは実数を文字列に変換する関数のこと。変換後の表記を指数や分数などに変更できるため、itoaよりも複雑な形式で数値を表現できます。
後述する文字列同士をつなぎ合わせる関数と組み合わせれば、ただの数値をユーザーが理解できるメッセージに変えることも。プログラムとユーザーをつなぐ重要な関数です。
ちなみに、itoaとrtosはマイナスの数値を文字列に変換することもできます。
itoaの構文 / 引数 / 返り値
itoaの構文と引数、返り値については下記をご覧ください。
(itoa 整数)
引数 | 内容 |
整数 | 文字列に変換する整数 |
返り値 | 内容 |
文字列 | 引数の整数を文字列に変換して返す |
rtosの構文 / 引数 / 返り値
rtosの構文と引数、返り値は下記のとおりです。
(rtos 実数 [表示形式 [精度]]) ※[]内は省略可能
引数 | 内容 |
実数 | 文字列に変換する実数 |
表示形式 | 1~5までの数字で返り値の表示形式を設定する。省略した場合はシステム変数LUNITSに従う >>LUNITS (システム変数) | AutoCAD | Autodesk Knowledge Network 1:指数表記 2:十進表記 3:工業図面表記(フィートと少数インチ) 4:建築図面表記(フィートと分数インチ) 5:分数表記 |
精度 | 小数点以下の桁数を表す整数。省略した場合はシステム変数LUPRECに従う >>LUPREC (システム変数) | AutoCAD | Autodesk Knowledge Network |
返り値 | 内容 |
文字列 | 引数の実数を文字列に変換して返す |
使用例① 図面上にある円の数を文字列に変換する
次のプログラムは、図面上に存在する円の数をitoaで文字列に変換します。
(setq ss (ssget "X" (list (cons 0 "circle"))))
(itoa (sslength ss))
1行目では図面全体から円だけを選択して、選択セットを作成しています。選択セットについてはこちらの記事を参考にしてください。
>>【ssget】複数の図形をまとめて編集!選択セットを操作するAutoLISP関数6選
作成した選択セットは変数ssに格納しています。2行目では、作成した選択セット内に含まれる図形の数を取得。図形の数はitoaによって文字列へ変換されます。
例えば、円の数が3つの場合の表示結果は以下のとおり。
図形の数が文字列として表示されるため、数値の両側には「"」が付いています。
使用例② 2点間の距離を文字列に変換する
以下のプログラムは、算出した2点間の距離をrtosで指数表記の文字列に変換します。
(setq p1 (getpoint "1点目を選択してください。"))
(setq p2 (getpoint "2点目を選択してください。"))
(rtos (distance p1 p2) 1 2)
1行目と2行目では、getpointでユーザーが指定した座標を取得しています。
getpointについてはこちらの記事を参考にしてください。
>>AutoCADに情報を取り込もう!AutoLISPのユーザー入力関数を解説
ユーザーが指定した座標を変数p1、p2に格納して、3行目のdistanceによって2点間の距離を算出します。今回のプログラムでは、指数表記を表す「1」と小数点以下の桁数を表す「2」を引数に記述しているため、表示結果は以下のようになります。
itoaと同様に、返り値の両側には「"」が付いています。
文字列を数値に変換 atoi / atof
atoiは文字列を整数に変換する関数です。引数が実数の文字列なら、整数部分だけが返り値となります。引数が数値以外の文字列の場合は、0が返り値になるのでエラーにはなりません。
atofとは文字列を実数に変換する関数のこと。引数が整数でも、返り値には小数点以下が表示されます。引数が数値以外の文字列なら、返り値は0.0になります。
atoiとatofは、マイナスの記号が付いた文字列も数値への変換が可能。文字列を抽出する関数と組み合わせることで、ユーザーが入力した文字列や、図面上のテキストから数値を取得できます。
atoiの構文 / 引数 / 返り値
atoiの構文と引数、返り値については下記をご覧ください。
(atoi 文字列)
引数 | 内容 |
文字列 | 整数に変換する文字列 |
返り値 | 内容 |
整数 | 引数の文字列が整数に変換される。引数が数値以外の文字列なら0が返る |
atofの構文 / 引数 / 返り値
atofの構文と引数、返り値は以下のとおりです。
(atof 文字列)
引数 | 内容 |
文字列 | 実数に変換する文字列 |
返り値 | 内容 |
実数 | 引数の文字列が実数に変換される。引数が数値以外の文字列なら0.0が返る |
使用例① 数値の文字列を整数に変換する
以下のプログラムは、数値の文字列を整数に変換します。
(atoi "12.34")
表示結果は次のとおり。
引数が実数の文字列でも、整数部分だけが数値として表示されます。
使用例② 数値の文字列を実数に変換する
次のプログラムは、数値の文字列を実数に変換します。
(atof "12")
表示結果は以下のとおり。
文字列の数値は整数ですが、atofで変換しているため小数点以下も表示されます。
文字列の一部を抽出 substr
substrは文字列から一部の文字列を抽出できる関数です。
文字列の抽出を開始する位置は、文字の順番(整数)で指定します。先頭の文字から抽出を開始したいときは、整数の1を引数に記述してください。抽出する文字数も整数で指定します。
注意点はAutoCADのバージョンや設定によって、全角文字の扱いが異なること。
全角1文字を半角2文字としてカウントする場合と、全角半角は関係なく1文字としてカウントする場合があります。同じ引数を指定しても、抽出の開始と抽出する文字数のカウントが異なるため、結果は同じになりません。
ちなみに、システム変数「LISPSYS」の値を書き換えると、全角文字の扱いを変更できます。ただし、デフォルトで使用するエディタが切り替わってしまうので注意してください。
>>LISPSYS (システム変数) | AutoCAD 2021 | Autodesk Knowledge Network
ご使用の環境で全角文字がどのようにカウントされるか、把握しておくことが大切です。
substrの構文 / 引数 / 返り値
substrの構文と引数、返り値は下記を参考にしてください。
(substr 文字列 抽出開始位置 抽出文字数)
引数 | 内容 |
文字列 | 抽出される側の文字列 |
抽出開始位置 | 抽出を開始する文字の位置。先頭の文字が1に対応している |
抽出文字数 | 抽出する文字の数 |
返り値 | 内容 |
文字列 | 引数から抽出した文字列 |
使用例 最後から3番目の文字を抽出する
最後から3番目の文字を抽出するプログラムは次のとおりです。
(setq str "abcdef")
(setq position (- (strlen str) 2))
(substr str position 1)
変数strには抽出される文字列、変数positionには抽出を開始する位置(整数)が格納されています。
strlenによって文字列全体の文字数を取得し、数値の2を引くことで最後から3番目の位置を算出。変数strと変数position、抽出する文字数である数値の1を記述することで、最後から3番目の文字を抽出できます。
表示の結果は下図のとおり。"abcdef"の最後から3番目の文字である"d"が表示されます。
抽出される文字に全角文字を含む場合は、文字数のカウントにご注意を。
複数の文字列をつなぎ合わせる strcat
strcatは複数の文字列を1つにつなぎ合わせる関数です。引数の文字列は記述した順番通りにつながるため、ユーザーへのメッセージやファイルのアドレスなど、長い文字列を作成するときに役立ちます。
文字列以外を引数にすると、エラーで処理が止まってしまうので注意してください。
strcatの構文 / 引数 / 返り値
strcatの構文と引数、返り値は次のとおりです。
(strcat 文字列 ・・・)
引数 | 内容 |
文字列 | つなぎ合わせる文字列。複数記述できる |
返り値 | 内容 |
文字列 | 引数を全てつなぎ合わせた1つの文字列を返す |
使用例 3つの文字列をつなぎ合わせる
3つの文字列をつなぎ合わせるプログラムは以下のようになります。
(setq str1 "図面上に円が")
(setq str2 "3")
(setq str3 "個以上あります。")
(strcat str1 str2 str3)
上記のプログラムを1行ずつ、コマンドラインへコピペした結果は次のとおり。
変数str1~str3までの文字列が順番につながり、1つの文字列として表示されています。変数str2の図形数を図面上から取得すると、より実用的なプログラムに近づきます。
図面上の図形数を取得する場合は、選択セットを活用してください。選択セットについてはこちらの記事で解説しています。
>>【ssget】複数の図形をまとめて編集!選択セットを操作するAutoLISP関数6選
アルファベットの大文字と小文字を切り替える stacase
strcaseはアルファベットの大文字と小文字を切り替える関数です。
strcaseには切り替えたい文字列と、大文字小文字のどちらに切り替えるか判別する引数が必要です。切り替えたい文字列にアルファベット以外の文字が含まれていても、アルファベット以外の文字には影響ありません。
切り替えの判別をする引数にnilを記述、または省略すると小文字は大文字に切り替わります。大文字を小文字に切り替えたいときは、引数にnil以外を記述してください。
strcaseの構文 / 引数 / 返り値
strcaseの構文と引数、返り値については以下をご覧ください。
(strcase 文字列 [引数1])
引数 | 内容 |
文字列 | アルファベットの大文字と小文字を切り替える文字列 |
引数1 | 大文字と小文字の切り替えを判別する nil以外:大文字→小文字 省略:小文字→大文字 |
返り値 | 内容 |
文字列 | 大文字と小文字が切り替わった文字列が返る。対象の文字がない場合は引数の文字列をそのまま返す |
使用例① アルファベットの大文字を小文字に切り替える
アルファベットの大文字を小文字に切り替えるプログラムは次のとおりです。
(strcase "AutoLISPで自動化" T)
切り替えの判別をする引数にnil以外を記述すると、大文字は小文字に切り替わるため、今回は「T」を記述しています。Tとは真(True)を表す定数のこと。nilではないという意味で使用しています。
AutoLISPでは真をT、偽をnilで表現します。
表示の結果は以下のとおり。
大文字が小文字に切り替わるので、"AutoLISP"は"autolisp"と表示されます。アルファベット以外の文字は変化しません。
使用例② アルファベットの小文字を大文字に切り替える
アルファベットの小文字を大文字に切り替えるプログラムは以下のようになります。
(strcase "AutoLISPで自動化")
小文字を大文字に切り替える場合は、切り替えの判定をする引数を省略してください。表示結果は次のとおりです。
小文字が大文字に切り替わるので、"AutoLISP"は"AUTOLISP"と表示されます。使用例①と同様に、アルファベット以外の文字は変化しません。
文字数を数える strlen
strlenは文字列の文字数を数える関数です。引数に複数の文字列を記述すると、記述した文字数の合計を取得することも。引数を省略した場合は0を返しますが、文字列以外を指定するとエラーになります。
前述したsubstrと同様に、AutoCADのバージョンや設定によって全角文字の扱い方が変わるため、全角文字のカウントには注意してください。全角1文字を半角2文字としてカウントする場合と、全角半角は関係なく1文字としてカウントする場合があります。
全角文字の扱い方は、システム変数「LISPSYS」で変更できます。ただし、デフォルトで使用するエディタが切り替わってしまう点には注意してください。
>>LISPSYS (システム変数) | AutoCAD 2021 | Autodesk Knowledge Network
strlenの構文 / 引数 / 返り値
strlenの構文と引数、返り値については下記のとおりです。
(strlen 文字列 ・・・)
引数 | 内容 |
文字列 | 文字数を数えたい文字列。複数記述できる |
返り値 | 内容 |
整数 | 文字列の文字数を整数で返す |
使用例 入力した文字列の文字数を数える
以下のプログラムでは、ユーザーが入力した文字列の文字数が分かります。
(setq str (getstring "文字列を入力してください。"))
(strlen str)
getstringはユーザーに文字列の入力を求める関数です。ユーザーに入力を求める関数については、以下の記事で解説しているので参考にしてください。
>>AutoCADに情報を取り込もう!AutoLISPのユーザー入力関数を解説
変数strに入力した文字列が格納され、strlenによって文字数が表示されます。例えば、"LISPで楽になる"と入力した場合、表示結果は次のとおり。
全角文字を1文字としてカウントしており、9文字の文字列なので結果は"9"となります。
全角文字のカウントは、バージョンや設定によって異なるので注意してください。
文字列を使いこなしてユーザーに優しいプログラムを作ろう
今回ご紹介した、文字列を操作するAutoLISP関数を以下にまとめます。
構文 | 内容 |
(itoa 数値) | 整数を文字列に変換する |
(rtos 数値 [表示形式]) | 実数を文字列に変換する 指数や分数など表示形式を変更できる |
(atoi 文字列) | 文字列を整数に変換する |
(atof 文字列) | 文字列を実数に変換する |
(substr 文字列 抽出開始位置 抽出文字数) | 文字列の一部を抽出する |
(strcat 文字列 ・・・) | 文字列を順番につなぎ合わせる |
(strcase 文字列 [引数1]) | アルファベットの大文字と小文字を切り替える |
(strlen 文字列 ・・・) | 文字列の合計文字数を数える |
文字列を活用する場面では、どれもとても重要で欠かせない関数です。ユーザーにとって使いやすく、便利なプログラムの作成に役立ててください。
AutoLISPの基礎を書籍で学びたい方には「AutoCAD 自動化攻略読本」がおすすめ。初心者向けに解説されており、AutoLISP以外の自動化方法も学べるお得な一冊。とにかくAutoCADで楽をしたい方はぜひご覧ください。