ajouter un graphique à une boîte graphique à l'aide d'une boucle forSalut,
J'essaie d'ajouter des graphiques (rectangles) à une zone graphique en utilisant une boucle for. Le résultat attendu est une croix composée de 31 rectangles. J'ai un script de travail dans lequel j'ai écrit le code ligne par ligne, mais j'aimerais le rendre plus court et plus évolutif.
Le script ci-dessous est en cours d'exécution mais seul le dernier rectangle sera affiché dans la zone graphique.
Quand j'écris le script avec 2 lignes de " Ajouter un script graphique " (commenté au bas du script) au lieu de la boucle for, il ajoute 2 rectangles. Je m'attendais à ce qu'une boucle for fasse la même chose. Comment puis-je l'obtenir?
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));Automatisation et scriptsConception d'expériencesPersonnalisation de masseRe : ajout d'un graphique à une zone graphique à l'aide d'une boucle forUne question/commentaire complémentaire.
La variable dt_loc n'est pas transmise dans la zone graphique. J'ai trouvé deux options pour le faire fonctionner :
- ouvrez la table dt_loc à l'intérieur de la zone graphique (ce qui fonctionne si je n'utilise la table qu'à cette partie du script)
- faire de dt_loc une variable globale (::dt_loc)
Existe-t-il un autre moyen de rendre la variable dt_loc disponible dans la zone graphique ?
Merci
Olé
Re : ajout d'un graphique à une zone graphique à l'aide d'une boucle forJe suis d'accord. Le 2ème script est vraiment concis et précis. J'ai également essayé la boucle for dans la zone graphique, mais il doit y avoir une erreur dans le script qui l'a empêché de fonctionner.
Merci beaucoup.
Olé
Re : ajout d'un graphique à une boîte graphique à l'aide d'une boucle forParfait. Ça a marché. Merci beaucoup.
Olé
Re : ajout d'un graphique à une zone graphique à l'aide d'une boucle forle script graphique s'exécute plus tard, chaque fois que le graphique doit être mis à jour (zoom, etc.). Vous avez spécifié des variables dans un cas et des nombres codés en dur dans l'autre. Vous pouvez convertir les variables en nombres de plusieurs manières. La façon dont je procède habituellement ressemble à ceci :
eval(evalexpr(
framebox << Add Graphics Script(Rect(expr(rec_left), expr(rec_top), expr(rec_right), expr(rec_bottom), fill = 0););
));
qui enveloppe les variables avec expr(...), utilise evalexpr(...) pour remplacer expr(...) par la valeur réelle et utilise eval(...) pour évaluer l'expression renvoyée par evalexpr(... ). Il est probable que d’autres personnes montreront leurs méthodes préférées. J'aime @txnelson 2ème réponse.
Re : ajout d'un graphique à une zone graphique à l'aide d'une boucle forVous avez rendu le script beaucoup plus complexe qu'il ne devrait l'être.Vous trouverez ci-dessous 2 refontes de votre script.La première consiste à prendre votre flux et à le convertir simplement en un modèle fonctionnel.La seconde consiste à le rendre très concis (petit) comme vous l'avez également demandé.
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 ) );