Ngraph script 活用法


注意

このページの内容は筆者が独自に解析した内容を含んでいます。内容には十分注意 しているつもりですが、誤った記述が含まれている可能性もあります。また、この ページの内容について Ngraph の作者(石坂 智氏)に問い合わせることはしない でください。このページ作成にあたり、石坂 智氏には貴重な情報を提供していた だきました。この場をかりてお礼申し上げます。

Ngraph は石坂 智氏作の高機能グラフ作成ソフトです
Ngraph は Ngraph Web Page で入手できます。


戻る

|マクロプログラムの実行法 |Ngraphオブジェクト |マクロ作成入門 |

マクロプログラムの実行法

例として macro.nsc を実行させたい場合を考えます。

Addin メニューから実行する。

このためには、macro.nsc を Option メニューで登録しなければいけません。あと で、メニューに登録しなくてもマクロプログラムを呼び出せるマクロを紹介します。

「グラフを開く」で実行する。

ngp ファイルを読み込むことはマクロの実行と等価ですので、グラフの読み込みで もマクロを実行できます。ただしこの場合マクロの読み込み前にすべてのオブジェ クトが消去されます。また、セキュリティ上の問題により、外部コマンドの実行と リダイレクト '>' は security check のエラーが出て実行できないようになっ ています。

Ngraph Shell の中で実行する。

次に示す2つの方法で実行させることができます。この方法は、マクロプログラム 中で他のマクロを呼び出す場合にも使えます。(Ngraph$ は Ngraph sehll のプロ ンプト)

1)

Ngraph$ . macro.nsc

2)

Ngraph$ new shell
Ngraph$ shell::shell macro.nsc
Ngraph$ del shell

1) の方法では同じ shell の中で macro.nsc が実行されるのに対して 2) の方法 では、新しいshell を定義しその中で実行させています。このため、特にマクロプ ログラムから呼び出す場合、1)の方法では呼びだしたマクロ中の shell 変数が呼 び出されたマクロでも参照できるのに対し、2) の方法では参照できません。次に 示すような、マクロ test1.nsc と test2.nsc を作製し、実行するとこのことがよ くわかります。

test1.nsc

   
test1="test1"
echo "test1=$test1"
echo test2.nsc を呼び出します。
new shell
shell::shell test2.nsc
del shell
echo 戻ってきました。
echo "test2=$test2"
echo
echo test2.nsc を呼び出します。
. test2.nsc
echo 戻ってきました。
echo "test2=$test2"
echo

test2.nsc

   
echo test2.nsc です。
echo "test1=$test1"
test2="test2"

実行結果は次のようになります。

test1=test1
test2.nsc を呼び出します。
test2.nsc です。
test1=
戻ってきました。
test2=

test2.nsc を呼び出します。
test2.nsc です。
test1=test1
戻ってきました。
test2=test2

1) の方法で呼びだした場合、test1.nsc 中で定義した shell 変数が test2.nscで は定義されていないのがわかります。また test2.nsc 中で定義された shell変数 も test1.nsc では定義されていません。 2) の方法の場合まったく逆に、 test1.nsc test2.nsc で定義された shell 変数はどちらのマクロ中でも参照でき ています。


|ページの先頭 |マクロプログラムの実行法 |Ngraphオブジェクト |マクロ作成入門 |

Ngraph オブジェクト

Ngraph で描画されるグラフは Ngraph オブジェクトの集合から成り立っています (Ngraph Help の「Ngraph オブジェクト」参照)。従って、Ngraph オブジェクトの フィールド値を設定することでNgraph の状態を変更したり、逆にフィールド値を 得ることで Ngraph の状態を知ることができます。一般に、Ngraph のオブジェク トは次のように表記されます。

object:instance_list:field

ここで、object はオブジェクトの名前、instance_list はインスタンスの ID番号 か、名前を設定してあるインスタンスはその名前、field は各オブジェクトのフィー ルド名です。なお、instance_list は次のような表記が可能です。

数字
オブジェクトIDで指定
@
カレントオブジェクトID
!
最後のオブジェクトID
-
範囲指定

さらに、これらの値はカンマ(,)で複数指定できます。従って、次のような 表記が可能です。

0,1,3-!

これは、0, 1, 3から最後まで、となります。

オブジェクトの一覧、および各オブジェクトのフィールド一覧は、 Ngraph shell 中でコマンド "object" および "object object_name" を実行することで見 ることが出来ます。


|ページの先頭 |マクロプログラムの実行法 |Ngraphオブジェクト |マクロ作成入門 |

