legend.nsc が起動する外部プログラムは legend.exe です。
まず legend.exe が必要とする現在の 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.exe)固有のフォーマッ
トになります。このファイルの中身は現在の Ngraph のデータファイルの設定状況
をリストした
1
demo1.dat
1
2
mark
の様なものになります。次に
SCRIPT=${system:0:temp_file}
で legend.exe の出力用に別のテンポラリファイル名を取得し、変数SCRIPT
に格納しています。後にこのファイルが Ngraph マクロスクリプトとして実行
されます。従って、このファイルの中身はマクロスクリプトの文法に則ってい
なければなりません。
legend.exe "$DATALIST" "$SCRIPT"
ここで外部プログラム legend.exe を起動しています。legend.exe は コマン
ドラインの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)
を削除します。
アドインスクリプトの中からデータを直接扱う事もできます。その例として
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 の値は不定となりますが、その代わり軸の設定がなさ
れていなくてもエラーにはなりません。