-
Rollout dinamico
Hola estoy haciendo pruebas con el script y necesito crear uts dinámicos, por ejemplo: Teniendo el ut a con un botón y un spinner. Al presionar dicho botón genere un ut nuevo con un cierta cantidad de checkbox o buttons etc, y una vez ya creado el ut b pueda modificar la cantidad de checkbox variando el valor del spinner del ut a.
Buscando en el Maxscript reference encontré el utcreator empezaré a hacer pruebas con él.
Rci = utcreatorrdg rdg_rcsample rdg:rollout.
Rci, begin().
Rci, opengroup the group.
Rci, addcontrol #button #thebutton thebutton paramstr:width:140.
Rci, closegroup().
Createdialog (rci, end())).
Un amigo me dijo que hay otra forma que es metiendo el código del ut en variables de tipo string y haciendo después un execute de esa variable que contiene el código completo. Si alguien tiene más información al respecto se lo agradecería, o que debería poner en el buscador del Maxscript reference.
Vaya, creo que es esto a lo que mi amigo se refería, buscando en CGtalk encontré algo como esto.
Globcounter = 1.
Fn buttonpress i = (tmessagebox (button + i as string + pressed)).
Fn buildrollout = (ts = stringstream tformat ut test \test\ (\nTo:s tformat button btn_doit \do it\\nTo:s t, etc.
Etc.
Etc.
Etc.
Etc.
Etc texecute (s as string)).
Buildrollout().
Createdialog test.
-
Para crear rollouts dinámicos en MaxScript actualmente, tienes dos enfoques principales. El método recomendado y más robusto es usar la clase rolloutCreator, ya que está diseñada específicamente para esto y evita problemas de seguridad y gestión de memoria asociados con execute.
El método con execute, que convierte código en string y lo ejecuta, es más antiguo y propenso a errores. Puede ser difícil de depurar y no es la práctica más segura.
Para tu caso específico, donde el UT A controla la creación y modificación del UT B, te recomiendo usar rolloutCreator. La estructura básica sería así. Primero, creas el rollout principal (UT A) con su botón y spinner. En el manejador del botón, escribes la lógica para construir un nuevo rollout (UT B) usando rolloutCreator. Dentro de esta lógica, usas el valor del spinner para determinar cuántos checkboxes o botones agregar en un bucle.
Debes almacenar la referencia al rollout dinámico creado en una variable global o una estructura de datos para poder acceder a él más tarde. Luego, en el manejador de cambio del spinner del UT A, puedes destruir el diálogo existente del UT B y volver a crearlo con la nueva cantidad de controles usando la misma función de construcción.
Un punto crucial es la gestión de los controladores de eventos (event handlers) para los controles dinámicos. Debes asignarles funciones que puedan identificar qué control fue presionado, a menudo pasando un índice o un nombre único como parámetro.
Para buscar más información en la MaxScript Reference, enfócate en las palabras clave rolloutCreator, createDialog, y destroyDialog. También busca ejemplos sobre addControl y cómo definir manejadores para controles creados dinámicamente.
La clave está en separar la función que construye el rollout secundario en una función independiente que reciba como parámetro el número de elementos a crear. Esta función debe usar rolloutCreator para agregar los controles en un bucle y luego devolver el rollout terminado. Así, tanto el botón inicial como el cambio en el spinner pueden llamar a esta función para recrear la interfaz.