マクロ作製入門

Ngraph のマクロの文法は UNIX の sh とほぼ同じになっています。sh の文法につ いて詳しいことはUNIX の参考書などを参照して下さい。(JFBASH の 解説があります。)また、Ngraph 独自の拡張がありますが、これはNgraph の ヘルプを参照して下さい。そのうち、よく使うコマンドをいくつか紹介します。

new コマンド
"new [objecrt名]" で、そのオブジェクトのインスタンスを生成します。
del コマンド
"del [objecrt名]" で、そのオブジェクトのインスタンスを削除します。
object コマンド
"object [object名] -instance" で、 そのオブジェクトのインスタンスの数を得ることができます。
"object [object名] -instances" で、 そのオブジェクトのインスタンスのリストを得ることができます。 for 文で利用する場合に便利でしょう。
iexpr コマンド
"iexpr [式]" で式を評価し、結果を整数で表示します。
dexpr コマンド
"dexpr [式]" で式を評価し、結果を実数で表示します。

Ngraph の状態を取得、変更する

まず Ngraph に付属の demo2.ngp を読み込んでから、Ngraph shell を立ちあげて ください。例えば、プロットするマークの大きさを変えることを考えてみましょう。 ファイルID(ファイルウィンドウで各行の先頭についている数字)が 0 のファイ ルのマークサイズは次のようにして知ることができます。(Ngraph$ は Ngraph shell のプロンプト)

Ngraph$ echo ${file:0:mark_size}
200

マークサイズを 300 に変えてみましょう。

  
Ngraph$ file:0:mark_size=300

いちいち、Ngraph shell を終了するのは面倒なので、Ngraph Shell の中から再描 画させてみます。

Ngraph$ gra::clear
Ngraph$ gra::draw

マークが大きくなったはずです。なお、上の様に ID を省略するとカレントのID に対して操作を行うことになります。

さて、この様な操作をオープンしてあるすべてのファイルについて自動的に行うマ クロを作ってみましょう。これは「Ngraph オブジェクト 」で紹介した instance の範囲指定を使えば簡単に出来ます。

file:0-!:mark_size=300

0-! はオブジェクトID 0 から最後までを表しますから、すべてのファイルについ てmark_size を 300 に設定できます。

dialog を使用する

オープンしてあるファイルのマークサイズを自動的に変更することができる ようになりましたが、つぎにマクロ実行時にマークサイズを設定できるようにして みましょう。これは、dialog オブジェクトを使用することによって可能です。試 しに、Ngraph shell で実行してみましょう。

Ngraph$ new dialog
Ngraph$ SIZE=${dialog::input:'Input mark size.'}
Ngraph$ echo $SIZE
300
Ngraph$ del dialog

このように、マクロ中からユーザーの入力を受け付けることができます。実際にマ クロに組み込む際には、次のように値が入力されたかどうかのチェックもしておく とよいと思います。

データのマークサイズをまとめて設定するマクロ

new dialog
SIZE=${dialog::input:'Input mark size.'}
del dialog
if [ "$SIZE" ]
then
file:0-!:mark_size="$SIZE"
fi

オブジェクトの生成

先に紹介したように、"new", "del" はそれぞれオブジェクトの生成、消去を行う コマンドです。「Ngraph オブジェクト」で述べたように、 Ngraph のグラフはNgraph オブジェクトの集合からできていますから、たとえば、 新しく file オブジェクトを生成することは新しいデータファイルを開くことに対 応しますし、新しい axis オブジェクトを生成することは新しい軸を作成すること に対応します。このように、マクロ中で新しいオブジェクトを生成、消去すること により新しいデータファイルを開いたり、新しいレジェンドを作成したり、または 逆に、すでに開いてあるデータファイルを閉じたりすることができます(というか、 グラフを保存する ngp ファイルも Ngraph のマクロスクリプトですからこのよう な事ができるのは当然です)。このことを利用すれば、ある種のデータは常にある 設定で開く、というようなこともマクロを使えば簡単にできます(すべてのデータ を特定の設定で開きたい場合には|設定|File デフォルト|メニューを使用しま しょう)。

特定の設定でファイルを開くマクロ

new dialog
FILE=${dialog::get_open_file:'DATA_File(*.DAT) *.dat;*.DAT'}
del dialog
if [ "$FILE" ]
then
new file
file::hidden=false
file::R=0
file::G=0
file::B=0
file::clip=true
#中略
file::move_data_x=
file::move_data_y=
file::axis_x='axis:0'
file::axis_y='axis:1'
file::file="$FILE"
fi

