[maxscript] re-decalarar función dentro de botones de forma dinámica?
Hola, estoy haciendo un script que hace una serie de acciones y como resultado final agrega ciertos controles a un attribute holder, entre esos controles hay varios botones que comparten funciones entre sí, estas funciones están declaradas en el script generador, pero para que luego funcionen con la UI necesito declararla en cada botón y ahí reside mi inquietud, se puede declarar esa función, pero sin reescribirla/copiarla manualmente en cada botón?
No es el caso, pero quizás sirve para explicar lo que me gustaría lograr, en XSI se pasan las funciones para los botones como string (toda la declaración) y existen funciones como el tostring (jscript) que justamente retorna la declaración de una función como string sin necesidad de reescribirla, en el fondo queda reescrita, pero es dinámico. Busco algo como eso, pero bajo el contexto de Maxscript, existe alguna forma?
Pensé que una alternativa sería usar un macro script para cada función compartida, en teoría debería funcionar, pero me gustaría que para usar el resultado final del script no fuera necesario tener instalado nada extra en 3dsmax, son funciones simples y no tendría sentido. Gracias.
[maxscript] re-decalarar función dentro de botones de forma dinámica?
Cesar, tienes todo mi respeto y admiración. Porque no he entendido nada. Y no es porque no te expliques bien.
[maxscript] re-decalarar función dentro de botones de forma dinámica?
Así a bote pronto, se me ocurre que tal vez puedas usar la función filein() en cada botón, y que los comandos de cada botón apunten a ese archivo. Es decir, tener un archivo común con todas las funciones necesarias (en un structure, por ejemplo), y que cada botón, después de llamar a ese archivo, ejecute lo que tenga que ejecutar.
Pero esto ya implica que necesites dicho archivo en la máquina. ¿Qué te traes entre manos?
[maxscript] re-decalarar función dentro de botones de forma dinámica?
Javascript tostring me parece que es como mxs as string, pero no sabía que se podía hacer eso con funciones en js. Y si quieres interpretar un string como código, seria execute ().
También podrías guardar funciones/structs en un mismo maxwrapper, y acceder a ellas usando Weak referencias o pathnames.
Si es que entiendo correctamente.
[maxscript] re-decalarar función dentro de botones de forma dinámica?
Muchas gracias por las respuestas, esto se pone interesante.
Cita:
Así a bote pronto, se me ocurre que tal vez puedas usar la función filein() en cada botón, y que los comandos de cada botón apunten a ese archivo. Es decir, tener un archivo común con todas las funciones necesarias (en un structure, por ejemplo), y que cada botón, después de llamar a ese archivo, ejecute lo que tenga que ejecutar.
No es mala idea, no sabía de esa función y nunca me he puesto con el Struts, lo voy a investigar. Si se pudiera llamar sólo ciertas funciones del archivo importado (tipo Python) podría funcionar, gracias IkerClon.
Cita:
Iniciado por
oruramuqo
javascript tostring me parece que es como mxs as string, pero no sabía que se podía hacer eso con funciones en js.
Y si quieres interpretar un string como código, seria excute ().
También podrías guardar funciones/structs en un mismo maxwrapper, y acceder a ellas usando Weak referencias o pathnames.
Si es que entiendo correctamente.
Hey, no es mala idea, a ver si entiendo bien:
Creo un custom attribute y en uno de los parámetros asigno un float script donde guardo mi función, luego con un execute controller, script podría cargar la función desde el botón, me gusta la idea.
Sólo me queda una duda, existe forma de pasar toda la declaración de la función como string sin reescribirla (por el tema de los caracteres especiales y tal)? Porque el as string hasta ahora sólo he logrado que me exprese el retorno de la función o bien el nombre de la misma.
De todas formas, escribir la función 1 vez como string en lugar de copiarla por doquier me parece que se acerca mucho a lo que necesito, gracias.
____________________________
Edito: a ver si con un ejemplo nos entendemos mejor.
Supongamos tengo la función holamundo declarada de la siguiente forma en el script generador.
Código:
Fn holamundo =
(.
Print hola mundo.
)
Existe alguna función que retorne la declaración de la función como un string para no tener que escribirla manualmente? Algo así:
Código:
Fn holamundo = \n+\.
(\n+\.
Print \hola mundo.\ \n+\.
)
[maxscript] re-decalarar función dentro de botones de forma dinámica?
Según te entiendo, quieres que tus funciones estén dentro de max, pero no quieres copiarlas una y otra ve, z.
Código:
cat = attributes test.
Redefine:cat.
(Tfn moder x y=(t val = mod x y return val t)).
Custattributes, add $ Cat
> es decir, escribes adentro todas tus funciones/structs.
> luego accedes a ellas así:
$box02.moder 7. 5.2.
Código:
cat = attributes saveme.
Redefine:cat.
(Tlocal doit tparameters main ut:Mad t(t b1 type:#bolean ui:ub1 t) trollout Mad Mad t(t button ub1 press type:#bolean t on ub1 pressed do (t doit = ($box02.moder 7. 5.2) doit += doit format the val is: %\nDoit ) t)).
Custattributes, add $ Cat
Edito: leyento tu ejemplo, pues no conozco de nada que retorne un string de esa maner, a, lo único es escribir una función que recre el ut dinámicamente así:
(ttest = stringstream tformat ut test\nTo:test tformat (\n\t\n)\nTo:test (test as string)).
En CGtalk, es que vi eso de los stringstream para formatear el string, y luego ejecutarlo usando execute ().
[maxscript] re-decalarar función dentro de botones de forma dinámica?
Cita:
Iniciado por
oruramuqo
según te entiendo, quieres que tus funciones estén dentro de max, pero no quieres copiarlas una y otra ve, z.
Código:
cat = attributes test.
Redefine:cat.
(Tfn moder x y=(t val = mod x y return val t)).
Custattributes, add $ Cat
> es decir, escribes adentro todas tus funciones/structs.
> luego accedes a ellas así:
$box02.moder 7. 5.2.
Que crack, no sabía que podía definir funciones directamente dentro de un Custom Attributes, muchas gracias.
[maxscript] re-decalarar función dentro de botones de forma dinámica?
Sólo por añadir más información al tema, y complementando lo que cuenta Duramune (por cierto, gracias por la información), puedes definir algo como esto:
Código:
Fn test arg1 arg2 =
(
Local str = str += attributes attr + arg2 + \r
Str += (\r
Str += parameters main ut:main_rlt\r
Str += (\r
Str += elemento1 type:#integer ui:elemento1_spn \r
Str += )\r
Str += \r
Str += ut main_rlt \probando + arg2 + \\r
Str += (\r
Str += spinner blend_spn \valor\ type:#integer range:[0,100,50] \r
Str += )\r
Str += ).
Return (execute str)
)
, y luego pasar ese código a un modificador/baseobject mediante:
Código:
custattributes, add objeto, modificador (test arg1 arg2)
[maxscript] re-decalarar función dentro de botones de forma dinámica?
No puedes declarar la función dentro del ut, pero afuera de los botones?
[maxscript] re-decalarar función dentro de botones de forma dinámica?
Cita:
No puedes declarar la función dentro del ut, pero afuera de los botones?
El script genera una configuración, pero se ejecuta sólo una vez, luego ya queda todo montado y si la función no está en memoria ningún botón funcionaría.
[maxscript] re-decalarar función dentro de botones de forma dinámica?
Si la función esta declarada dentro del ut del custom attribute que vas a asignar, esta quedaría en memoria y disponible para todo script que se ejecute dentro de algún evento del ut o de sus UI controls a partir del momento en el que el custom attribute sea asignado.
De cualquier forma también puedes declararla por fuera del ut mientras este dentro del custom attribute, así como lo mostró Duramune.