ポップアップリストの設定はリスト操作でもっと簡単便利にすることができます。
ここでいう”リスト操作”は関数listで作るリストのことです。
ポップアップリストをリスト操作、ややこしくてすみません。
予備知識
この記事に出てくるポップアップリストの設定の仕方を変えます。
リスト操作について。
ポップアップリスト設定のおさらい
A B C 3つの選択肢があるポップアップリストのダイアログボックスを作ります。
okボタンを押すと、選択肢がコマンドラインに表示されます。
ポップアップリストとは
プルダウンメニューで選択肢が出てくるタイルで、選択肢の中から1つだけ選ぶものにつかいます。
ポップアップリストを表示させる DCL
Test_PopUpList :dialog
{label = "Pop Up List";
//--------------------------------------------------------
:popup_list {key="PL";}
//--------------------------------------------------------
ok_cancel;
}
リスト操作なしの場合のAutoLISP
上記のDCLが、JagaDCL.dclという名前で、サポートファイルの検索パス内にあるフォルダに保存してあること前提のAutoLISPプログラムです。
(defun c:test (/ dcl_id Act PL Op)
(setq dcl_id (load_dialog "JagaDCL.dcl")) ;
(if (not (new_dialog "Test_PopUpList" dcl_id))
(progn
(princ "***ダイアログボックスが見つかりません***")
(exit)
));if
;-----------------------------------------------------------
;************************************************************
;***ポップアップリストに選択肢を入れる************************
;***この部分を書き換えます************************************
(start_list "PL")
(add_list "A")
(add_list "B")
(add_list "C")
(end_list)
(set_tile "PL" "0")
;***********************************************************
;-----------------------------------------------------------
(action_tile "accept" "(Test_GetVar)(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
;-----------------------------------------------------------
(setq Act (start_dialog))
(unload_dialog dcl_id)
;-----------------------------------------------------------
(cond
((= Act 0) (princ "ユーザーキャンセル"))
((= Act 1) (princ (strcat "選択したのは:" Op))
);act1
);cond
;----------------------------------------------------------
(princ))
;===========================================
(defun Test_GetVar ()
(setq PL (get_tile "PL"))
;********************************************************
;***ダイアログボックスから受け取った順番から選択肢に変換***
;***この部分も書き換えます********************************
(cond
((= PL "0") (setq Op "A"))
((= PL "1") (setq Op "B"))
((= PL "2") (setq Op "C"))
);cond
;*********************************************************
);defun
関数 list と mapcarを使って設定
選択肢を設定
ポップアップリストを設定するために3つのAutoLISP関数があります。
start_list で始まり、add_list で選択肢を足して、end_listで終わります。
キーが”PLのタイルに選択肢 A B C を設定するコードです。
(start_list "PL") (add_list "A") (add_list "B") (add_list "C") (end_list)
今回はこの部分で何度もadd_listを使わずに、選択肢をリストにしてmapcar を使って一気に設定します。
(setq Lst '("A" "B" "C")) (start_list "PL") (mapcar 'add_list Lst) (end_list)
これで、同じように3つの選択肢がポップアップリストに設定されます。
ポップアップリストの初期値を設定
set_tileで初期値をセットします。
値そのものではなく順番を入れます。
DCLとやり取りするときは数値ではなくすべて文字列です。
関数 vl-position は、要素がリストを渡すと、その要素がリストの何番目にあるのか数値を戻します。
初期値にセットしたい値が決まっている時は、関数 vl-positionを使うと便利です。
ここでは値をグローバル変数gVarの値が初期値、もし、変数gVarに値が入っていなければ “A” が初期値になるようにした例です。
vl-positionで戻るのは数値なので、文字列に変換する関数itoa を使います。
(if (null gVar) (setq gVar "A")) (setq Num (itoa (vl-position gVar '("A" "B" "C")))) (set_tile "PL" a)
これで、すでにgVar に値が入っていればその値初期値、何も入っていなければAが初期値としてポップアップリストに表示されます。
値を受け取る 関数 nth
OKボタンが押されるとget_tileで値を受け取ります。
get_tileで値を受け取るときも、値ではなく順番が文字列で戻ります。
なので、順番から値に変換するコードが必要です。
ここでも最初にLstに入れた選択肢リストが活用できます。
(setq PL (atoi (get_tile "PL"))) (setq gVar (nth PL Lst))
get_tile で受け取る値は、ポップアップリストの順番が戻りますが、これは文字列です。
関数nth は数値でなくてはいけないのでatoiで文字列を整数に変更します。
その整数をnthに当てはめて、Lstに入っている選択肢リストから、その順番にある値をグローバル変数gVarに入れます。
リスト操作を使ったAutoLISP
(defun c:test (/ dcl_id Act Lst Num)
(setq dcl_id (load_dialog "JagaDCL.dcl")) ;
(if (not (new_dialog "Test_PopUpList" dcl_id))
(progn
(princ "***ダイアログボックスが見つかりません***")
(exit)
));if
;***********************************************************
(if (null gVar) (setq gVar "A"))
(setq Lst '("A" "B" "C"))
(start_list "PL")
(mapcar 'add_list Lst)
(end_list)
(setq Num (itoa (vl-position gVar Lst)))
(set_tile "PL" Num)
;**********************************************************
(action_tile "accept" "(Test_GetVar)(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
;-----------------------------------------------------------
(setq Act (start_dialog))
(unload_dialog dcl_id)
;-----------------------------------------------------------
(cond
((= Act 0) (princ "ユーザーキャンセル"))
((= Act 1) (princ (strcat "選択したのは:" gVar))
);act1
);cond
;----------------------------------------------------------
(princ))
;===========================================
(defun Test_GetVar ( / PL )
;**************************************
(setq PL (atoi (get_tile "PL")))
(setq gVar (nth PL Lst))
;**************************************
)
関数 foreach を使った場合
この、add_list を繰り返す操作をforeachにする方法もあります。
(setq Lst '("A" "B" "C")) (start_list "PL") (foreach n Lst (add_list n)) (end_list)
どの方法を使っても結果は同じなので、わかりやすいものを使ってください。
リスト操作を使う利点は、 選択肢の変更がリストの変更で済むことです。
選択肢を増やすときにリストの要素を増やすだけだし、状況に応じて選択肢が違うポップアップリストを作ることもできます。
まとめ
- DCLタイルの :popup_list はポップアップリストを表示させる。
- AutoLISP関数 start_list add_list end_list でポップアップリストに入れる選択肢を定義する。
- set_tile で設定する初期値は選択肢ではなく0から始まる順番を指定する。
- get_tileでダイアログボックスから受け取る値も、選択肢ではなく順番。
- DCLとやり取りするときは数値ではなく文字列。選択肢の順番にも” ”を付ける。
- リスト操作を加えると設定がシンプルになる。
- リスト操作では順番は数値、DCLでは文字列になるので、必要に合わせてitoaで整数を文字列に変更したり、 atoiで文字列を整数に変換する。
関連記事
文字列と数値の違いについて
Comments