Salut,
À partir d'un tableau à deux colonnes définissant les coordonnées X et Y, j'essaie de créer une boîte graphique avec un descripteur interactif pour chaque point défini dans le tableau. L'ajout de poignées une par une (voir nw1 ci-dessous) fonctionne parfaitement, mais lorsque j'essaie d'automatiser le processus à l'aide de ForEachRow ou d'une boucle For (voir nw2 et nw3), une boîte de graphe contenant les points s'affiche. déplacé de manière interactive. Quel serait le bon moyen d'automatiser la création des poignées?
Merci Etienne
dt = NewTable ( "Points de données" , AddRows ( 3 ),
NewColumn ( "xVar" , Numérique, "Continu" , SetValues ([ 1 , 2 , 3 ])),
NewColumn ( "yVar" , Numérique, "Continu" , SetValues ([ 1 , 2 , 3 ]))
)
CurrentDataTable (dt);
nw1 = Nouvelle fenetre ( "Exemple 1" ,
gr1 = GraphBox (
Taille du cadre( 400 , 400 ), XScale ( 0 , 5 ), YScale ( 0 , 5 ),
Manipuler (: xVar [ 1 ],: yVar [ 1 ],: xVar [ 1 ] = x; : yVar [ 1 ] = y;);
Manipuler (: xVar [ 2 ],: yVar [ 2 ],: xVar [ 2 ] = x; : yVar [ 2 ] = y;);
Manipuler (: xVar [ 3 ],: yVar [ 3 ],: xVar [ 3 ] = x; : yVar [ 3 ] = y;);
)
)
nw2 = Nouvelle fenetre ( "Exemple 2" ,
gr2 = GraphBox (
Taille du cadre( 400 , 400 ), XScale ( 0 , 5 ), YScale ( 0 , 5 ),
ForEachRow (
Manipuler (: xVar,: yVar,: xVar = x;: yVar = y;);
)
)
)
nw3 = Nouvelle fenetre ( "Exemple 3" ,
gr3 = GraphBox (
Taille du cadre( 400 , 400 ), XScale ( 0 , 5 ), YScale ( 0 , 5 ),
Pour (i = 1 , je <= NRows (dt), i ++,
Manipuler (: xVar [i],: yVar [i],: xVar [i] = x;: yVar [i] = y;);
)
)
)
Merci @cwillden . Votre solution fonctionne parfaitement et est évolutive. Cela me rappelle le code macro SAS, qui correspond essentiellement à ce que j’essayais de faire ici, c’est-à-dire d’écrire la boucle for puis de l’exécuter.
salut @rassart ,
Dans ce cas, vous devez coder en dur les valeurs de ligne de votre table lors de l’ajout des descripteurs. La raison devient évidente lorsque vous récupérez le script graphique que vous venez de créer en dehors de la zone graphique de votre fenêtre. Par exemple, le script graphique de l'exemple 3 ressemble à ceci:
gr3 << Get Graphics Script;
/*:
{For( i = 1, i <= N Rows( dt ), i++,
Handle(
:xVar[i],
:yVar[i],
:xVar[i] = x;
:yVar[i] = y;
)
)}La valeur finale de la variable "i" sera définie sur 4 avec votre exemple, de sorte qu'aucun des descripteurs ne fonctionnera correctement car la valeur de "i" n'était pas codée en dur. Sans codage en dur, le script graphique s'appuiera toujours sur la valeur actuelle de «i».
Voici un moyen de coder en dur ces valeurs en utilisant une boucle 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;));" ) ) )
);
Apparemment, la fonction Handle () n'est pas capable de gérer l'analyse au moment de l'exécution. Le script suivant compensera cette
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;
);
)
);