Ciao,
Da una tabella con due colonne che definiscono le coordinate X e Y, sto provando a creare una casella di grafico con una maniglia interattiva per ogni punto definito nella tabella. Aggiungere maniglie una alla volta (vedi nw1 sotto) funziona perfettamente, ma quando provo ad automatizzare il processo usando ForEachRow o un ciclo For (vedi nw2 e nw3), ottengo una casella grafica con i punti, ma non possono essere spostato in modo interattivo. Quale sarebbe il modo corretto per automatizzare la creazione delle maniglie?
Grazie, Étienne
dt = nuovatabella ( "datapoints" AddRows ( 3 ),
newColumn ( "XVar" , Numerico, "Continuo" , SetValues ([ 1 , 2 , 3 ])),
newColumn ( "Yvar" , Numerico, "Continuo" , SetValues ([ 1 , 2 , 3 ]))
);
CurrentDataTable (Dt);
nw1 = Nuova finestra ( "Esempio 1" ,
gr1 = GraphBox (
Dimensione della cornice( 400 , 400 ), XScale ( 0 , 5 ), yScale ( 0 , 5 ),
Maniglia (: XVar [ 1 ],: yVar [ 1 ],: xVar [ 1 ] = x; : Yvar [ 1 ] = y;);
Maniglia (: XVar [ 2 ],: yVar [ 2 ],: xVar [ 2 ] = x; : Yvar [ 2 ] = y;);
Maniglia (: XVar [ 3 ],: yVar [ 3 ],: xVar [ 3 ] = x; : Yvar [ 3 ] = y;);
);
);
nw2 = Nuova finestra ( "Esempio 2" ,
gr2 = GraphBox (
Dimensione della cornice( 400 , 400 ), XScale ( 0 , 5 ), yScale ( 0 , 5 ),
ForEachRow (
Maniglia (: xVar,: yVar,: xVar = x;: yVar = y;);
);
);
);
nw3 = Nuova finestra ( "Esempio 3" ,
gr3 = GraphBox (
Dimensione della cornice( 400 , 400 ), XScale ( 0 , 5 ), yScale ( 0 , 5 ),
Per (I = 1 , io <= nRows (dt), i ++,
Maniglia (: xVar [i],: yVar [i],: xVar [i] = x;: yVar [i] = y;);
);
);
);
Grazie @cwillden . La tua soluzione funziona perfettamente ed è scalabile. Mi ricorda il codice macro SAS, che è essenzialmente quello che stavo cercando di fare qui, cioè scrivere il ciclo for e poi eseguirlo.
Ciao @rassart ,
Questo caso in cui è necessario codificare i valori della riga dalla tabella quando si aggiungono gli handle. La ragione diventa evidente quando ottieni lo script grafico appena creato fuori dalla finestra del grafico dalla tua finestra. Ad esempio, lo script grafico dell'esempio 3 ha un aspetto simile al seguente:
gr3 << Get Graphics Script;
/*:
{For( i = 1, i <= N Rows( dt ), i++,
Handle(
:xVar[i],
:yVar[i],
:xVar[i] = x;
:yVar[i] = y;
)
)}Il valore finale della variabile 'i' sarà impostato su 4 con il tuo esempio, quindi nessuno degli handle funzionerà correttamente poiché il valore di 'i' non è stato codificato in hard-in. Senza hard-coding, lo script grafico si baserà sempre sul valore corrente di "i".
Ecco un modo per codificare in modo sicuro questi valori utilizzando un ciclo for:
nw4 = New Window( "Example 4", gr4 = Graph Box( FrameSize( 400, 400 ), X Scale( 0, 5 ), Y Scale( 0, 5 ), ) );
For( i = 1, i <= N Rows( dt ), i++,
Eval( Parse( Eval Insert( "gr4[framebox(1)] << Add Graphics Script(Handle(:xVar[^i^], :yVar[^i^], :xVar[^i^] = x; :yVar[^i^] = y;));" ) ) )
);
Apparentemente la funzione Handle () non è in grado di gestire l'analisi al momento dell'esecuzione. Lo script seguente lo compenserà
Current Data Table( dt );
nw1 = New Window( "Example 1",
gr1 = Graph Box(
FrameSize( 400, 400 ),
X Scale( 0, 5 ),
Y Scale( 0, 5 ),
Handle(
:xVar[1],
:yVar[1],
:xVar[1] = x;
:yVar[1] = y;
);
Handle(
:xVar[2],
:yVar[2],
:xVar[2] = x;
:yVar[2] = y;
);
Handle(
:xVar[3],
:yVar[3],
:xVar[3] = x;
:yVar[3] = y;
);
)
);