Lista dinámica de botones vinculados a scripts en una carpeta¡Hola equipo de JMP!
Esperaba recibir orientación sobre cómo podría tener una ventana dinámica con botones que se vincularan a cualquier script que se encuentre en una carpeta de referencia. Entonces, si tuviera dos scripts en la carpeta, tendría una ventana con dos cuadros de botones. Si tuviera 50 entonces tendría 50 cajas de botones. Idealmente, podría haber una manera de decirle dinámicamente a la ventana en cuántas "columnas" organizar los cuadros de botones.
¡Cualquier ayuda sería apreciada!
esteban
Automatización y secuencias de comandosRe: Lista dinámica de botones vinculados a scripts en una carpetaA continuación se muestra un ejemplo que utiliza los scripts instalados como ejemplos para JMP. La referencia del directorio debe cambiarse de JMPPRO a JMP si no tiene JMPPRO. Además, el número de versión 18 debe cambiarse por su número de versión.
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 || " )
)
);"
)
);

Prefiero no utilizar la metodología Eval(Parse()), sin embargo, resultó que era demasiado tarde para trabajar en una versión de sintaxis más legible. Este método hace el trabajo. Busque otros miembros de la comunidad para mejorar mi código.
Re: Lista dinámica de botones vinculados a scripts en una carpeta@txnelson Puede que no sientas que es el código más limpio, ¡pero funciona de maravilla! ¡¡Gracias por la ayuda y la rápida respuesta!!
esteban
Re: Lista dinámica de botones vinculados a scripts en una carpeta
Re: Lista dinámica de botones vinculados a scripts en una carpetaUna versión un poco diferente del código de Jim (Filtrar cada uno para obtener una lista de archivos .jsl, Eval(EvalExpr()) para agregar botones con las rutas)
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
);
);
Dependiendo de lo que esté haciendo, también podría considerar tener una función/expresión a la que llame cada uno de los botones. Sin embargo, hacerlo de manera sólida requiere un poco de trabajo adicional, por lo que siempre es una buena idea saber cómo crear estas soluciones más simples.
Re: Lista dinámica de botones vinculados a scripts en una carpeta@jthi y @txnelson Si pudiera analizar su cerebro una vez más sobre esto:
Si quisiera agregar un cuadro de edición de números que tuviera el valor para el cuadro Alinear y luego un cuadro de botón para presionar que aplicaría el valor en el cuadro de edición de números para cambiar la orientación de los botones del script en la ventana, ¿cómo sería eso? ¿mirar?
Entonces algo como esto

Re: Lista dinámica de botones vinculados a scripts en una carpetaEsto podría darte una idea de cómo puedes hacerlo.
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
)
);
);
El cuadro de edición de número también puede activarse al confirmar (<< Establecer función())/cambiar (<< Establecer número cambiado()), por lo que no necesariamente necesita un botón.