グラフから点を取得Getting-Points-from-Graph
Originのプロット操作・オブジェクト作成ツールバのどのボタンも、スクリプトから初期化でき、3つはマクロとリンクして、プログラミングすることができます。
ツールをプログラミングするには、pointproc マクロを定義して、適切なコードを実行します。pointproc マクロは、ユーザがダブルクリックまたはシングルクリックしてEnterキーを押すときに実行します。
スクリーンリーダ
このスクリプトは、スクリーンリーダツールを使って、グラフにラベルを配置します。
dotool 2; // スクリーンリーダツールを開始
dotool -d; // シングルクリックをダブルクリックのように動作させる
// ここで'''pointproc''' マクロを定義
def pointproc {
label -a x y -n MyLabel Hello;
dotool 0; // ツールをポインタにリセット
done = 1; // 変数を終わりまで無限ループを許可するようにセット
}
// ツールを使うときスクリプトは停止しない
// そのため、これ以上の実行を止める必要がある
// この無限ループはユーザが点を選択するのを待つ
for( done = 0 ; done == 0; ) sec -p .1;
// A .1 秒の遅延によりループに何かを与える
type Continuing script ...;
// マクロが実行されると無限ループは解放される
データリーダ
データリーダツールは、スクリーンリーダに似ていますが、カーソルは実際のデータポイントで固定されます。
定義されると、ユーザがEsc キーを押すか、ポインタツールをクリックして、データリーダを停止する場合にquittoolbox マクロが実行されます。
この例は、グラフウィンドウがアクティブであることが前提で、そのグラフ上の3つのポイントを選択することを待ちます。
@global = 1;
dataset dsx, dsy; // XとY値を保持する2つのデータセットを作成
dotool 3; // ツールを開始
// 各点の選択に対して実行するマクロを定義
def pointproc {
dsx[count] = x; // X座標を取得
dsy[count] = y; // Y座標を取得
count++; // 増分をカウント
if(count == 4) dotool 0; // 3つの点を持つかどうかを見ることをチェック
else type -a Select next point;
}
// ユーザがEscキーを押すかポインタツールをクリックすると
// 実行するマクロを定義:
def quittoolbox {
// Error : Not enough points
if(count < 4) ty -b You did not specify three datapoints;
else
{
draw -l {dsx[1],dsy[1],dsx[2],dsy[2]};
draw -l {dsx[2],dsy[2],dsx[3],dsy[3]};
draw -l {dsx[3],dsy[3],dsx[1],dsy[1]};
double ds12 = dsx[1]*dsy[2] - dsy[1]*dsx[2];
double ds13 = dsy[1]*dsx[3] - dsx[1]*dsy[3];
double ds23 = dsy[3]*dsx[2] - dsy[2]*dsx[3];
area = abs(.5*(ds12 + ds13 + ds23));
type -b Area is $(area);
}
}
count = 1; // 初期の点
type DoubleClick your first point (or SingleClick and press Enter);
次のサンプルは、Escキー押されるか、ユーザがポインタツールをクリックまで任意のポイントを選択するものです。
@global = 1;
dataset dsx, dsy; // XとY値を保持する2つのデータセットを作成
dotool 3; // ツールの開始
// 各ポイントの選択を実行するマクロを定義
def pointproc {
count++; // 増分のカウント
dsx[count] = x; // X座標を取得
dsy[count] = y; // Y座標を取得
}
// ユーザがEscキー押すか、ポインタツールをクリックすると
// 実行するマクロを定義
def quittoolbox {
count=;
for(int ii=1; ii<=count; ii++)
{
type $(ii), $(dsx[ii]), $(dsy[ii]);
}
}
count = 0; // 初期の点
type "Click to select point, then press Enter";
type "Press Esc or click on Pointer tool to stop";
| Enterキーを押してポイントを選択することは、ダブルクリックしてポイントを選択するより確実です。
|
また、グラフからデータ値を収集する getpts コマンドを使うこともできます。
データセレクタ
データセレクタツールは、データセットの範囲をセットするのに使うことができます。
範囲は開始行番号(インデックス)と終了行番号で定義されます。
データセットの複数範囲を定義でき、Originの分析ルーチンは、これらの範囲を入力に使い、これらの範囲外のデータは除外されます。
以下は、グラフの範囲を選択させるスクリプトです。
// ツールの開始
dotool 4;
// ユーザが行ったとき実行するマクロを定義
def pointproc {
done = 1;
dotool 0;
}
// ループで待ち押すことで完了
// (1) Enterキーまたは (2) ダブルクリック
for( done = 0 ; done == 0 ; )
{
sec -p .1;
}
// ユーザがツールを終了させると、追加のスクリプトが実行
ty continuing ..;
領域データセレクタ または 領域マスクツール を使うとき、ユーザがEscキーを押すことをきっかけとして、quittoolboxマクロを実行できます。
// グラフをアクティブにして、領域データ選択ツールを開始
dotool 17;
// ユーザが行ったとき実行するマクロを定義
def quittoolbox {
done = 1;
}
// ループで待ち押すことで完了 ...
// (1) Escキーまたは (2) ポインタツールをクリック
for( done = 0 ; done == 0 ; )
{
sec -p .1;
}
// ユーザがツールを終了させると、追加のスクリプトが実行
ty continuing ..;
Xファンクションを使って、これらの範囲を見つけ、使用することができます。
// データセット内の範囲を取得
dataset dsB, dsE;
mks ob:=dsB oe:=dsE;
// For each range
for(idx = 1 ; idx <= dsB.GetSize() ; idx++ )
{
// その範囲に対して曲線以下の積分を取得
integ %C -b dsB[idx] -e dsE[idx];
type Area of %C from $(dsB[idx]) to $(dsE[idx]) is $(integ.area);
}
プロット操作・オブジェクト作成ツールバーのリスト太字はプログラミングで役立ちます。
ツールの番号 |
説明
|
0
|
ポインタ - ポインタはマウスのデフォルトの状態で、マウスはセレクタとして動作します。
|
1
|
拡大 - グラフ上で矩形を選択し、その矩形の範囲の軸で再スケールします。(グラフのみ)
|
2
|
スクリーンリーダ - ページ上のポイントの位置を読み込みます。
|
3
|
データリーダ - ページ上のデータポイントの位置を読み込みます。(グラフのみ)
|
4
|
データセレクタ - データ範囲を示すデータマーカをセットします。(グラフのみ)
|
5
|
マウスで作図 - グラフ上にデータポイントを描画します。(グラフのみ)
|
6
|
テキスト - テキスト注釈をページに追加します。
|
7
|
矢印 - 矢印をページに追加します。
|
8
|
曲線矢印 - 曲線矢印をページに追加します。
|
9
|
直線 - 直線をページに追加します。
|
10
|
四角形 - 四角形をページに追加します。
|
11
|
円 - 円図形をページに追加します。
|
12
|
多角形 - 多角形の図形をページに追加します。
|
13
|
折れ線 - 折れ線をページに追加します。
|
14
|
自由閉曲線 - 閉曲線をページに追加します。
|
15
|
自由曲線 - 自由曲線をページに追加します。
|
16
|
縮小 - グラフ上のクリックした場所を中心に縮小します。(グラフのみ)
|
17
|
領域データセレクタ - データ範囲を選択します。(グラフのみ)
|
18
|
領域マスクツール - データ範囲のポイントをマスクします。(グラフのみ)
|
|