5.2.4  Interfaz con el Sistema Operativo

Pre_Scene_Command=s Especifica el comando a ejecutar antes que la escena
Pre_Frame_Command=s Especifica el comando a ejecutar antes de cada fotograma
Post_Scene_Command=s Especifica el comando a ejecutar después de la escena completa
Post_Frame_Command=s Especifica el comando a ejecutar después de cada fotograma
User_Abort_Command=s Especifica el comando a ejecutar cuando el usuario cancela POV-Ray
Fatal_Error_Command=s Especifica el comando a ejecutar cuando POV-Ray da un error fatal

Nota: no existen interruptores de línea de comandos para estas opciones. Solo pueden usarse desde archivos INI.

POV-Ray te ofrece la oportunidad de mandar comandos al sistema operativo en varios puntos clave, para ejecutar otros programas o archivos de lotes. Normalmente se utiliza esta característica para manejar archivos creados por el bucle interno de animación, aunque puede usarse con cualquier escena. La cadena s es una sola línea de texto que se pasa al sistema operativo para su ejecución. Por ejemplo:

 Post_Scene_Command=tga2gif -d -m myfile

usaría la utilidad tga2gif con los parámetros -D y -M para convertir myfile.tga en myfile.gif cuando la escena acabe de trazarse.

Nota: en algunas plataformas pueden existir métodos de bloqueo de la interfaz con el sistema operativo. Por ejemplo, la versión para Windows ofrece un comando de menú para prevenir la ejecución de comandos del sistema (que es la opción por defecto). La razón para ello, al igual que para las restricciones de manejo de archivos, es intentar evitar que archivos INI de origen dudoso puedan manipular tu sistema.

5.2.4.1  Sustitución de Cadenas en Comandos del Interfaz

Puede ser desesperante tener que cambiar Post_Scene_Command cada vez que cambias el nombre de la escena. POV-Ray puede sustituir por ti varios valores en una cadena de comando. Por ejemplo:

 Post_Scene_Command=tga2gif -d -m %s

POV-Ray substituirá %s con el nombre de la escena en el comando. El nombre de la escena es el especificado con Input_File_Name o +I sin letra de unidad ni directorio ni extensión. Por ejemplo:

 Input_File_Name=c:\povray3\scenes\waycool.pov

se descompone hasta obtener el nombre de escena waycool, lo que resulta en...

 Post_Scene_Command=tga2gif -d -m waycool

En una animación, puede ser necesario obtener el nombre exacto del archivo de salida con el número de fotograma incluido. La cadena %o sustituirá al nombre del archivo de salida. Supón que quieres guardar tus archivos de salida en un archivo comprimido ZIP usando la utilidad pkzip. Podrías especificar lo siguiente:

 Post_Frame_Command=pkzip -m %s %o

Después de trazar el fotograma número 12 de myscene.pov, POV-Ray usaría la interfaz con el sistema operativo para ejecutar:

 pkzip -m myscene mysce012.tga

El interruptor -M en la llamada a pkzip mueve el archivo mysce012.tga dentro del comprimido myscene.zip y lo borra del directorio. Observa que %o incluye el número de fotograma sólo cuando se está en el bucle de animación. Durante Pre_Scene_Command y Post_Scene_Command no existe el número de fotograma, por lo que se usa el nombre original sin numerar: Output_File_Name. Cualquier User_Abort_Command o Fatal_Error_Command que no esté dentro del bucle también obtendrá una sustitución no numerada de %o.

He aquí la lista completa de sustituciones disponibles en una línea de comando:

%o Nombre del fichero de salida con extensión y número de fotograma si existe.
%s Nombre de la escena extraído, sin camino ni extensión, del nombre de entrada.
%n Número de fotograma del fotograma actual.
%k Valor del reloj para este fotograma.
%h Altura de la imagen en píxeles.
%w Anchura de la imagen en píxeles.
%% Un carácter %

5.2.4.2  Secuencia de los Comandos del Interfaz

