・ 変数の値を保持する
ユーザーの入力値等を変数に代入して、繰返し利用したいことがあります
この、変数の値を保持するには、いくつかの方法がありますが、その有効範囲、特徴を理解した上で、どの方法にするのがよいか検討する必要があります。
ローカル変数の利用
ローカル変数は、その関数内のみが有効範囲で、関数の実行が終了してしまえば、後は利用できません。
しかし、その関数自体が、 while 等で繰り返されるルーチンで作成されていれば、その関数を終了するまでは、繰返し利用できます。
グローバル変数の利用
グローバル変数は、編集中の図面が有効範囲で、関数の実行が終了しても、図面を閉じるまでは再利用が可能です。
ただ、グローバル変数は、他の関数で利用している変数とバッティングして思わぬ値が返ってきたりするので、きちんと変数名の管理をする必要があります。
また、あまり気にしなくてもいいかもしれませんが、メモリーもその分消費されます。
システム変数の利用
AutoCADには、あらかじめこういった用途のためにシステム変数が用意されています。
USERI1〜5、USERR1〜5、USERS1〜5、がそれで、それぞれ代入できる値のタイプが決まっています。
USERI は整数、USERR は実数、USERS は文字列 です。
また、USERI と USERR の保存先は図面ですから、図面を開きなおしても再利用可能ですが、USERS は保存されないので、図面を閉じた時点で失われます。
ただ、ほかのアドオンやプログラムがすでに利用しているかもしれないので注意。
同様に、実用性が最も低いので有名な?システム変数 MODEMACRO も使えるかもしれません。
レジストリ(環境変数)の利用
(setenv) (getenv) 関数を利用することで、Windowsのレジストリへ書き出したり、読み込んだりが可能です。
図面を閉じても、CADを終了しても値は保持されます。
HKEY_CURRENT_USER\Software\Autodesk\バージョンにより異なる\FixedProFile\Generalに保存されるらしい。
問題は、必要なくなったときに簡単に削除できないこと。
いちいち Regedit で編集しないといけません。
また、書き出せるのは文字列だけなので、データタイプの変換が必要な場合もあります。
TEXTファイルの利用
(read-line) (write-line) 等の関数を利用することで、TEXTファイルへ書き出したり、読み込んだりが可能です。
図面を閉じても、CADを終了しても値は保持されます。
問題は、TEXTファイルが行方不明にならないように管理すること。
読み込んだり書き出したりするのにデータタイプの変換が必要になる場合もあります。
ファイルの読み書きをするわけですから、処理は遅めです。(defun Jo_test_rw () ;textファイルの書き出し; (defun Jos_txt_write ( file_path ;textファイルのパス; lst_str ;文字列のリスト; / f ) (setq f (open file_path "w")) (while lst_str (write-line (car lst_str) f) (setq lst_str (cdr lst_str)) ) (close f);開いたファイルは必ず閉じること; ) ;textファイルの読み込み; (defun Jof_txt_read ( file_path ;textファイルのパス; / f str_line lst_str) (setq f (open file_path "r")) (while (and f (setq str_line (read-line f))) (setq lst_str (cons str_line lst_str)) ) (close f);開いたファイルは必ず閉じること; (reverse lst_str) ) (setq lst_str (Jof_txt_read "D:\\sample.txt")) (setq lst_str (reverse lst_str)) (Jos_txt_write "D:\\sample.txt" lst_str) (princ) )
ブラックボードの利用
(vl-bb-set) (vl-bb-ref) 関数を利用することで、ブラックボード名前空間が利用できます。
このブラックボードは、いずれのドキュメントにも、また VLX アプリケーションにも付属しない名前空間で、他の名前空間と変数の値を受け渡しするためのに提供されています。
CADを終了するまで、図面を開きなおしても値は保持されます。
問題は、vl関数なので、ACAD2000以後のみの対応です。
事前に (vl-load-com) は必須です。
データタイプの制限はありません。(while (not str_Jo_leader) (if (vl-bb-ref 'str_Jo_leader) (setq str_Jo_leader (getstring T (strcat "\n現在の注釈=" (vl-bb-ref 'str_Jo_leader) ":"))) (setq str_Jo_leader (getstring T "\n注釈:")) ) (cond ((/= "" str_Jo_leader) (vl-bb-set 'str_Jo_leader str_Jo_leader));ブラックボードへの書き込み; ((and (vl-bb-ref 'str_Jo_leader) (= "" str_Jo_leader)) (setq str_Jo_leader (vl-bb-ref 'str_Jo_leader)));ブラックボードから読み込み; (t (setq str_Jo_leader nil)) ) )