使用 for 循环将图形添加到图形框你好,
我正在尝试使用 for 循环将图形(矩形)添加到图形框中。 预期结果是由 31 个矩形组成的十字。 我有一个工作脚本,我在其中逐行编写代码,但希望使其更短且更具可扩展性。
下面的脚本正在运行,但图形框中仅显示最后一个矩形。
当我用两行“编写脚本时添加图形脚本"(在脚本底部注释掉),它添加了 2 个矩形,而不是 for 循环。 我本来希望 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));自动化和脚本编写实验设计大规模定制回复:使用 for 循环将图形添加到图形框一个后续问题/评论。
dt_loc 变量未传递到图形框中。 我发现有两个选项可以让它工作:
- 打开图形框中的 dt_loc 表(如果我仅在脚本的该部分使用该表,则该表有效)
- 使 dt_loc 成为全局变量 (::dt_loc)
有没有其他方法可以使 dt_loc 变量在图形框中可用?
谢谢
奥莱
回复:使用 for 循环将图形添加到图形框我同意。 第二个脚本确实简洁明了。 我也尝试了图形框中的 for 循环,但脚本中一定存在错误,导致其无法工作。
多谢。
奥莱
回复:使用 for 循环将图形添加到图形框完美的。 那行得通。 非常感谢。
奥莱
回复:使用 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(...) 返回的表达式)。 其他人可能会表现出他们喜欢的方式。 <编辑>我喜欢@tx尼尔森第二个答案。
回复:使用 for 循环将图形添加到图形框您使脚本变得比需要的复杂得多。以下是对您的脚本的 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 ) );