A continuación se describe la secuencia de eventos en el bucle de animación. Las escenas no animadas se comportan exactamente igual, salvo que no existe ningún bucle.

  1. Procesar todas las opciones de archivos INI e interruptores de la línea de comandos.
  2. Abrir las salidas de mensajes de texto y ejecutar Create_INI si existe.
  3. Ejecutar Pre_Scene_Command si existe.
  4. Por cada fotograma (una sola vez en escenas no animadas):
    1. Ejecuta el comando Pre_Frame_Command, si existe.
    2. Analiza por completo el archivo de escena, abre el archivo de salida y lee los ajustes, activa la visualización, traza el fotograma, destruye todos los objetos, texturas, etc..., y cierra el archivo de salida y la visualización.
    3. Ejecuta la opción Post_Frame_Command, si existe.
    4. Vuelve al punto 4a) mientras queden fotogramas por trazar.
  5. Ejecuta Post_Scene_Command, si existe.
  6. Salir de POV-Ray.

Si el usuario interrumpe el proceso, se ejecuta User_Abort_Command, si existe. La cancelación por el usuario sólo puede ocurrir durante el análisis y trazado de la escena, dentro del paso 4b) anterior.

Si ocurre un error fatal, POV-Ray ejecuta el comando especificado en Fatal_Error_Command, si existe. En ocasiones, un error no detectado o un error de memoria pueden provocar que el programa se cuelgue, en cuyo caso no hay manera de enviar comandos al interfaz del sistema. Los errores fatales pueden ocurrir prácticamente en cualquier parte, incluyendo el momento de procesar las opciones INI o los interruptores. Si el error fatal ocurre cuando POV-Ray todavía no ha procesado la opción Fatal_Error_Command, obviamente no puede ejecutarse el comando asociado.

Observa que toda la escena se re-analiza para cada fotograma. Futuras versiones de POV-Ray puede que permitan evitar el re-análisis de partes de la escena, pero de momento todo se lee de nuevo cada vez.

Observa también que el comando especificado por Pre_Frame_Command se ejecuta antes de que la escena sea analizada. De esta manera, puedes llamar a algún programa hecho por ti que modifique o genere tus archivos .pov o .inc, si fuera necesario. Tal vez quieras generar archivos .gif o .tga para usar como mapas de imagen o de alturas en cada fotograma.

5.2.4.3  Acciones devueltas por los Comandos de Interfaz

Pre_Scene_Return=s Establece las acciones de retorno previas a la escena.
Pre_Frame_Return=s Establece las acciones de retorno previas al fotograma actual.
Post_Scene_Return=s Establece las acciones de retorno posteriores a la escena.
Post_Frame_Return=s Establece las acciones de retorno posteriores al fotograma.
User_Abort_Return=s Establece la acción de retorno para la cancelación por el usuario.
Fatal_Error_Return=s Establece las acciones de retorno en caso de error fatal.

Nota: Observa que no hay interruptores + o - disponibles para estas opciones. Sólo pueden usarse desde los archivos INI, no desde la línea de comandos.

La mayoría de sistemas operativos permite que los programas de aplicación devuelvan un código de error si algo va mal. Cuando POV-Ray ejecuta un comando del interfaz puede hacer uso de este código de error devuelto por el proceso y realizar las acciones oportunas dependiendo de si el valor es 0 o distinto de 0. POV-Ray también devuelve este tipo de códigos de error. Devuelve un 0 si funcionó con éxito, un 1 cuando se produce un error fatal, y un 2 si es el usuario quien cancela la ejecución.

Las acciones se especifican con un solo carácter para las distintas opciones ..._Return=s. Las acciones posibles son:

I ignorar el código
S saltar un paso
A saltarse todos los pasos
Q salir de POV-Ray inmediatamente
U generar una interrupción del usuario en POV-Ray
F generar un error fatal en POV-Ray

Por ejemplo, si tu Pre_Frame_Command llama a un programa que genera un height_field y esta utilidad falla, devolvería un código distinto de 0. Seguramente querrás que también POV-Ray se interrumpa. La opción Pre_Frame_Return=F causara que POV-Ray provoque un error fatal si Pre_Frame_Command devuelve un código distinto de 0.

Algunas veces, el retorno de un código distinto de 0 no es algo malo. Supón que quieres comprobar si un fotograma ya ha sido trazado. Podrías usar la acción S para saltarte ese fotograma si el archivo ya hubiera sido trazado. Muchas utilidades devuelven un error si el archivo no se encuentra. Por ejemplo:

 pkzip -V myscene mysce012.tga

le dice a pkzip que quieres ver el catálogo de myscene.zip para el archivo mysce012.tga. Si el archivo no está en el fichero comprimido, pkzip devolverá un código distinto de 0.

