for ループを使用してグラフ ボックスにグラフィックを追加するこんにちは、
for ループを使用してグラフ ボックスにグラフィックス (四角形) を追加しようとしています。 期待される結果は、31 個の長方形で構成される十字です。 コードを 1 行ずつ記述した作業スクリプトがありますが、それをより短く、よりスケーラブルにしたいと考えています。
以下のスクリプトが実行されていますが、グラフ ボックスには最後の四角形のみが表示されます。
「」の2行でスクリプトを書くと、グラフィックススクリプトの追加" (スクリプトの下部でコメントアウトされています) for ループの代わりに 2 つの四角形が追加されます。 for ループでも同じことができると予想していました。 どうすればそうさせることができますか?
Names default to here(1);
//dt that holds the parameters for the rectangles
dt_loc = open (momo_dir || "rectangle_locations.csv" );
//create a graphic box
base_box = graph Box(
Frame Size( 400, 400 ),
XName(""), XScale(19,81), yScale(19,91), SuppressAxes, Pen Color( 1 );
);
//define the frame box in which the rectangles will e displayed
framebox = base_box[frame box( 1 )];
//ran a for loop for all 31 rectangles to be added to the Base_box
For( f = 1, f <= N Rows(dt_loc), f++,
//f=1;
//location/sizes of each box is defined here based on a csv file
rec_left = dt_loc:left[f];
rec_top = dt_loc:top[f];
rec_right = dt_loc:right[f];
rec_bottom = dt_loc:bottom[f];
//add the graphic script to the base_box for each row (aka rectangle) in the table
framebox << Add Graphics Script(Rect(rec_left, rec_top, rec_right, rec_bottom, fill = 0););
); //end f for loop
try(close(dt_loc, no save));
//Running the following 2 lines will add 2 rectangles
//framebox << Add Graphics Script(Rect(40,75,50,70, fill = 0););
//framebox << Add Graphics Script(Rect(40,70,50,65, fill = 0););
cross_rep = New window ("Cross", vlistbox(base_box));自動化とスクリプト作成実験計画法マスカスタマイゼーションRe: for ループを使用してグラフ ボックスにグラフィックを追加するフォローアップの質問/コメントが 1 つあります。
dt_loc 変数はグラフ ボックスに渡されません。 それを機能させるための 2 つのオプションを見つけました。
- グラフ ボックス内で dt_loc テーブルを開きます (スクリプトのその部分でのみテーブルを使用する場合に機能します)
- dt_loc をグローバル変数にする (::dt_loc)
dt_loc 変数をグラフ ボックス内で使用できるようにする他の方法はありますか?
ありがとう
オーレ
Re: for ループを使用してグラフ ボックスにグラフィックを追加する同意します。 2 番目のスクリプトは非常に簡潔で要点を絞っています。 グラフ ボックスでも for ループを試してみましたが、スクリプトにエラーがあり、動作しなかったのでしょう。
どうもありがとう。
オーレ
Re: for ループを使用してグラフ ボックスにグラフィックを追加する完璧。 それはうまくいきました。 どうもありがとうございます。
オーレ
Re: for ループを使用してグラフ ボックスにグラフィックを追加するグラフィックス スクリプトは、後でグラフを更新する必要があるとき (ズームなど) に実行されます。 ある場合には変数を指定し、別の場合にはハードコードされた数値を指定しました。 変数はさまざまな方法で数値に変換できます。 私が通常これを行う方法は次のようになります。
eval(evalexpr(
framebox << Add Graphics Script(Rect(expr(rec_left), expr(rec_top), expr(rec_right), expr(rec_bottom), fill = 0););
));
これは変数を expr(...) でラップし、 evalexpr(...) を使用して expr(...) を実際の値に置き換え、 eval(...) を使用して evalexpr(...) によって返された式を評価します。 )。 おそらく他の人も自分の好みの方法を示すでしょう。 <編集> 好きです@txnelson 2番目の答え。
Re: for ループを使用してグラフ ボックスにグラフィックを追加するスクリプトが必要以上に複雑になってしまいました。以下にスクリプトを 2 つ修正しました。1 つ目は、フローを取得して、それを動作モデルに変換することです。2つ目は、あなたもリクエストしたように、非常に簡潔(小さく)にすることです。
Names Default To Here( 1 );
//dt that holds the parameters for the rectangles
dt_loc = Open( momo_dir || "rectangle_locations.csv" );
//create a graphic box
base_box = Graph Box(
Frame Size( 400, 400 ),
XName( "" ),
X Scale( 19, 81 ),
Y Scale( 19, 91 ),
SuppressAxes,
Pen Color( 1 );
//ran a for loop for all 31 rectangles to be added to the Base_box
For( f = 1, f <= N Rows( dt_loc ), f++,
// location/sizes of each box is defined here based on a csv file
rec_left = dt_loc:left[f];
rec_top = dt_loc:top[f];
rec_right = dt_loc:right[f];
rec_bottom = dt_loc:bottom[f];
// Draw the rectangle
Rect( rec_left, rec_top, rec_right, rec_bottom, fill = 0 );
);
);
Try( Close( dt_loc, no save ) );
cross_rep = New Window( "Cross", V List Box( base_box ) );
Names Default To Here( 1 );
//dt that holds the parameters for the rectangles
dt_loc = Open( momo_dir || "rectangle_locations.csv" );
cross_rep = New Window( "Cross",
//create a graphic box
base_box = Graph Box(
Frame Size( 400, 400 ),
XName( "" ),
X Scale( 19, 81 ),
Y Scale( 19, 91 ),
SuppressAxes,
Pen Color( 1 );
//ran a for loop for all 31 rectangles to be added to the Base_box
For( f = 1, f <= N Rows( dt_loc ), f++,
// location/sizes of each box is defined here based on a csv file
Rect( dt_loc:left[f], dt_loc:top[f], dt_loc:right[f], dt_loc:bottom[f] );
);
)
);
Try( Close( dt_loc, no save ) );