アドイン
概要
Ngraph の[Add-in]-[Execute]メニューで登録されているアドインを
選ぶと Ngraph はそれを「Ngraphマクロスクリプト」として実行します。
アドインプログラムの登録は [Preference]-[Addin script]で行います。
以下のアドインプログラムは、Ngraph for X11 の配布状態で既に登録さ
れています。
- legend.nsc
-
凡例を自動生成する為のアドインスクリプトと実行ファイル。Tcl/Tkを使います
ので wish がインストールされている必要があります。「Mix:」をチェックすると、
ファイル名、Xカラム、Yカラムが同じデータをまとめて一つの凡例として扱うよう
になります。リストボックスからデータファイル名を選び、「Caption:」に凡例テ
キストを入力してください。デフォルトではデータファイル名がCaptionに使われます。
- fitrslt.nsc
-
フィッティングの結果の凡例を作成する為のアドイン。
「Expand」をチェックした場合、現在のフィット結果の数値をLegend-Text として生成しますので、フィット結果が変わっても Legend-Textは変更されません。
非チェックの場合にはLegend-Textのオブジェクト置換機能を使いますので、フィット結果が変われば、Legend-Textの内容も自動的に変化します。
- append.nsc
-
すでに読み込んであるグラフをクリアせずにNGPファイルを読み
込む為のアドインスクリプト。
- calc.nsc
-
任意関数の描画をする為のアドインスクリプトと実行ファイル。Tcl/Tkを使います
ので wish がインストールされている必要があります。等間隔データを作成し、デ
ータファイルとしてNgraph にセットし、数式変換機能を使って関数を描画します。
- math.nsc
-
電卓です。数式を入力すると答えを表示します。Ngraphの数式変換機能の関数が使え
ます。
- text-in.nsc
-
データファイルの指定したカラムを legend-text としてプロットデータ点の隣に挿
入するアドインスクリプト。データを扱うスクリプトの例です。
アドインプログラムはユーザが作成する事もできます。マクロロスクリプト
には Ngraph 内部の設定パラメター全てを参照、変更する機能が
ありますので、アドインプログラムは Ngraph の状態変数にアクセスして,現
在の Ngraph の状態を取得したり,変更したりすることができます。マクロス
クリプトだけでもかなりの事ができるのですが、ユーザインターフェースなど
の点から、独立した個々のプログラムを起動した方が効率が良い場合がありま
す。マクロスクリプトには外部プログラムを起動する機能がありますので、こ
れも可能ですが、その場合には
- どうのように外部プログラムに Ngraph の状態を知らせるか?
- 外部プログラムから、どの様に Ngraph の状態を変更させるか?
が問題となります。その簡単な一つの方法の例として legend.nsc を取り上げ、
以下で説明します。
legend.nsc の動作
legend.nsc が起動する外部プログラムは legend.tcl (Tcl/Tkスクリプト)です。
まず legend.tcl が必要とする現在の Ngraph の状態を記述した中間ファイルを
作成します。
DATALIST=${system:0:temp_file}
object file -instance > "$DATALIST"
get file:0-! -id -field file x y type >> "$DATALIST"
ここでは、system:0:temp_file でテンポラリファイル名を取得し、objectコマンド
で file (データファイル)のインスタンスの数を、get コマンドで各種設定パラメ
ターを取得し、テンポラリファイルに書き込んでいます。この中間ファイルのフォ
ーマットは起動する外部プログラム(今の場合には legend.tcl)固有のフォーマッ
トになります。このファイルの中身は現在の Ngraph のデータファイルの設定状況
をリストした
1
demo1.dat
1
2
mark
の様なものになります。次に
SCRIPT=${system:0:temp_file}
で legend.tcl の出力用に別のテンポラリファイル名を取得し、変数SCRIPT
に格納しています。後にこのファイルが Ngraph マクロスクリプトとして実行
されます。従って、このファイルの中身はマクロスクリプトの文法に則ってい
なければなりません。
wish legend.tcl "$DATALIST" "$SCRIPT"
ここで外部プログラム wish legend.tcl を起動しています(wish は Tcl/Tk のインタープリタで legend.tcl を解釈実行します)。legend.tcl は コマン
ドラインの1番目に指定されたファイルから Ngraph の状態を取得し、2番目
に指定されたファイルに変更すべき状態をマクロスクリプトとして出力する
ように設計されています。例えば "STRING" と言う legend-text を(0,0)に生
成するには、$SCRIPT のファイルの内容は
new text
text::x=0
text::y=0
text::text="STRING"
となります。このスクリプトを実行するのは
if [ -f "$SCRIPT" ];
then
new shell
shell::shell "$SCRIPT"
del shell
fi
です。ここで、変数 SCRIPT に格納したファイルが存在しいている場合(if文)
に、shell オプジェクトのインスタンスを生成(new)し、そのインスタンスに
そのファイルを解釈実行(shell)させ、最後に不要になったインスタンスを削
除(del)しています。
system:0:unlink_temp_file "$DATALIST"
system:0:unlink_temp_file "$SCRIPT"
最後に不必要になった中間ファイル($DATALIST)とスクリプトファイル($SCRIPT)
を削除します。
アドインスクリプトの形式
外部プログラムを起動するアドインスクリプトは、
... 外部プログラムに必要な中間ファイルを生成する ...
SCRIPT=${system:0:temp_file}
外部プログラム名 中間ファイル名 "$SCRIPT"
if [ -f "$SCRIPT" ];
then
new shell
shell::shell "$SCRIPT"
del shell
fi
system:0:unlink_temp_file "$SCRIPT"
となります。
もちろん、Ngraphの現在の状態を取得する必要がなければ、
SCRIPT=${system:0:temp_file}
外部プログラム名 "$SCRIPT"
if [ -f "$SCRIPT" ];
then
new shell
shell::shell "$SCRIPT"
del shell
fi
system:0:unlink_temp_file "$SCRIPT"
だけで十分です。
データを扱うアドインスクリプト
アドインスクリプトの中からデータを直接扱う事もできます。その例として
text-in.nsc を説明します。次のようなデータファイルが有るとします。
=====test.dat=========
0 0 sampleA
1 1 sampleB
2 2 sampleC
======================
第一カラムをx座標に、第二カラムをy座標にしたグラフを作成したとします。
Ngraphにはすでにtest.datが開いてあり、プロットタイプ "mark" でプロット
されているとします。ここで text-in.nsc を実行し、
"Input legend-text column" に 3 を入力すると、データ点の隣に第三カラム
のテキストをlegend-textとして挿入することができます。
このスクリプトでは、まず dialog オブジェクトを使って、legend-text のカラ
ム数を入力させ、変数(COLUMN)に代入します。
new dialog
COLUMN=${dialog::input:'Input legend-text column'}
del dialog
次に file オブジェクトの file::opendatac を使ってデータファイルを開き、
file::getdata でデータが無くなるまでデータを取得し、最後に
file::closedata でデータを閉じます。
file:0:opendatac
while file:0:getdata
do
... テキストの設定 ...
done
file:0:closedata
while ループの中では、まず text オブジェクトを生成します。
new text
また file::getdata を実行した時、データの数値は file::data_x, file::data_y
に入り、0.01mm単位での用紙上での位置は file::coord_x, file::coord_y に入
り、行番号は file::line に入ります。これらを用いて生成したtextの座標値を設
定しています。
text::x=${file:0:coord_x}
text::y=${file:0:coord_y}
また file::column を用いてカラムのトークンを取り出しています。file::column
の第一引数はファイルの行数で、file::line を使い、第二引数は取り出すカラム数
で変数 COLUMN の値を用いています。取り出したトークンを text::text に設定し
ます。
text::text=`get file:0 -field column:"${file:0:line} ${COLUMN}"`
ただし、file::column は呼び出される毎にファイルの先頭から走査して目的の文字
列を取得しますので、データファイルが大きい場合には動作が遅いです。
一般的にデータを扱うアドインスクリプトは、
file::opendatac
while file::getdata
do
... 目的の操作
file::data_x file::data_y file::coord_x file::coord_y file::line が使える
done
file::closedata
となります。file::opendatac の代わりに file::opendata を用いた場合、
file::coord_x, file::coord_y の値は不定となりますが、その代わり軸の設定がなさ
れていなくてもエラーにはなりません。