Sin embargo, queremos saltar si no se encuentra el archivo. Así que necesitamos invertir la acción para que salte con el código 0 y que no lo haga si es distinto de 0. Para invertir el comportamiento de una acción debes precederla con el signo "-" (observa que "!" también funciona, ya que se usa a menudo en los lenguajes de programación como operador de negación).

Pre_Frame_Return=S saltará si el código es distinto de 0 y procederá normalmente cuando sea 0. Pre_Frame_Return=-S saltará si el código es 0, y procederá normalmente si es distinto de 0.

El valor por defecto para cualquier interfaz es I, lo que significa que la acción de retorno se ignora en todos lo casos. POV-Ray procede simplemente a continuar con lo que estaba haciendo antes del comando de interfaz. Las otras acciones dependen del contexto. Puede que quieras ver la tabla de secuencias del bucle de animación que vimos en la sección anterior: "Secuencia de los Comandos del Interfaz". La acción para cada interfaz es la siguiente:

Al volver de cualquier User_Abort_Command, si existe una acción asociada...

...y has especificado... ...entonces POV-Ray...
F Convierte la cancelación de usuario en un error fatal. Ejecuta Fatal_Error_Command, si existe. Sale de POV-Ray con un código de error 1.
S, A, Q, or U Procede con la cancelación por el usuario. Sale de POV-Ray con un código de error 2.

Al recibir el retorno de cualquier Fatal_Error_Command, POV-Ray procede a ejecutar la acción asociada y se interrumpe devolviendo un código de error 1.

Al volver de cualquier Pre_Scene_Command, Pre_Frame_Command, Post_Frame_Command o Post_Scene_Commands, si hubiera alguna acción asociada...

...y hubieras especificado... ... entonces POV-Ray...
F ...convierte la cancelación por el usuario en un error fatal, ejecuta el Fatal_Error_Command, si existe, y sale con un código de error 1.
U ...genera una interrupción del usuario, ejecuta User_Abort_Command, si existe, y sale devolviendo un código de error 2.
Q ..interrumpe la ejecución de POV-Ray inmediatamente. Actúa como si POV-Ray nunca hubiera sido ejecutado. No procesa ningún otro comando de interfaz (ni siquiera Post_Scene_Command), y sale devolviendo un código de error 0.

Al volver de Pre_Scene_Command, si hay alguna acción asociada...

...y has especificado... ...entonces POV-Ray...
S ...se salta el trazado de todos los fotogramas. Actúa como si la escena hubiera completado todos los fotogramas normalmente. No ejecuta ningún Pre_Frame_Command o Post_Frame_Command. Ejecuta Post_Scene_Command, si existe y sale devolviendo un código de error 0. En la tabla del principio, supondría saltar el paso número 4.
A ...se salta toda la escena. Funciona igual que Q (abandonar). En la tabla del principio supone saltar hasta el paso número 6. Actúa como si POV-Ray nunca se hubiera ejecutado. No se ejecutan más comandos (ni siquiera Post_Scene_Command), y se interrumpe POV-Ray devolviendo un código de error 0.

Al volver de Pre_Frame_Command, si hubiera alguna acción asociada...

...y has especificado... ...entonces POV-Ray...
S ...se saltaría este fotograma. Actúa como si el fotograma actual nunca hubiera existido. No ejecuta Post_Frame_Command. Procede con el siguiente fotograma. En la tabla del principio supondría saltar los pasos 4b) y 4c), pero volviendo arriba en el paso 4d).
A ...se saltaría todos los fotograma siguientes, incluido el actual. Actúa como si la escena hubiera completado todos los fotogramas normalmente. No ejecuta ningún Post_Frame_Commands adicional. Ejecuta Post_Scene_Command, si existe, y sale de POV-Ray con un código de error 0. En la tabla del principio, supondría saltar el resto del paso 4) y proceder con el paso 5).

Al volver de Post_Frame_Command, si hay alguna acción asociada...

...y has especificado... ...entonces POV-Ray...
S or A ...se salta todos los fotogramas siguientes. Actúa como si la escena hubiera completado todos sus fotogramas normalmente. No ejecuta Post_Frame_Commands. Ejecuta Post_Scene_Command, si existe, y sale de POV-Ray con un código de error 0. En la tabla del principio supone saltar el resto del paso 4) y proceder con el paso 5).

Al volver de cualquier Post_Scene_Command, si hay alguna acción asociada y has especificado S o A, no se realiza ninguna acción. Es lo mismo que I para este comando de interfaz.