アドイン

- 概要
- legend.nscの動作
- アドインスクリプトの形式
- データを扱うアドインスクリプト

概要

> Ngraph の[アドイン]-[実行]メニューで登録されているアドインを選ぶと Ngraph はそれを「Ngraphマクロスクリプト」として実行します。 アドインプログラムの登録は [Preference]-[Addin script]で行います。 以下のアドインプログラムは配布状態で既に登録されています。
> legend.nsc
>   凡例を自動生成する為のアドイン。「Mix:」をチェックするとファイル名、Xカラム、Yカラムが同じデータをまとめて一つの凡例として扱うよう になります。リストボックスからデータファイル名を選び、「Caption:」に凡例テキストを入力してください。デフォルトではデータファイル名が使われます。
> fitrslt.nsc
>   フィッティングの結果の凡例を作成する為のアドイン。 「Expand」をチェックした場合、現在のフィット結果の数値をLegend-Text として生成しますので、フィット結果が変わっても Legend-Textは変更されません。 非チェックの場合にはLegend-Textのオブジェクト置換機能を使いますので、フィット結果が変われば、Legend-Textの内容も自動的に変化します。 フィッティングの結果の凡例を作成する為のアドイン。
> append.nsc
>   すでに読み込んであるグラフをクリアせずにNGPファイルを読み込む為のアドインスクリプト。
> calc.nsc
>   任意関数の描画をする為のアドイン。 等間隔データを作成し、データファイルとしてNgraph にセットし、数式変換機能を使って関数を描画します。
> math.nsc
>   一行電卓の為のアドイン。 数式を入力すると答えを表示します。 Ngraphの数式変換機能の関数が使えます。
> text-in.nsc
>   データファイルの指定したカラムを legend-text としてプロットデータ点の隣に挿入するアドインスクリプト。 データを扱うスクリプトの例にもなっています。
> アドインプログラムはユーザが作成する事もできます。マクロロスクリプト には Ngraph 内部の設定パラメター全てを参照、変更する機能が ありますので、アドインプログラムは Ngraph の状態変数にアクセスして，現 在の Ngraph の状態を取得したり，変更したりすることができます。マクロス クリプトだけでもかなりの事ができるのですが、ユーザインターフェースなど の点から、独立した個々のプログラムを起動した方が効率が良い場合がありま す。マクロスクリプトには外部プログラムを起動する機能がありますので、こ れも可能ですが、その場合には
> - どうのように外部プログラムに Ngraph の状態を知らせるか？
> - 外部プログラムから、どの様に Ngraph の状態を変更させるか？
> が問題となります。その簡単な一つの方法の例として legend.nsc を取り上げ、 以下で説明します。

legend.nsc の動作

> legend.nsc が起動する外部プログラムは legend.tcl です。 まず 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"

> ここで外部プログラム 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 の値は不定となりますが、その代わり軸の設定がなさ れていなくてもエラーにはなりません。