Página 2 de 2 PrimerPrimer 12
Resultados 51 al 68 de 68

Script en 3ds Max

  1. #51
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,852

    Script en max

    Hola. Tengo una duda muy concreta, no encuentro nada al respecto y mi profesor pasa de mi cara, a ver si alguien me puede decir, tengo esto en algún lugar de la interfaz:
    Items: (for h in helpers collect h, name).

    Pero yo lo que quiero en realidad es que pille todos los tapes, no cualquier tipo de helper, y me invento cosas, pero no se las cree. Gracias.
    E moet roeien met de riemen die je hebt.

  2. #52
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Script en max

    Hola. Esto debería bastar:
    Código:
    for h in helpers where (classof h) == tape collect h, name
    Antes de representar el nombre del helper en la colección, se asegura que sea del tipo tape. Saludos.
    Última edición por HalfVector; 08-07-2006 a las 15:50

  3. #53
    Fecha de ingreso
    Oct 2002
    Mensajes
    8,617

    Script en max

    Sé que está mal invadir mensaje ajenos, espero que me perdonéis, y esto le puede valer a más gente, explico rápidamente, mis conocimiento de Maxscript son limitados, por otra parte los que tengo sobre max no lo son tanto, el problema es que tengo que elimimar dos layer y su contenido, no solo a un archivo, a un montón de ellos y además añadir muevos objetos a todas las escenas, para ello he creado un script donde seleccione el contenido de una carpeta con archivos max y después seleccione un archivo max que contiene objetos a hacer mergeen todos los archivos de la carpeta anteriormente citada esto funciona correctamente.

    Mi problema está en que tengo que eliminar todos los objetos contenidos en dos layers, y no he encontrado forma de seleccionar las capas, sí el contenido de estas y una vez seleccionado eliminarlo, lo malo es que para que eso funcione la capa tiene que estar activa y una vez más no encuentro la forma de hacer eso a través de Maxscript.

    Resumiendo, seleccionar un layer, marcarlo como activo y después borrar su contenido, que se borre o no el layer da igual ya que se mergeara de nuevo, el contenido es un bípedo con algún hueso de sobra, no es idéntico en todo los archivos, sé que podría seleccionar el bip y toda su jerarquía, pero me sería más seguro eliminar el contenido de la capa. Saludos y si puedes echar una mano te lo agradecería, ya sabes mi hermana aún esta de buen ver y mi novia no sé, es jovencilla y eso.

  4. #54
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Script en max

    Mi problema está en que tengo que eliminar todos los objetos contenidos en dos layers, y no he encontrado forma de seleccionar las capas, sí el contenido de estas y una vez seleccionado eliminarlo, lo malo es que para que eso funcione la capa tiene que estar activa y una vez más no encuentro la forma de hacer eso a través de Maxscript.
    Prueba con esto, debería funcionar.
    Código:
    Fn deletenodesinlayer layername = (tlocal layer = layermanager, getlayerfromname layername tif layer.= undefined do (t local nodeslist = undefined local success = layer, nodes &nodeslist if success do (t deleete nodeslist return true ) t) treturn false.
    )
    Modo de uso:
    Código:
    resultado = deletenodesinlayer mi_capa
    A la función le tienes que pasar el nombre de la capa que quieres vaciar. Y luego, cuando sale de la función, si resultado vale true es que los nodos de la capa se eliminaron correctamente. De lo contrario devolverá false (porque tal vez se haya puesto mal el nombre de la capa).
    Saludos y si puedes echar una mano te lo agradecería, ya sabes mi hermana aún esta de buen ver y mi novia no sé, es jovencilla y eso.
    Saludos.

    Posdata: he editado el código, que había un pequeño fallo.
    Última edición por HalfVector; 08-07-2006 a las 21:32

  5. #55
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,852

    Script en max

    Te vamos a hacer un monumento half. Gracias.
    E moet roeien met de riemen die je hebt.

  6. #56
    Fecha de ingreso
    Oct 2002
    Mensajes
    8,617

    Script en max

    Uno solo, que dices, en cada cuidad de España una calle con su nombre y una estatua para el. El script funciona de pu, genial, eres un crack, ese tutorial de max script que bien vendría.

    Venga tío saludos y gracias.

  7. #57
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Script en max

    De nada, me alegro que os funcione lo que he puesto a los dos. En cuanto a los tutoriales, pues nada, espero que no se retrasen demasiado, pero es que, para ir terminándolos tengo que coger una buena racha de motivación. Saludos.

  8. #58
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,852

    Script en max

    Hola, tengo otra duda, la verdad es que entre que la ayuda es más mala que yo qué sé y que soy una torpe, a ver:
    multilistbox bledingobj bleding objects: items for g in geometry collect g, name)
    On bledingobj selectionend do.
    (
    Bledinglist = bledingobj, selection.

    Print bledinglist.
    )
    Esto me da una lista con los índices del array que están seleccionados, pero lo que yo necesito son los string. Necesito pillar los nombres de los objetos seleccionados, he probado mil cosas, pero nada y no encuentro una función equivalente a.selection que en lugar de coger enteros coja string. Gracias.
    E moet roeien met de riemen die je hebt.

  9. #59
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,852

    Script en max

    Ok. La he liado bastante gorda, pero ya lo he solucionado. Gracias de todas formas.
    E moet roeien met de riemen die je hebt.

  10. #60
    Fecha de ingreso
    Mar 2004
    Mensajes
    855

    Script en max

    La cosa sería así:
    Código:
    for sel in bledingobj, selection do (tformat item #% = \%\\nSel bledingobj, items[sel].
    )
    Como ves, la propiedad Items es un array que contiene el nombre de todos los elementos de la lista. Saludos.

    Posdata: bueno, ya lo has solucionado. En cualquier caso, por si le sirve a alguien.
    Última edición por HalfVector; 09-07-2006 a las 17:19

  11. #61
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,852

    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.

  12. #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.

  13. #63
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,852

    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.

  14. #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

  15. #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

  16. #66
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,852

    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.

  17. #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

  18. #68
    Fecha de ingreso
    Dec 2004
    Mensajes
    1,852

    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 Clic en la imagen para ver su versión completa. 

Nombre: UI_03.jpg 
Visitas: 114 
Tamaño: 62.8 KB 
ID: 40554  
    E moet roeien met de riemen die je hebt.

Página 2 de 2 PrimerPrimer 12

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