オブジェクトとは

 グラフオブジェクトはグラフを実現するための雛型です。topaz scriptはオブジェクトのインスタンスを構築した上で、メンバのアクセスやメソッドの実行によりグラフを形作ります。
 
 

グラフオブジェクトのヒエラルキー

 グラフオブジェクトは以下のようなヒエラルキーを持っています。
    graph  -- frame  -- axis
          |         |-- data
          |         |-- parts
          |         |-- usrconst
          |         |-- usrfnc
          |
          |-- buffer
          |-- init
 各オブジェクトの意味を以下に示します。
graph
オブジェクトの最高位に位置し、グラフ全体を管理します。Topazを起動するとgraphオブジェクトのインスタンスが1つだけ作られます。このインスタンスはTopazが終了するまで存在し続け、最後までただ1つのみ存在します。ユーザレベルでのインスタンスの作成、破棄はできません。
frame
1つのグラフを管理します。グラフに必要な軸(axis)、データ(data)...などを子オブジェクトとして持ちます。複数のグラフを表示する場合、frameオブジェクトの複数のインスタンスを作ることで実現します。frameオブジェクトを破棄すると、その子であるaxis、data、parts、usrconst、usrfncも破棄されます。このように、階層型のオブジェクト構成を採用しているため、frameオブジェクトの追加、破棄により、自動的に個々のグラフの破棄、追加が行なわれます。このオブジェクトは任意数のインスタンスを作ることができますので、Topazでは一枚の用紙に任意数のグラフを描画することができます。
axis
1本の軸を実現します。1つのframe中には4つのaxisオブジェクトのインスタンスが生成され、それぞれx軸, y軸, t軸、r軸を構成します。
data
1つの数値データに対し、1つのdataオブジェクトのインスタンスが対応します。数値データの読み込み方法やプロット方法などを管理します。任意数のインスタンスを作ることができます。
parts
テキスト、図形などグラフの装飾を行なうための部品を管理します。任意数のインスタンスを作ることができます。
usrconst
ユーザ定義定数を管理します。
usrfnc
ユーザ定義関数を管理します。
buffer
グローバルなハッシュテーブルを管理します。ハッシュ値はユーザが自由に定義、破棄しても構いません。
init
システムの初期化用のハッシュテーブルを管理します。ハッシュ値はユーザは自由に変更できますが、システムの動作に関わるため慎重に行なう必要があります。

インスタンスの生成、削除

 インスタンスとはメモリ内に生成されたオブジェクトの複製です。Topaz起動直後 のデフォルト状態では、以下のようなインスタンスが生成されています。
    graph  -- frame[0]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- usrconst
          |            |-- usrfnc
          |
          |-- buffer
          |-- init
 新たなインスタンスを生成するには、"new"コマンドを用います。例えば、frameオブジェクトの新たなインスタンスをつくるためには、
  $graph->new('frame');
とします。frameオブジェクトはgraphオブジェクトの子であるため、親であるgraphオブジェクトのメソッド"new"を用いるわけです。このスクリプトの実行により、新たにframeオブジェクトのインスタンスが生成され、インスタンス階層図は以下のようになります。
    graph  -- frame[0]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- usrconst
          |            |-- usrfnc
          |-- frame[1]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- usrconst
          |            |-- usrfnc
          |
          |-- buffer
          |-- init
 graph、buffer及びinitオブジェクトのインスタンスはただ1つしか存在せず、プログラム起動時に生成されていることに注意してください。また、usrconst及びusrfuncはframeオブジェクトごとに自動的に生成されます。

 さて、frameオブジェクトの2番目のインスタンスframe[1]にdataオブジェクトの新たなインスタンスをつくるためには、以下のようにします。

  $graph->frame[1]->new('data');
 これにより階層図は以下のように変化します。
    graph  -- frame[0]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- usrconst
          |            |-- usrfnc
          |-- frame[1]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- data[0]
          |            |-- usrconst
          |            |-- usrfnc
          |
          |-- buffer
          |-- init
 frameオブジェクトの2番目のインスタンスframe[1]にpartsオブジェクトの新たなインスタンスをつくるためには、dataオブジェクトの場合と同様ですが、partsオブジェクトには種類があるため、"new"コマンドには2つの引数が必要です。
  $graph->frame[1]->new('parts', 'text');
 'text'属性を持ったpartsオブジェクトのインスタンスが追加され、階層図は以下のように変化します。
    graph  -- frame[0]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- usrconst
          |            |-- usrfnc
          |-- frame[1]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- data[0]
          |            |-- parts[0]
          |            |-- usrconst
          |            |-- usrfnc
          |
          |-- buffer
          |-- init
 インスタンスを削除するためには、"delete"コマンドを用います。上の階層図で、frame[1]のparts[0]を削除するためには、以下のようにします。
  $graph->frame[1]->delete('parts', 0);
 deleteの第2引数は、第1引数である'parts'オブジェクトの1番目のインスタンスであることを示しています。このようなインスタンスにふられた番号のことを配列id(array index: aid)と呼びます。aidは、0番目から始まることに注意しましょう。

 aidと混同しやすい番号にインスタンスid(instance index: iid)があります。aidは配列中にインスタンスが格納された順番に0から振られた番号であり、インスタンスの格納順を入れ替えればそのインスタンスのaidは変ってしまいます。 一方、iidはインスタンスの生成された順に0から振られ、各インスタンスがこの番号を保持しているため、格納順を入れ替えてもそのインスタンスのiidは変りません。例えば、dataオブジェクトのiidは、

  $graph->frame[0]->data[0]->id
