整数を文字列にする関数 itoa の紹介です。
予備知識
AutoLISPでは、文字列と数字を区別します。”” がついた ”1″ は文字列で、1 は数字です。数字が引数として欲しい関数に文字列を渡しても、文字列が欲しい関数に数字を渡してもエラーが起きます。
詳しくはコチラの記事を
変換関数 itoa
AutoLISP itoa は、整数を文字列にする関数です。
引数として、整数を渡せば、文字列にしてくれます。
例えば、(itoa 1) と、数字の1を引数として渡すと、”1″ と文字列に変換された1が戻り値になります。
使用例
コマンドの内容
コチラの記事で使った、図形の色を変更、図形の色番号はグローバル変数に保存するコマンドを使います。
(defun c:test (/ Obj)
(if (null g00ChCol)
(setq g00ChCol (acad_colordlg 1)) ; 色選択ダイアログボックスを出して色をユーザ選択
);if
(setq Obj (car(entsel))) ; 色を変える図形をユーザ選択
(command-s "._CHANGE" Obj "" "_P" "_C" g00ChCol "") ; コマンドで選択された図形を選択された色にする
(princ))
内容は、
- 変数g00ChColに色番号が入っていなければ、色選択ダイアログボックスを開いて、色番号をユーザ選択し、その色番号をg00ChColに入れる。
- 図形をユーザー選択。
- 選択された図形をg00ChColに入っている色番号の色に変更。
です。
g00ChColに値が入れば、これはグローバル変数なので、2回目以降は色はユーザー選択なしで同じ色になります。
が、何色を選択したのか覚えていないことも考えて、色選択ダイアログボックスは出さないけれど、現在何色に設定しているのか表示した方が親切です。
“プロンプト” は、ユーザーに何をして欲しいか伝えるメッセージのことです。
entsel で図形選択をするとき何も引数を入れなければ、”オブジェクトを選択”とプロンプトがでますが、ここに色番号を追加したいと思います。
プロンプトを変更したAutoLISPプログラム
(defun c:test (/ Obj)
(if (null g00Col)
(setq g00Col (acad_colordlg 1)) ; 色選択ダイアログボックスを出して色をユーザ選択
);if
(setq msg (strcat "色を変える図形を選択 <" (itoa g00Col) ">:"))
(setq Obj (car(entsel msg))) ; 色を変える図形をユーザ選択
(command-s "._CHANGE" Obj "" "_P" "_C" g00Col "") ; コマンドで選択された図形を選択された色にする
(princ))
プロンプトを変えたコマンドプログラムです。
機能は変わりませんが、図形選択の時のプロンプトが
色を変える図形を選択 <1> :
になりました。
関数 entsel の引数はプロンプト(文字列)
g00ChColに入る情報(色選択ダイアログボックスの戻り値)は数値です。しかし、entsel に引数として渡せるのは文字列のみです。
そこで、itoa で色番号を文字列にする必要があります。
(itoa g00ChCol) で、色番号の文字列バージョンが戻り値になります。
ちなみに、(command-s…… ) の部分で渡す色番号は文字でも数字でもいいです。
引数として渡すと、初期値の”オブジェクトを選択”は使われずに引数の文字列だけになります。
図形選択の部分を、(setq Obj (car(entsel (itoa g00ChCol ))))) とすると、色番号だけがプロンプトになってしまうので、他の文字も入れましょう。
関数 strcat
関数strcat は、文字列をつなげる関数です。
現在のg00ChColが1の場合、
- “色を変える図形を選択 <“
- (itoa g00Col)
- “>:”
の3つの文字列を合わせて、
色を変える図形を選択 <1> :
という文字列を作るには
(strcat “色を変える図形を選択 <“ (itoa g00Col) “>:”)
で出来ます。
これを変数msg に入れて図形選択時のプロンプトにすると
(setq msg (strcat "色を変える図形を選択 <" (itoa g00Col) ">:"))
(setq Obj (car(entsel msg)))
となります。
変数msgを介さずに、
(setq Obj (car(entsel (strcat "色を変える図形を選択 <" (itoa g00Col) ">:"))))
とひとまとめにしても同じです。
まとめ
- AutoLISP では、”” がついた ”1” は文字列。1 は数字。
- 関数 entsel に引数(文字列)と付けるとその引数がプロンプトになる。
- 関数 itoa は、整数を文字列に変換する機能がある。
- 関数 strcat は、複数の文字列をつなげる機能がある。
Comments