LabTalkオブジェクト

LabTalkスクリプトプログラミングでは、さまざまなオブジェクトおよびそのプロパティにアクセスできます。 これらのオブジェクトは、ワークシート列やグラフのデータプロットなどGUIに表示されているOriginプロジェクトのコンポーネントを含みます。このようなオブジェクトは、Originオブジェクトとして参照され、次のセクション、Origin オブジェクトのサブジェクトとなっています。

オブジェクトのコレクションには、INIオブジェクトまたはシステムオブジェクトのようなインターフェースに表示されない別のオブジェクトも含みます。 LabTalkスクリプトからアクセス可能なオブジェクトのすべてはアルファベット順のオブジェクトリストにあります。

通常、各オブジェクトにはプロパティがあり、そしてオブジェクトを操作するメソッドがあります。 オブジェクトのプロパティとメソッドは、個々のオブジェクトにより異なります。 例えば、データ列はグラフとは異なるプロパティを持ち、それぞれに実行する操作も異なります。 どちらの場合でも、オブジェクトのプロパティにアクセスしたり、メソッドを呼び出すための一般的なシンタックスが必要です。 これらは以下にまとめられています。

また、オブジェクトの名前を変更することができるので、異なるスコープのオブジェクトで名前を共有すると、オブジェクト名が紛らわしくなります。 そのような理由から、各オブジェクトには固有のユニバーサルID(UID)が割り当てられ、オブジェクト名とそのUID間の相互に参照する機能があります。

プロパティ

プロパティは、次のようなシンタックスを持つオブジェクトに結びついた数値またはテキスト文字列を設定するか、返します。

objName.property (数値のプロパティ)
objName.property$ (テキストのプロパティ)

ここで objName はオブジェクトの名前で、property はオブジェクトの種類に対する有効なプロパティです。テキストオブジェクトにアクセスするとき、プロパティの後ろに$記号を付ける必要があります。

例えば、次の方法でオブジェクトプロパティを設定できます。

// アクティブワークシートの列数を10に設定
wks.ncols = 10;   
// アクティブワークシートをMySheetという名前にする
wks.name$ = MySheet;

またはプロパティの値を取得できます。

pn$ = page.name$;  // アクティブページ名を取得
layer.x.from = ;   // X軸の開始値を取得して表示

メソッド

メソッドは、直ちに実行可能なコマンドです。実行される時、メソッドはオブジェクトと関連する処理を実行し、値を表示します。オブジェクトメソッドは次の構文で表わされます。

objName.method(arguments)

ここでobjNameは、オブジェクトの名前で、methodは、オブジェクトの種類に対して有効なメソッド、arguments はメソッドがどのような動作をさせるかを決めます。一部の引数はオプションです。そして、一部のメソッドは引数を必要としません。ただし、全てのオブジェクトメソッドのステートメントは括弧 "()" で囲む必要があります。

例えば、次のコードは、run オブジェクトsectionメソッドを使って、computeCircle, という名前のスクリプトにあるMainセクションを呼び出して、3つの引数を渡します。

double RR = 4.5;
string PA$ = "Perimeter and Area";
run.section(computeCircle, Main, PA$ 3.14 R);

オブジェクト名とユニバーサルID(UID)

各オブジェクトには、ショートネームとロングネームがあり、ほとんどのオブジェクトにはユニバーサルID (UID)があります。 ショートネームとロングネームの両方とも変更できますが、オブジェクトのUIDはプロジェクト(OPJファイル)内では同じままです。 オブジェクトのUIDは、あるプロジェクトを別のプロジェクトに変更する場合に変わります。これは、すべてのオブジェクトUIDがリフレッシュされ、新しく組み合わせられたプロジェクト内で各オブジェクトが固有になるように再設定されるためです。

多くのLabTalk関数には引数としてオブジェクト名が必要です。また、オブジェクトの名前は変更可能なので、変換のために、次の関数を使用できます。

  • nVal = range2uid(rangeName$)
  • str$ = uid2name(nVal)$
  • str$ = uid2range(nVal)$

関連する関数は、次の一般シンタックスを持つNameOf(range$)です。

  • str$ = nameof(rangeName$)

その利用法は次のサンプルで示しています。

// (Book1, Sheet1内の)列1の範囲変数を確立
range ra=[Book1]1!1;    
//その範囲と結びついた内部名を取得

string na$ = NameOf(ra)$; 
// na$は'Book1_A'になる
na$ =;         
//  内部名を与えるUIDを取得               
int nDataSetUID = range2uid(na$);

範囲名に加え、列、シート、ブックそれら自体の名前からUIDを取得することができます。

// 列2のUIDを返す
int nColUID = range2uid(col(2));              
// シートまたはレイヤのUIDを返す
int nLayerUID = range2uid([book2]Sheet3!); 
// アクティブシートまたはレイヤのUIDを返す
nLayerUID =range2uid(!);   
// アクティブワークブックのシート3のUIDを返す
nLayerUID =range2uid(sheet3!);      
// 特定シート内のインデックス 'jj' を持つ列のUIDを返す 
nColUID = range2uid([Book1]sheet2!wcol(jj));

また、関数range2uid は、実行中のデータプロット名やデータ列名を含むシステム変数 %Cと働きます。

// アクティブデータプロットまたは選択した列のUIDを返す
nDataSetUID = range2uid(%C);

範囲変数からページとレイヤを取得

範囲変数を与えると、対応するページとレイヤのUIDを取得することができます。次のコードは、現在のシートのXYデータから非表示のプロットを作成し、非表示のプロットのグラフページ名を取得する方法を示しています。

plotxy (1,2) hide:=1; // A(x)B(y)を新しい非表示のプロットに作図
range aa=plotxy.ogl$;
int uid=aa.GetPage();
string str$=uid2Name(uid)$;
type "Resulting graph name is %(str$)";

プロットからブックとシートを取得

データプロットに関連したワークブックとワークシートを範囲変数として取得することもできます。次のコード(Origin 8 SR2以降)は、アクティブプロット(%C)を列範囲として取得する方法を示し、そこから対応するワークシート変数とブック変数を取り出します。

//アクティブプロットの列範囲、 -w スイッチはデフォルトでY列を取得
range -w aa=%C;
// シートに対するwks範囲、列は以下に属する
range ss = uid2range(aa.GetLayer())$;
// シート名を表示
ss.name$=;
// その列からのブックの範囲
range bb = uid2range(aa.GetPage())$;
// ブック名を表示
bb.name$=;

文字列形式でGetLayerとGetPageから返す範囲文字列を直接使うより簡単な方法もあります。

//アクティブプロットの列範囲、 -w スイッチはデフォルトでY列を取得
range -w aa=%C;
// シートに対するsheet範囲文字列は以下に属する
range ss = aa.GetLayer()$;
// シート名を表示
ss.name$=;
// その列からのブック範囲文字列
range bb = aa.GetPage()$;
// ブック名を表示
bb.name$=;

ページにマッピングされた範囲を作成するとき、範囲変数は PAGE (オブジェクト)のプロパティを持ちます。
グラフレイヤにマッピングされた範囲を作成するとき、範囲変数はLAYER (オブジェクト)のプロパティを持ちます。
ワークブックレイヤ(ワークシートまたは行列シート)にマッピングされた範囲を作成するとき、範囲変数はWKS (オブジェクト)のプロパティを持ちます。