Liste dynamique des boutons liés aux scripts dans un dossierSalut l'équipe JMP !
J'espérais obtenir des conseils sur la façon dont je pourrais avoir une fenêtre dynamique avec des boutons qui créeraient des liens vers les scripts se trouvant dans un dossier référencé. Donc, si j'avais deux scripts dans le dossier, j'aurais une fenêtre avec deux boîtes de boutons. Si j’en avais 50, j’aurais 50 boîtes à boutons. Idéalement, il pourrait y avoir un moyen d'indiquer dynamiquement à la fenêtre dans combien de "colonnes" organiser les boîtes de boutons.
Toute aide serait appréciée!
Steve
Automatisation et scriptsRe : Liste dynamique des boutons liés aux scripts dans un dossierVoici un exemple utilisant les scripts installés comme exemples pour JMP. La référence du répertoire doit être modifiée de JMPPRO en JMP si vous n'avez pas JMPPRO. Le numéro de version 18 doit également être remplacé par votre numéro de version.
Names Default To Here( 1 );
dir = "C:\Program Files\JMP\JMPPRO\18\Samples\Scripts";
files = Files In Directory( dir );
For( i = N Items( files ), i >= 1, i--,
If( Word( -1, files[i], "." ) != "jsl",
Remove From( files, i, 1 )
)
);
theExpr = "";
For Each( {scr}, files,
theExpr = theExpr || ",ButtonBox(\!"" || Word( -2, scr, "./\" ) || "\!", include(\!""
|| dir || "\" || scr || "\!") )"
);
Eval(
Parse(
"nw = New Window( \!"Scripts\!",
Outline Box( \!"Select Script to Run\!",
Lineup Box( N Col( 4 )"
|| theExpr || " )
)
);"
)
);

Je préfère ne pas utiliser la méthodologie Eval(Parse()), mais il s'est avéré trop tard pour que je puisse travailler sur une version de syntaxe plus lisible. Cette méthode fait le travail. Recherchez d’autres membres de la communauté pour améliorer mon code.
Re : Liste dynamique des boutons liés aux scripts dans un dossier@txnelson Vous ne pensez peut-être pas que ce soit le code le plus propre, mais il fonctionne à merveille ! Merci pour l'aide et la réponse rapide !!
Steve
Re : Liste dynamique des boutons liés aux scripts dans un dossier
Re : Liste dynamique des boutons liés aux scripts dans un dossierUne version un peu différente du code de Jim (Filter Each pour obtenir la liste des fichiers .jsl, Eval(EvalExpr()) pour ajouter des boutons avec les chemins)
Names Default To Here(1);
dir = "$SAMPLE_SCRIPTS/";
dir = Convert File Path(dir, windows);
files = Files In Directory(dir);
jslfiles = Filter Each({filename}, files, Word(-1, filename, ".") == "jsl");
// Not sure how you would like to determine column count, but with Lineup box it is fairly easy
lub = Lineup Box(N Col(4));
For Each({filename}, jslfiles,
Eval(EvalExpr(
lub << Append(Button Box(filename,
nw = New Window(Expr(filename),
Script Box(Load Text File(Expr(dir || filename)), "JSL", 600, 600)
);
));
));
);
nw = New Window("Scripts in " || dir,
Outline Box("Click to Open a Script",
lub
);
);
En fonction de ce que vous faites, vous pouvez également envisager d'avoir une fonction/expression appelée par chacun des boutons. Le faire de manière robuste demande cependant un peu de travail supplémentaire, donc savoir comment créer ces solutions plus simples est toujours une bonne idée.
Re : Liste dynamique des boutons liés aux scripts dans un dossier@jthi et @txnelson Si je pouvais réfléchir encore une fois à ce sujet :
Si je voulais ajouter une zone d'édition de numéro qui avait la valeur de la zone d'alignement, puis une zone de bouton sur laquelle appuyer, cela appliquerait la valeur dans la zone d'édition de numéro pour changer l'orientation des boutons de script dans la fenêtre, comment cela se ferait-il regarder?
Donc quelque chose comme ça

Re : Liste dynamique des boutons liés aux scripts dans un dossierCela pourrait donner une idée de comment procéder
Names Default To Here(1);
init_cols = 4;
dir = "$SAMPLE_SCRIPTS/";
dir = Convert File Path(dir, windows);
files = Files In Directory(dir);
jslfiles = Filter Each({filename}, files, Word(-1, filename, ".") == "jsl");
// Not sure how you would like to determine column count, but with Lineup box it is fairly easy
lub = Lineup Box(N Col(init_cols));
For Each({filename}, jslfiles,
Eval(EvalExpr(
lub << Append(Button Box(filename,
nw = New Window(Expr(filename),
Script Box(Load Text File(Expr(dir || filename)), "JSL", 600, 600)
);
));
));
);
nw = New Window("Scripts in " || dir,
Outline Box("Click to Open a Script",
V List Box(
Lineup Box(N Col(2),
Button Box("Press to update Col count", << Set Function(function({this},
lub << N Col((this << sib) << get)
))),
Number Edit Box(init_cols)
),
lub
)
);
);
La boîte d'édition de numéro peut également se déclencher lors de la validation (<< Set Function()) / changement (<< Set Number Changed()), vous n'avez donc pas nécessairement besoin d'un bouton.