このマクロは dialog::get_open_file の使用例にもなっています。 dialog::get_open_fileを利用すると、通常の「ファイルを開く」ダイアログボッ クスを利用できるので、存在するファイル名を得たい場合には便利です(ファイル の存在も勝手にチェックしてくれます)。ただし、一度に一つのファイルしか指定 できません。"new file" 以下の部分は手で書いてもいいですが、一度 Ngraph 上 でデータを開いて、必要な設定をしたものを ngp ファイルに保存し、そこから切 り貼りするのが楽でしょう。そして、"file::file=..." の部分のみ上のように書 き換えます。これで、このマクロを使って開いたデータファイルは常にマクロ中で 定義された設定でオープンされます。

このマクロを少し変更するだけで開くファイルの拡張子に応じて設定を変えるマク ロができます。

開くファイルの拡張子に応じて、ファイルの設定を行うマクロ

new dialog
FILES=${dialog::get_open_files:'All(*.*) *.*'}
del dialog
if [ "$FILES" ]
then
 for file in $FILES
 do
  new file
  case "$file" in
  *.ex1|*.EX1)
   #設定1
  ;;
  *.ex2|*.EX2)
   #設定2
  ;;
  *.ex3|*.EX3)
   #設定3
  ;;
  *)
   #設定デフォルト
  ;;
  esac
  file::file="$file"
 done
fi

case 文を用いてオープンするデータファイルの拡張子ごとにファイルの設定を行 います。

上のマクロでは dialog::get_open_files を利用して一度に複数のデータを開ける ようにしています(dialog::get_open_files は Ngraph for Windows Version 6.01.02 以上で使用可能)。

似た事を行うマクロとして、この節のタイトルから外れますが、すでに開いてある ファイルの拡張子に応じて、ファイルの設定を行うマクロを作成してみました。

すでに開いてあるファイルの拡張子に応じて、ファイルの設定を行うマクロ

NUMBER=`object file -instance`
if [ $NUMBER = 0 ]
then
 # file のインスタンスの数が 0 ならエラーを表示し終了
 new dialog
 dialog::message:"No data file."
 del dialog
 exit
fi

while [ $NUMBER -gt 0 ]
do
 NUMBER=`iexpr $NUMBER-1`
 FILE=`get file:$NUMBER file`
 case "$FILE" in
 *.ex1|*.EX1)
  #設定1
  eval file:$NUMBER:mark_size=100
  #上は設定例
 ;;
 *.ex2|*.EX2)
  #設定2
 ;;
 *.ex3|*.EX3)
  #設定3
 ;;
 *)
  #設定デフォルト
 ;;
 esac
done

最初の行では、オープンしてあるファイルの数(=file object の instanceの数) を object コマンドを使用することで得ています。 オブジェクトのフィールドに 値を設定するときインスタンスの指定に shell 変数を利用する場合は、設定1の 例の様に evalコマンドを使用して下さい。

スクリプト実行中のエラー処理

スクリプト内でオブジェクトコマンドおよび、普通のコマンド(内部コマンド、外 部コマンド)を実行した時にエラーレベル0以外で終了した場合、set -e (デフォ ルト) ではスクリプトの実行を停止しますが、set +e のときは続行します。

なお、${} のオブジェクト置換の場合、戻り値でエラーかどうかが判断できるので、 エラーレベルが 0 でなくても終了しません。戻り値は空の文字列になります。

その他、知っていると役に立つかもしれない機能

軸のオートスケール

axis オブジェクトに auto_scale というメンバ関数を使えば、軸のスケールを自 動設定できます。具体的には、

axis:0-!:auto_scale:'file:0-! 0'

で、すべての軸が適切なスケールに設定されるようです。なお、最後の "0" は余 白の設定で、0 で余白あり 0 以外で余白なしになるようです。GUI を使わないで、 グラフを自動作成させるような場合に使えるでしょう。

まとめ

このように Ngraph object を利用することでいろいろな処理が可能です。どのよ うなNgraph object があるかは、Ngraph shell 中で "object" コマンドを実行す ることで確認できます。また、それぞれのobject がどのような field を持つかは "object object_name" で確認できます。さらに、Ngraph に付属するスクリプトファ イル(*.ngp, *.nsc)も参考になると思います。


|ページの先頭へ |マクロプログラムの実行法 |Ngraphオブジェクト |マクロ作成入門 |