edit_box は、文字列をユーザー入力する編集ボックス付きのダイアログボックスを入れるDCLです。
get_tileはダイアログボックスの値を取得するAutoLISPです。
入力した文字列をコマンドラインに表示するコマンド
ここに、getstring でユーザー入力した文字列を、変数TXに入れて、princ コマンドラインに表示するコマンドがあります。
(defun c:test ()
(setq TX (getstring "文字を入力:"))
(princ (strcat "入力された文字:" TX))
(Princ))
このgetstring部分をダイアログボックスにします。
編集ボックス タイル edit_box
:edit_box{ } で、文字をユーザー入力できる編集ボックスタイルがダイアログボックスに表示されます。
編集ボックス ダイアログボックス
DCL プログラム
TestDB :dialog
{label = "TEST EDIT_BOX";
//--------------------------------------------------------
:edit_box{ key = "TX";}
//--------------------------------------------------------
ok_cancel;
}
:edit_box{ key = “TX”;}
edit_boxで、編集ボックスを置き、キー名を”TX”に設定しました。
以下のAutoLISPプログラムで呼び出すので、JagaDCL.dclという名前で、サポートファイルの検索パス内のフォルダに保存してください。
AutoLISP プログラム
(defun c:test (/ dcl_id Act TX)
(setq dcl_id (load_dialog "JagaDCL.dcl")) ;
(if (not (new_dialog "TestDB" dcl_id))
(progn
(princ "***ダイアログボックスが見つかりません***")
(exit)
));if
;-----------------------------------------------------------
;-----------------------------------------------------------
(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 "入力された文字:" TX))
);act1
);cond
;----------------------------------------------------------
(princ))
;===========================================
(defun Test_GetVar ()
(setq TX (get_tile "TX"))
)
;===========================================
(action_tile “accept” “(Test_GetVar)(done_dialog 1)”)
キーがacceptのタイルはok_cancel;で定義したOKボタンです。
今回は、OKボタンが選択されたときに、done_dialogでダイアログボックスを閉じる前に、関数 Test_GetVar を実行するようになっています。
(defun Test_GetVar ()
(setq TX (get_tile “TX”))
)
そして、これが、その関数 Test_GetVarです。
get_tileは、ダイアログボックスの値を取得する関数です。
引数はキー名です。
今回は、編集ボックスのキー名“TX”を設定していて、変数TXに入れました。
((= Act 1) (princ (strcat “入力された文字:” TX))
Actが1の時。つまりOKボタンでダイアログボックスが閉じられた後、入力された文字をコマンドラインに表示します。
例)ブロックの名前を変更するコマンド
使用例として、ブロックの名前を変更するコマンドを作ります。
元のコマンドは、
(defun c:test ( / Obj CuNm NwNm)
(vl-load-com)
(setq Obj (car (entsel "ブロックを選択:")))
(setq CuNm
(vla-get-Effectivename
(vlax-ename->vla-object
(car
(entsel "\n名前を変更するブロックを選択 :")
))));setq
;----------------------------------------------------------
(setq NwNm (getstring "新しいブロック名を入力:"))
;----------------------------------------------------------
(command-s "._RENAME" "_B" CuNm NwNm )
(princ))
このユーザー入力部分の
(setq NwNm (getstring “新しいブロック名を入力:”))
をダイアログボックスにしてこのコマンドに組入れます。
DCL
- ダイアログボックス名 TestDB
- タイトル:New Name
- 編集ボックス (キー名はNwNm)
- Ok/Cancel ボタン
TestDB :dialog
{label = "New Name";
//--------------------------------------------------------
:edit_box{ key = "NwNm";}
//--------------------------------------------------------
ok_cancel;
}
AutoLISP
上記のDCLは、JagaDCL.dclという名前で、サポートファイルの検索パス内にあるフォルダに保存してください。
dclを読み込んで、ダイアログボックスを出し、タイルNwNmから、値を取得して変数NwNmに入れるAutoLISP、関数名 RenameDBです。
(defun RenameDB (/ dcl_id Act)
(setq dcl_id (load_dialog "JagaDCL.dcl")) ;
(if (not (new_dialog "TestDB" dcl_id))
(progn
(princ "***ダイアログボックスが見つかりません***")
(exit)
));if
;-----------------------------------------------------------
;-----------------------------------------------------------
(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 "ユーザーキャンセル")(exit))
((= Act 1) (princ NwNm))
);cond
;----------------------------------------------------------
(princ));defun
;================================
(defun Test_GetVar ()
(setq NwNm (get_tile "NwNm"))
)
;================================
そして、定義した関数RenameDBを組み込んだ、ブロックの名前を変更するコマンドです。コマンド名はTestです。
defun C:Test (/ Nm NwNm)
(setq Nm
(vla-get-Effectivename
(vlax-ename->vla-object
(car
(entsel "\n名前を変更するブロックを選択 :")
))));setq
(RenameDB)
(command "._RENAME" "_B" Nm NwNm)
(princ));defun
これは編集ボックスの使用例でシンプルにしましたが、コマンドとして使うには、空振り対策や、ブロックのみを選択できるようにフィルタをかけたり、ダイアログボックスに現在のブロック名が出た方が使いやすいです。
改良が加わったサンプルコマンドです。
まとめ
- edit_boxタイルは、編集ボックス で文字列をユーザー入力できる。
- 関数 get_tileで、ダイアログボックスの値を受け取る。
Comments