Página 5 de 5 PrimerPrimer ... 345
Resultados 61 al 68 de 68

Tema: Script en 3ds Max

  1. #61
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,851

    Script en max

    Yo lo estaba haciendo mucho más complicado. Basándome en esto: Bledingobjs = bledingobj, items. Bledinglist = (bledingobj, selection as array).

    Indexbled = bledinglist[1].

    Print bledingobjs[indexbled].

    Y ahora me disponía a sustituir las dos últimas líneas por expresiones para recorrer las listas auténticas.

    Lo que es saber.

    Me postro ante tí de nuevo Halfvector, no me queda otra.
    E moet roeien met de riemen die je hebt.

  2. #62
    Fecha de ingreso
    Oct 2002
    Mensajes
    8,617

    Script en max

    A mí siempre me pasa, hago una tontería, 10 líneas de código, viene un programador del Studio yy hace lo mismo con una sola línea y en menos de 30 se, g, vamos sin sentarse. Saludos.

  3. #63
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,851

    Script en max

    Hola de nuevo. Bueno, el curso ya terminó con mi script a mitad (no me extraña, para un primer script me he metido en una buena).

    Estoy muy liada con mil cosas, pero lo voy a terminar. No se cuando, pero bueno.

    He estado pensando un poco y una de las cosas nuevas que no había pensado es que el sistema de partículas debe estar enlazado al objeto que sangra, por el tema de que se pueda mover. Imagino que tendré que enlazarlo al polígono más cercano, manteniendo la normal como dirección de sangrado.

    Los hachas del Maxscript, ¿se podría conseguir o hay alguna limitación del lenguaje?
    Otro de los problemas más gordos que tengo ahora mismo es que no sé cómo hacer para leer un input escrito por el usuario (¿eso se llama parsing?) y sobre todo hacer control de errores.

    Cualquier tutorial o referencia me vendría bien, yo voy a ir mirando código de aquí y, allá por si encuentro alguna pista de cómo se hace (de nuevo la ayuda de max, es que flipo).
    E moet roeien met de riemen die je hebt.

  4. #64
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Script en max

    He estado pensando un poco y una de las cosas nuevas que no había pensado es que el sistema de partículas debe estar enlazado al objeto que sangra, por el tema de que se pueda mover. Imagino que tendré que enlazarlo al polígono más cercano, manteniendo la normal como dirección de sangrado.
    Si el objeto no sufre deformaciones (modificador skin, bend, etc) debería bastar con emparentar el sistema de partículas con el objeto con el que colisionó):
    Código:
    particle flowobject, parent = targetobject
    Si hay deformaciones, la cosa sería más complicada.
    Otro de los problemas más gordos que tengo ahora mismo es que no sé cómo hacer para leer un input escrito por el usuario (¿eso se llama parsing?
    Me imagino que te refieres a presentar al usuario un cuadro de diálogo donde introduzca información.

    En ese caso, hace un tiempo cree un diálogo de ese tipo y lo encapsulé en una estructura:
    Código:
    structure inputdialog (ttext = undefined tdlgvalue = undefined tdlgtitle = input tdlgmessage = enter value: tfn show message title:input = t(t if title.= undefined do dlgtitle = title if message.= undefined do dlgmessage = message ut roinputdlg dlgtitle width:264 height:83 (t local okpressed = false label lblmessage enter value: pos:[8,8] width:252 height:16 edittext txtinput pos:[4,24] width:255 height:17 button btnok ok pos:[104,51] width:70 height:20 button btncancel cancel pos:[184,51] width:70 height:20 t on roinputdlg open do (t lblmessage, text = dlgmessage ) on roinputdlg close do (t if not okpressed do dlgvalue = #cancel ) on btnok pressed do (t if txtinput, text.= do (t dlgvalue = #ok okpressed = true text = txtinput, text destroydialog roinputdlg ) ) on btncancel pressed do (t dlgvalue = #cancel okpressed = false destroydialog roinputdlg ) ) createdialog roinputdlg modal:true t return dlgvalue t).
    )
    Y luego para usarlo sería:
    Código:
    input = inputdialog().
    
    If (input, show your name:) == #ok do tmessagebox (your name is = + input, text)
    Por otra parte, si además quieres permitir al usuario que introduzca expresiones, lo que tendrás que hacer es utilizar la función execute:
    Código:
    input = inputdialog().
    
    If (input, show enter value:) == #ok do tmessagebox (value = + (execute input, text))
    Así, si el usuario introduce la expresión 3*2, execute devolverá 6.
    Y sobre todo hacer control de errores.
    Pues aparte de los if/then/else, también suelo utilizar try/catch (es como en C++) para bloques de código que pueden petar a mitad de ejecución (errores en tiempo de ejecución) y no habría forma de saberlo de otra forma. Por ejemplo:
    Código:
    try (deleete $point01) catch (print ese objeto no existe\n)
    Aunque este caso en concreto se podría solucionar con un if:
    Código:
    if $point01 == undefined do print ese objeto no existe\n
    Busca en la referencia de Maxscript por try expression. Ahí también encontraras la función throw que te permite generar tus propios errores en tiempo de ejecución. Saludos.
    Última edición por HalfVector; 15-08-2006 a las 21:54

  5. #65
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Script en max

    Me he dado cuenta de que no retornaba #cancel al cerrar el diálogo con el botón estándar (el de la esquina superior derecha) de Windows. Lo he corregido en el mensaje de arriba. Saludos.

    Posdata: bueno, pues parece que hay algún que otro problema más con el código que he puesto. No sé cómo en su día lo di por bueno. Cuando pueda lo arreglo.

    Postdata 2: ok, creo que ya está arreglado.
    Última edición por HalfVector; 15-08-2006 a las 21:52

  6. #66
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,851

    Script en max

    Muchas gracias half. Esta tarde haré unas pruebas. El input del usuario es más complejo porque tiene que meter rangos de frames y frames sueltos (como el script de Slime). Probaré un poco y leeré tu código a ver cómo lo hago.
    E moet roeien met de riemen die je hebt.

  7. #67
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Script en max

    El input del usuario es más complejo porque tiene que meter rangos de frames y frames sueltos (como el script de Slime).
    Vaya, entonces sí, es lo que decías, hay que crear un pequeño parser. Acabo de crear uno. No está muy probado, pero aparentemente funciona.
    Código:
    Fn parseframes strframes = (t- Array donde se almacenaran los frames como enteros tlocal frames = #() t- Extraemos los frames que están separados por comas tlocal tokens = filterstring strframes, t- Si no hay frames, salimos tif tokens, count == 0 do (t return undefined t) t- Recorremos todos los tokens (frames, ya sean sueltos o en forma de intervalos) tfor token in tokens do (t - Si no encontramos el carácter - Significa que es un frame suelto if (findstring token -) == undefined then (t - Nos aseguramos que el frame no exista ya en el array de frames if (finditem frames (token as integer)) == 0 do (t - Replaceamos el frame en el array de frames append frames (token as integer) ) ) - Estamos en el caso de un intervalo de frames else (t - Troceamos la cadena, de forma que tendremos dos frames local interval = filterstring token - - Si no tenemos frames o tenemos más de dos frames, salimos if interval, count == 0 or interval, count > 2 do (t return undefined ) t - Para simplificar, almacenamos el frame inicial y final local startframe = interval[1] as integer local endframe = interval[2] as integer - No permitimos que el frame final sea menor que el inicial if startframe > endframe then (t return undefined ) - Si el frame inicial y final son iguales, replaceamos uno de ellos else if startframe == endframe then (t - Nos aseguramos que el frame no exista ya en el array de frames if (finditem frames startframe) == 0 do (t - Replaceamos el frame en el array de frames append frames startframe ) ) - Si llegamos aquí es que tenemos un intervalo valido else (t - Ahora vamos a recorrer el rango y a generar los frames intermedios for frame = startframe todo endframe do (t - Nos aseguramos que el frame no exista ya en el array de frames if (finditem frames frame) == 0 do (t - Replaceamos el frame en el array de frames append frames frame ) ) ) ) t) t- Ordenamos el array de frames tsort frames t- Retornamos el array de frames treturn frames.
    )
    Su funcionamiento:
    Código:
    parseframes 2,4,7-10,12-16
    En ese caso la función te devolverá (de forma ordenada) un array de enteros con todos los frames:
    Código:
    #(2, 4, 7, 8, 9, 10, 12, 13, 14, 15, 16)
    Me imagino que más o menos es eso a lo que te referías. Saludos.
    Última edición por HalfVector; 16-08-2006 a las 10:36

  8. #68
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,851

    Script en max

    Hola. No, no he vuelto. No estoy programando esto por ahora, lo retomaré en un tiempo que estoy liada. Lo que pasa es que, a raíz del hilo de CGtalk del que hablaba Miguel he puesto una captura de pantalla allí y que menos que ponerla aquí también, como veis está bastante a medias.

    Pero tengamos en cuenta mi experiencia nula con el Maxscript y que me he puesto a programar este año, piedad.

    -- IMÁGENES ADJUNTAS --
    Miniaturas adjuntas Miniaturas adjuntas UI_03.jpg  
    E moet roeien met de riemen die je hebt.

Página 5 de 5 PrimerPrimer ... 345

Temas similares

  1. Script 3ds Max md2
    Por Jhonatan00_00 en el foro Plugins y Scripts
    Respuestas: 4
    : 21-10-2016, 09:53
  2. Respuestas: 2
    : 07-05-2015, 22:08
  3. Cómo cambiar un script a un macro script
    Por Miguel-Arte-3D-1990 en el foro Plugins y Scripts
    Respuestas: 11
    : 11-03-2012, 22:07
  4. Pf script
    Por Zuria en el foro Plugins y Scripts
    Respuestas: 6
    : 18-05-2010, 16:09
  5. Script rpc 2,5d
    Por marvin2k en el foro Plugins y Scripts
    Respuestas: 1
    : 14-10-2007, 19:38