この例では、数値データファイルは以下のような形式になっており、1行目が測定日時、2行目が試料番号、3行目が数値データ内容、4行目以降が数値データを表し、常にこの形式の数値ファイルを扱うものとします。ここで2行目の中の試料番号を抜きだし、frame上部に表示させることを考えます。
# date: May 6 1999 # sample No.: 3454 # V I 0 3.5654 1 5.6765 2 7.5643
# initオブジェクトには数値データファイルのデフォルト拡張子が格納 # されています。この拡張子は、ラベル'dataext'の値で参照されます。 # まずラベル'dataext'が存在するか確認します。'dataext'は通常初期化 # スクリプトinitparamsでTopaz起動時に設定されますので、通常は存在 # するはずです。デフォルトの拡張子を取得後、変数$extにコピーします。 if ($graph->init->search(dataext) == -1) { $ext = ''; } else { $ext = $graph->init->get(dataext); } # CUI関数'selectfile'を起動し、ユーザに数値データファイルを選択させ # ます。'selectfile'関数の第1引数は0ですので、単一ファイル選択モード # になります。また第2引数には$extが指定され、この引数を正規表現とし # ファイルリストのフィルタリングを行います。ユーザが単一のファイルを # 選択し、リターンキーを押してselectfile関数を終了すればselectfile関数は # 1を返します。またこの場合選択されたファイル名は@_RETに格納されます。 # キャンセルによりselectfile関数が終了すると0が返され、最終行ににジャンプ # しスクリプトは終了します。 if (selectfile(0, $ext)) { # @_RETに値を返す関数は多く存在するので、@_RET中の必要な値は他の変数 # に早めに格納した方がよいでしょう。 $file = $_RET[0];
# データプロットを行うための、detaオブジェクトの新たなインスタンスを # 生成します。関数の返り値-1は新たに生成されたインスタンスのインスタ # ンスidです。この値を変数$dnoに格納します。 $dno = $graph->frame[$_CUR]->new('data') - 1; # 新しく作成したインスタンスの初期化を行います。 # 初期化スクリプト'initdata'の第1引数はframeオブジェクトの配列 # idであり、第2引数はdataオブジェクトの配列idです。 if (execfile('initdata', $graph->currentframe, $dno) == 0) { print ("Error!: cannot initialize data.\n"); } # 新たなdataオブジェクトインスタンスを選択状態にし、ファイル名の設定を # 行います。CUI関数'loaddatamenu()'は選択状態にあるdataオブジェクト # インスタンスの、ファイル読み込み条件設定を行うためのユーザインター # フェイスです。 $graph->frame[$_CUR]->data[$dno]->selected = 1; $graph->frame[$_CUR]->data[$dno]->filename = $file; loaddatamenu(); # ここまでに行われたdataオブジェクトインスタンスの設定内容に従い、 # 数値データを実際にロードします。 print 'reading data ..... '; $graph->frame[$_CUR]->data[$dno]->loaddata(); print "done\n"; # 読み込まれた数値データに合わせ、座標軸のオートスケーリングを # 行います。第1引数はスケーリングを行う軸のインスタンスidです。 # $_ALLと指定すると、全ての軸がオートスケーリングされます。 # 第2引数はスケーリングマージン(余白)です。ここでは10%としています。 $graph->frame[$_CUR]->autoscale($_ALL, 10); # 数値データファイル名を表示するために、partsオブジェクトインス # タンスを新たに生成します。Partsオブジェクトインスタンスを作成 # する際は、Partsの種類も同時に指定する必要があります。ここでは # その種類として、textを与えています。新たに作られたインスタンス # の配列番号を変数$pnoに格納します。 $pno = $graph->frame[$_CUR]->new('parts', 'text') - 1; # インスタンスの初期化を行います。 if (execfile('initparts', $graph->currentframe, $pno) == 0) { print ("Error!: cannot initialize parts.\n"); } # ここで数値データファイルをオープンし、ファイルハンドル'F'に対応 # 付けます。 open(F, $file); # まず1行目を読み込みます。 $line = <F>; # 2行目を読み込みます。 $line = <F>; # ファイルをクローズします。 close (F); # 正規表現を用いてパターンマッチングを行います。マッチングした # 結果は$1に格納されます。 $line =~ 'sample No\.: ([0-9]+)'; $graph->frame[$_CUR]->parts[pno]->text = $1; # テキストを表示する位置を計算し、インスタンスに位置情報を代入します。 $framecenter = ($graph->frame[$_CUR]->x2 - $graph->frame[$_CUR]->x1) / 2; @bbox = @graph->frame[$_CUR]->parts[$pno]->bbox(); $textwidth = $bbox[2] - $bbox[0]; $textheight = $bbox[3] - $bbox[1]; $graph->frame[$_CUR]->parts[pno]->x1 = $framecenter - $textwidth / 2; $graph->frame[$_CUR]->parts[pno]->y1 = -2 * $textheight; $graph->paintall(V0); }