で参照できます。

 さて、frame[1]のdata[0]を削除するためには、'parts'の場合と同様、

  $graph->frame[1]->delete('data', 0);
とすることができます。この段階での階層図は以下のようになります。
    graph  -- frame[0]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- usrconst
          |            |-- usrfnc
          |-- frame[1]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- parts[0]
          |            |-- usrconst
          |            |-- usrfnc
          |
          |-- buffer
          |-- init
 さてここで、以下のようにframe[1]を削除してみましょう。
  $graph->delete('frame', 1);
 階層図は以下のようになります。
    graph  -- frame[0]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- usrconst
          |            |-- usrfnc
          |-- buffer
          |-- init
 frameオブジェクトのインスタンスを削除すると、その子オブジェクトも同時に削除されることに注意してください。

 deleteコマンドのaidには、以下のような特殊変数を用いることが可能です。

  $_ALL   インスタンス全て
  $_SEL   選択状態にあるインスタンス全て
 

インスタンスへのアクセス

 今、以下のような各オブジェクトのインスタンスが生成されているものとします。
    graph  -- frame[0]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- data[0]
          |            |-- data[1]
          |            |-- parts[0]
          |            |-- parts[1]
          |            |-- parts[2]
          |            |-- usrconst
          |            |-- usrfnc
          |
          |-- frame[1]  -- axis[0]
          |            |-- axis[1]
          |            |-- axis[2]
          |            |-- axis[3]
          |            |-- data[0]
          |            |-- parts[0]
          |            |-- parts[1]   <------ this instance
          |            |-- usrconst
          |            |-- usrfnc
          |
          |-- buffer
          |-- init
 各オブジェクトは、C++におけるオブジェクトのように、メンバとメソッドを持っています。どのようなメンバとメソッドがあるかは、reference部を参照してください。ここでは、各インスタンスのメンバやメソッドにアクセスする方法について述べます。 矢印で示したpartsオブジェクトのインスタンスのもつメンバ"text"を"Mozart"に設定するには以下のように記述します。
     $graph->frame[1]->parts[1]->text = 'Mozart';
の様に記述します。またこのメンバの値を得るには、
     $name = $graph->frame[1]->parts[1]->text;
のように記述します。グラフオブジェクトはヒエラルキーを持ちますが、演算子"->"を用いてこのヒエラルキーに応じた記述方法をとることでインスタンスのメンバーへのアクセスが実現できます。ここで注意しなければならないのは、演算子"->"はポインタではないことです。Topazスクリプトにはもともとポインタは存在しないことをももう一度思い起こして下さい。演算子"->"はオブジェクト階層を示すためだけのものと考えて下さい。従って、
     $name = $graph->frame[1]->parts[1];
の様な記述をしてもpartsオブジェクトのアドレスが得られるわけではありませんし、実行時エラーになります。
インスタンスのメンバーへのアクセスと同様、メソッドの実行も可能です。
      $graph->frame[1]->parts[1]->flushnodes();
のように記述します。
値を返すメソッドから変数に代入することもできます。
      $a = $graph->frame[1]->length('data');
      @a = @graph->frame[1]->getallusrconst();
 getallusrconst()関数は配列を返すため、配列変数@aで結果を受けています。 またこの場合、$graph->...ではなく、@graph->...で始まっていることに注意してください。