2 votos

AppleScript 'elegir de la lista'. ¿Cómo puedo ejecutar un comando diferente si se eligen varias secciones?

Tengo un AppleScript que gestiona mi granja de renderización casera de After Effects. La granja se compone de tres máquinas de renderizado.

El script pide al usuario que seleccione en qué máquina(s) quiere renderizar. Toma su(s) elección(es) y ejecuta una aplicación AppleScript externa dependiendo de la(s) elección(es) que hayan hecho.

Cada aplicación externa de AppleScript ejecuta un comando que inicia un renderizado de After Effects utilizando ExtendScript así

set scriptfile to (POSIX file ("/Applications/Render Farm/Scripts/jsx/render_1.jsx"))
tell application "Adobe After Effects 2020"
    DoScriptFile scriptfile
end tell

El archivo JSX al que se ha hecho referencia indica a After Effects que inicie un renderizado en la máquina de renderizado 1. La idea del master script es que el usuario pueda seleccionar varias máquinas de renderizado e iniciarlas todas a la vez.

   set Options to {"Render Node 1", "Render Node 2", "Render Node 3"}

        set ListA to (choose from list Options with prompt "Choose items" with title "Select Stuff" with multiple selections allowed)

   if (ListA contains "Render Node 1") then
        tell application "Render Node 1 App" to activate
    end if

    if (ListA contains "Render Node 2") then
        tell application "Render Node 2 App" to activate
    end if

    if (ListA contains "Render Node 3") then
        tell application "Render Node 3 App" to activate
    end if

Mi script permite múltiples opciones para lograr esto, pero odio lo secuencial que es. After Effects tiene que recibir el primer comando AppleScript, luego ejecutar el comando JSX que ssh en la máquina de renderizado, luego abre el programa de línea de comandos aerender varias veces por máquina (cada instancia puede tardar unos 10-15 segundos en abrirse). Sólo después de que la última instancia de aerender se haya abierto, After Effects está finalmente listo para escuchar otro comando AppleScript y hacer todo de nuevo para la segunda máquina.

Sin embargo, tengo un comando JSX diferente que puede iniciar un render en todas las máquinas de render al mismo tiempo desde After Effects sin esperar. También tengo otros que pueden iniciar un render en Render Node 1 & 2, Render Node 1 & 3, y Render Node 2 & 3 (básicamente un script diferente para cada combinación.

Me gustaría hacer lo mismo dentro de mi AppleScript maestro script. Pero no quiero mostrar una lista de todas las combinaciones posibles, quiero algo que funcione de forma más elegante.

Lo que me gustaría es modificar el script maestro para que si, por ejemplo, se detectan dos selecciones entonces no ejecute dos , sólo ejecute un diferentes script.

Algo así, pero con una sintaxis que funcione

   if (ListA contains "Render Node 1" and "Render Node 2") then
        tell application "Render Node 1 & 2 App" to activate
    end if

Cuando lo ejecuto, me sale el error "No se puede convertir "Render Node 2" en tipo booleano". Pero seguro que hay una forma de conseguirlo.

También tiene que funcionar de forma inteligente. Si elijo Render Node 1 y Render Node 3 sólo debería abrir la aplicación Render Node 1 & 3 App . No quiero que también se abra Render Node 1 App o Render Node 1, 2 & 3 App .

0 votos

¿Los nombres de las combinaciones utilizan parte de las opciones (como la última palabra), o es necesario hacer coincidir las opciones con otra lista arbitraria?

1voto

David Anderson Puntos 2189

Una posible respuesta:

set choices to {"Render Node 1", "Render Node 2", "Render Node 3"}
set answer to choose from list choices ¬
    with prompt "What would you like to do?" with multiple selections allowed and empty selection allowed
if answer is not false and length of answer is not 0 then
    set delimiter to ""
    set counter to 1
    set value to "Render Node "
    repeat with appitem in choices
        if answer contains appitem then
            set value to value & delimiter & counter
            set delimiter to " & "
        end if
        set counter to counter + 1
    end repeat
    set value to value & " App"
    -- tell application value to activate
    display dialog value
end if

o tal vez:

set applist to {¬
    "Render Node 1 App", ¬
    "Render Node 2 App", ¬
    "Render Node 1 & 2 App", ¬
    "Render Node 3 App", ¬
    "Render Node 1 & 3 App", ¬
    "Render Node 2 & 3 App", ¬
    "Render Node 1 & 2 & 3 App"}
set choices to {"Render Node 1", "Render Node 2", "Render Node 3"}
set answer to choose from list choices ¬
    with prompt "What would you like to do?" with multiple selections allowed and empty selection allowed
if answer is not false and length of answer is not 0 then
    set counter to 1
    set value to 0
    repeat with appitem in choices
        if answer contains appitem then
            set value to value + counter
        end if
        set counter to counter * 2
    end repeat
    set value to item value of applist
    -- tell application value to activate
    display dialog value
end if

0 votos

Esto es muy prometedor. ¿Cómo puedo ajustarlo para que no dependa de que las aplicaciones sean siempre incrementos de "Render Node"? En realidad tienen todos nombres diferentes, lo siento. Sólo he utilizado nombres incrementales para simplificar. Gracias de nuevo.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X