アップグレードユーザ向け情報

内容

イントロダクション

これらのノートは、Originのバージョン8.0でのLabTalkスクリプト言語に加えられた変更や改善に関連しています。もしスクリプトコードを7.5などの古いバージョンで開発している場合は、新しい機能を活用するだけでなく、Originの新しいバージョンでスクリプトの互換性の問題を修正するようにコードを更新したい場合があります。

バージョン7.xでの主な制限事項

多くのLabTalkコマンドはワークシート、グラフデータや列など「アクティブな」オブジェクトで動作します。このため、ワークシートやグラフ(または2番目のワークシート)などのウィンドウを記憶することによってウィンドウを管理し、"window -a" コマンドを使用してこれらのウィンドウ間を行ったり来たり切り替えるためのスクリプトが頻繁に要求されます。

変数はスコープ内で宣言されていないとグローバル変数となっていました​​。

いくつかのコマンドは、データが消滅するため、元のデータが必要な場合は、コピーで作業をする必要があります。

バージョン8.0.xでの主な改善事項

3つの追加事項によりOrigin8では前項で説明されている問題が解決しています。LabTalk プログラマはそれらのコンセプトを知る必要があります。

宣言された変数は、それらが宣言されたプロシージャでのみコンテキストを持っています。

範囲変数は様々なOriginのオブジェクトを指し示すことができ、オブジェクトがアクティブである必要がなくなります。

Xファンクションは、範囲変数を入力、出力変数として受け入れ、分析結果からデータを分離し、自動更新や高レベルのプログラム機能を提供します。

複数ファイルのデータの導関数の折れ線グラフを確認したいとします。

過去の方法

Origin 7.5では、複数ASCIIAファイルを新しいシート、新しい列または行にインポートできました。これらのオプションは、ワークシート内の特別な構造を読み込み、書き込むことで行われていましたが、後者の2つは、管理が難しいため、新しいシート(デフォルト)にします。どのシートが作成されるか知るのが難しいため、最初に新しいOriginプロジェクト内の空のワークシートを削除します。

次のようにインポートします。

win -cd %H; // デフォルトのワークシートウィンドウを削除
// ファイルを指定しインポート
run.section(file,MultiImportToolbar);

次のようにしてインポートされた全てのシートをループできます。

doc -e W { // 全ワークシートでループ
		...
	}

しかし、必要な導関数のコマンドは元のデータを置き換えます。ここではインポートされたデータを保持したいので、データをコピーし、これを導関数の計算に使用します。

wo -a 1; // 列を追加
copy col(2) col(3); // 列3は列2のコピー
derivative col(3); // 列3は導関数で置換えられる

データをプロットするには、グラフウィンドウを作成し(グラフウィンドウの名前を憶えて置く必要があります)、全てのワークシートでループし、グラフに追加するデータの名前を取得し、データを追加するグラフに切り替えます。

その代わりに、ワークシートの最初のパスにいるときに変数(count)を使用し、グラフ作成のためにループします。そして、続くループで導関数データの名前だけに注意し、グラフにデータを追加するために一時的にグラフに切り替えます。

スクリプトは次のようになります。

win -cd %H;
run.section(file,MultiImportToolbar);
count = 1;
doc -e W {
	wo -a 1;
	copy col(2) col(3);
	derivative col(3);
	if( count == 1 )
	{
		wo -s 3 0 3 0;
		wo -p 200 LINE;
		%M = %H;
	}
	else
	{
		%N = col(3);
		win -o %M
		{
			layer -i %N;
		}
	}
	count++;
}
win -a %M;
layer -a;

以下は、上述のスクリプトで(一時的に)アクティブになるウィンドウです。

Worksheet1

Worksheet2

Worksheet3

Worksheet1

Graph1

Worksheet1

Worksheet2

Graph1

Worksheet2

Worksheet3

Graph1

Worksheet3

Graph1

このシーケンスを理解することは、コードを記述する要件でした。

現在の方法

次に範囲(range)とXファンクションを使用して、新しいバージョンでどのように処理を行うかを見てみましょう。

ここでは、2つのXファンクションを使用します。最初のプロンプトは、インポート、次はファイルをどのようにインポートするかを指定します。

dlgfile gr:=*.dat mu:=1;
impASC options.ImpMode:=4 options.FileStruct.NumericSeparator:=0 options.Names.FNameToBk:=0;

以前のバージョンでの、"run.section(file,MultiImportToolbar);"は、2つに分けられますが、"dlgfile"関数は、他の多くの場合でファイルの指定に使用できます。"impasc" Xファンクションは、引数の一部として様々なオプションを統合し、オプションが定義する必要のある時に多くの行を置換えます。

次に、作図に使用する文字列変数を宣言します。

string strRanges;

ワークブック内の各ワークシート(インポートされたファイル)をループします。

loop(ii,1,page.nlayers) // ワークブック(ページ)は、複数ワークシート(レイヤ)を持つ
{
		...
}

ループ内では、導関数を計算するデータを指定する範囲を宣言し、differentiate Xファンクションで使用します。

range raD = $(ii)!(1,2); // 列1をX、列2をYとして使用したインデックスでシートを参照した範囲
differentiate iy:=raD; // デフォルトで新しい列を作成するXファンクションに範囲を渡す

文字列変数は、各範囲をカンマ区切りリストとして統合する範囲シンタックスにあたる文字列の定義に使用されます。

if(ii == 1) strRanges$ = 1!(1,3);
else strRanges$ = %(strRanges$),$(ii)!(1,3);

ループが終了すると、文字列は次のようになります。

1!(1,3),2!(1,3),3!(1,3)

最後の行は括弧で囲みます。

strRanges$ = (%(strRanges$));

次のようになります。

(1!(1,3),2!(1,3),3!(1,3))

Xファンクション plotxy は、1つのコマンドで最後のグラフを作成するために複数XY範囲として理解します。

最終的なコードは、次のようになります。

dlgfile gr:=*.dat mu:=1;
impASC options.ImpMode:=4 options.FileStruct.NumericSeparator:=0 options.Names.FNameToBk:=0;
string strRanges;
loop(ii,1,page.nlayers)
{
	range raD = $(ii)!(1,2);
	differentiate iy:=raD;
	if(ii == 1) strRanges$ = 1!(1,3);
	else strRanges$ = %(strRanges$),$(ii)!(1,3);
}
strRanges$ = (%(strRanges$));
plotxy %(strRanges$) plot:=200;

不適合

言語の新機能への適合や問題の修正のための変更により、古いスクリプトが動作しない場合があります。

いくつかの修正方法は以下の通りです。

文字列の代入

文字列変数へ値を代入する場合、変数名と'$'の間にスペースは必要ありません。

過去の方法

str $ = "Hello"; // 現在は動作しません

現在の方法

str$ = "Hello";

文字列レジスタ

%D は以前は最後のセットのデータセットの名前が含まれていました。現在は、コマンドウィンドウやスクリプトウィンドウでコマンドを実行する場合には、現在の作業ディレクトリが含まれています。

列の両端揃え

以前は"wks.col#.justify"プロパティで列の左/中央/右揃えを操作しました。

新バージョンでは以下のように操作します。

DoMenu 35152; // 左
DoMenu 35153; // 中央
DoMenu 35154; // 右