|
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.
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 % |
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.
Create_INI
si existe.
Pre_Scene_Command
si existe.
Pre_Frame_Command
, si existe. Post_Frame_Command
, si existe. Post_Scene_Command
, si existe. 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.
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.
|