for 루프를 사용하여 그래프 상자에 그래픽 추가안녕,
for 루프를 사용하여 그래프 상자에 그래픽(사각형)을 추가하려고 합니다. 예상되는 결과는 31개의 직사각형으로 이루어진 십자가입니다. 코드를 한 줄씩 작성하는 작업 스크립트가 있지만 코드를 더 짧고 확장 가능하게 만들고 싶습니다.
아래 스크립트가 실행 중이지만 그래프 상자에는 마지막 직사각형만 표시됩니다.
"라는 두 줄의 스크립트를 작성할 때 그래픽 스크립트 추가 "(스크립트 하단에 주석 처리됨) for 루프 대신 2개의 직사각형이 추가됩니다. 나는 for-loop가 동일한 작업을 수행할 것으로 기대했을 것입니다. 그렇게 하려면 어떻게 해야 합니까?
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 루프를 사용하여 그래프 상자에 그래픽 추가하나의 후속 질문/의견입니다.
dt_loc 변수는 그래프 상자에 전달되지 않습니다. 작동하도록 하는 두 가지 옵션을 찾았습니다.
- 그래프 상자 내부의 dt_loc 테이블을 엽니다(스크립트의 해당 부분에서만 테이블을 사용하는 경우 작동함).
- dt_loc를 전역 변수로 만듭니다(::dt_loc).
그래프 상자 내에서 dt_loc 변수를 사용할 수 있게 만드는 다른 방법이 있습니까?
감사해요
올레
Re: for 루프를 사용하여 그래프 상자에 그래픽 추가나는 동의한다. 두 번째 스크립트는 정말 간결하고 요점이 명확합니다. 그래프 상자에서도 for-loop를 시도했지만 작동을 방해하는 스크립트에 오류가 있었던 것 같습니다.
정말 감사합니다.
올레
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 두 번째 답변.
Re: 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 ) );