aggiunta di elementi grafici a una casella grafica utilizzando un ciclo forCIAO,
Sto cercando di aggiungere elementi grafici (rettangoli) a una casella grafica utilizzando un ciclo for. Il risultato atteso è una croce composta da 31 rettangoli. Ho uno script funzionante in cui ho scritto il codice riga per riga, ma vorrei renderlo più breve e più scalabile.
Lo script seguente è in esecuzione ma nella casella del grafico verrà visualizzato solo l'ultimo rettangolo.
Quando scrivo la sceneggiatura con 2 righe di " Aggiungi script grafico " (commentato in fondo allo script) invece del ciclo for aggiunge 2 rettangoli. Mi sarei aspettato che un ciclo for facesse lo stesso. Come posso farlo?
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));Automazione e scriptingProgettazione di esperimentiPersonalizzazione di massaRi: aggiunta di elementi grafici a una casella grafica utilizzando un ciclo forUna domanda/commento successivo.
La variabile dt_loc non viene passata nella casella del grafico. Ho trovato due opzioni per farlo funzionare:
- apri la tabella dt_loc all'interno della casella del grafico (che funziona se utilizzo la tabella solo in quella parte dello script)
- rendi dt_loc una variabile globale (::dt_loc)
Esiste un altro modo per rendere disponibile la variabile dt_loc all'interno della casella del grafico?
Grazie
Olè
Re: aggiunta di elementi grafici a una casella grafica utilizzando un ciclo forSono d'accordo. La seconda sceneggiatura è davvero concisa e va al punto. Ho provato anche il ciclo for nella casella del grafico, ma deve esserci stato un errore nello script che ne ha impedito il funzionamento.
Molte grazie.
Olè
Ri: aggiunta di elementi grafici a una casella grafica utilizzando un ciclo forPerfetto. Ha funzionato. Grazie mille.
Olè
Re: aggiunta di elementi grafici a una casella grafica utilizzando un ciclo forlo script grafico viene eseguito più tardi, ogni volta che il grafico deve essere aggiornato (zoom, ecc.). Hai specificato le variabili in un caso e i numeri codificati nell'altro. Puoi convertire le variabili in numeri in molti modi. Il modo in cui di solito lo faccio è simile a questo:
eval(evalexpr(
framebox << Add Graphics Script(Rect(expr(rec_left), expr(rec_top), expr(rec_right), expr(rec_bottom), fill = 0););
));
che racchiude le variabili con expr(...), utilizza evalexpr(...) per sostituire expr(...) con il valore effettivo e utilizza eval(...) per valutare l'espressione restituita da evalexpr(... ). Probabilmente altre persone mostreranno i loro modi preferiti. Mi piace @txnelson 2a risposta.
Ri: aggiunta di elementi grafici a una casella grafica utilizzando un ciclo forHai reso la sceneggiatura molto più complessa di quanto dovrebbe essere.Di seguito sono riportate 2 rielaborazioni del tuo script.Il primo è prendere il tuo flusso e convertirlo in un modello funzionante.Il secondo è renderlo molto conciso (piccolo) come anche tu richiesto.
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 ) );