Origin C関数をコンパイル、リンク、ロードしたら、Originで使用する準備ができています。 これは名前で関数を呼び出し、LabTalkスクリプトコマンドを受け付けるOriginのどの場所からでも必要な引数を提供できるということです。 スクリプトウィンドウ、コマンドウィンドウ、Origin GUI内のカスタムボタンなどから関数を呼び出せます。 LabTalkスクリプトガイドのスクリプトの実行の章では、Origin C関数を使用することができるOrigin内のすべての場所についての詳細があります。
Origin C関数は、他のOrigin CやLabTalkスクリプトから呼び出すことができます。 このセクションでは、Origin C関数をLabTalkからアクセスする方法について説明しています。
Origin CコードからLabTalkにアクセスすることについての情報は、LabTalkにアクセスするの章を参照してください。
関数定義の前にOrigin Cコードにpragmaステートメントを配置して、Origin CコードにアクセスするLabTalkを制御できます。
#pragma labtalk(0) // LabTalkでOC 関数を無効に void foo0() { } #pragma labtalk(1) // LabTalkでOC関数を有効に(デフォルト) void foo1() { } #pragma labtalk(2) // LabTalkコマンド '''run -oc''' が必要 void foo2() { }
上記のコードは、foo0をLabTalkからの呼び出しを禁止し、foo1はLabTalkから呼び出すことができ、foo2は、run -oc コマンドを使って、LabTalkから呼び出すことができます。 2番目のpragmaをコメントアウトしていると、foo0 と foo1の両方がLabTalkから呼び出すことができません。これは、1つのpragmaステートメントがpragmaの後のすべての関数に適用され、次のpragmaまたはファイルの最後まで続きます。
Origin C関数にアクセスするLabTalkを制御するLabTalkのシステム変数もあります。 変数は @OCで、そのデフォルトは1であり、アクセス可能ということです。 変数を0にセットするとアクセス不可となります。
LabTalkの list コマンドは、LabTalkから呼び出すことができるOrigin C関数のすべての名前を出力するのに使用できます。オプションを使って、関数を一覧表示する形式を変更することができます。Options let you modify which type of functions is listed:
list f; // LabTalkから呼び出し可能な関数一覧 list fs; // stringを返す関数の一覧 list fv; // vectorを返す関数の一覧 list fn; // numericを返す関数の一覧 list fo; // voidを返す関数の一覧
@OC=0 という設定は、Origin C関数をLabTalkで非表示にし、そのためlist f コマンドは結果を表示しません。
LabTalkスクリプトはOrigin Cの内部で使用しているすべてのデータ型をサポートしているわけではありません。次の表は、与えられた引数(戻り)の型でOrigin C関数を呼び出すときに、渡される(返される)LabTalk変数の型 です。 最後の列は、引数の型が参照によって渡すことができるかどうかを示しています。
Origin C | LabTalk | 参照渡し |
---|---|---|
int | int | 可 |
double | double | 可 |
string | string | 可 |
bool | int | 不可 |
matrix | matrix range | 可 |
vector<int> | dataset | 可 |
vector<double> | dataset | 可 |
vector<complex> | dataset | 不可 |
vector<string> | dataset, string array* | 不可 |
* 文字列配列は参照渡しができません。
この表が示すように、string, int, double 型のOrigin C関数の引数はLabTalkから値または参照で渡すことができます。 しかし、Origin C関数は実行時に渡される型で記述しなければなりません。
以下は、LabTalkからOrigin Cに値で引数を渡すサンプルです。各サンプルに対するフォーマットは、Origin C関数の宣言の行を与え、LabTalkのコードを使って呼び出されます。 Origin C関数の本体は、変数を渡すというサンプルに対しては重要ではないので、除外しています。
関数の単純なケースは、引数を受け付け、double型の引数を受付け、double型を返します。
double square(double a) // Origin C関数の宣言
double dd = 3.2; // LabTalk関数呼び出し double ss = square(dd); ss =; // ss = 10.24
ここで、データタイプに割り当てるデータセット変数または範囲を使って、vector引数を取り、vectorを返すOrigin C関数がLabTalkから呼ばれます。
vector<string> PassStrArray(vector<string> strvec)
LabTalkから3つの方法で呼び出すことができます。
dataset dA, dB; dB = Col(B); dA=PassStrArray(dB); Col(A)=PassStrArray(Col(B)); // または、直接Colを使い、Col = dataset // または、LabTalk範囲が使用される range ra = [Book1]1!1, rb = [Book1]1!2; ra = PassStrArray(rb);
以下のOrigin C関数に対して、引数宣言内のアンパサンド &の文字は、引数が参照で渡されていることを示しています。
double increment(double& a, double dStep)
double d = 4; increment(d, 6); type -a "d = $(d)"; // d = 10
次は、参照で渡すいくつかの引数とそれ以外を値で渡すサンプルです。
int get_min_max_double_arr(vector<double> vd, double& min, double& max)
dataset ds = data(2, 30, 2); double dMin, dMax; get_min_max_double_arr(ds, dMin, dMax); //または列からデータセットを使う、Col(A)にデータがあること get_min_max_double_arr(Col(A), dMin, dMax);
次のサンプルは、LabTalkのmatrix range変数をOrigin C関数に参照で渡すことを示しています。
// データをvectorからmatrixにセット void set_mat_data(const vector<double>& vd, matrix& mat) { mat.SetSize(4,4); mat.SetByVector(vd); }
range mm = [MBook1]1!1; dataset ds = data(0, 30, 2); set_mat_data(ds, mm);
ユーザ定義またはグローバルなOrigin C関数が組み込みのLabTalk関数と同じ名前を持つとき、LabTalkのvecotr表記を使う時を除いて、Origin C関数が優先順位が高くなります。
優先順位
通常のLabTalk関数(値の範囲を戻し、vector表記で使われる)は、同じ名前のOrigin C関数よりも優先順位が高くなります。 それ以外の場合には、Origin C関数が呼ばれます。
列または行列のどちらかの値の設定メニューで現れるダイアログボックスで、Origin Cを使って関数を定義することができます。
Origin C関数がOriginプロジェクトの一部としてビルドされると、---コードビルダのProjectまたはSystemに自動的に配置されるか、userフォルダ内の関数を手動でビルドするかのいずれか---(列と行列の両方)の値の設定ダイアログの F(x) のユーザ定義セクションで利用できます。 F(x)メニューの異なるセクションに関数を割り当てるには、関数ヘッダの一部として、新しいセクション名を含むpragmaを発行します。例えば、次のコードは、Mathセクションに関数 add2num を追加し、統計セクションに関数 mean2num を追加します。
#pragma labtalk(1,Math) double add2num(double a, double b) { return a + b; } #pragma labtalk(1,Statistics) double mean2num(double a, double b) { return (a + b)/2; }
この方法で、多くの関数を1つのソースファイル内で定義し、ビルドし、F(x)メニューの目的の場所で直ちに利用できます。
F(x)メニューに追加される関数は、次の制約に従います。