#!/usr/bin/env python # -*- coding: latin1 -*- ########################################################################## # 'pov.py' Version octubre-2009 # # Por Antonio Castro Snurmacher. (C) Octubre-2009 # Licencia de libre distribución y uso GNU GPL Ver 2.0 ########################################################################## # pov.py es capaz de entregar las animaciones directamente en formato mp4. # # Requiere S.O. Linux. y tener instaladas las utilidades: # convert de ImageMagick (para pasar a jpg) # ffmpeg (para generar el vídeo mp4) # ¡OJO! Requiere activar [Shellout Security] en /etc/povray/3.0/povray.conf # [Shellout Security] # allowed # # El autor se ofrece a resolver las dudas en http://www.ciberdroide.com # Para ello debe de introducir un comentario en el Post titulado. # 'pov.py: Utilidad para generar animaciones en Povray' ########################################################################## import sys, os global Proyecto, HomeSrc, Input_File_Name, PovPy ######################## def NewVersion(): FiBak="%s/bak/%s.pov" % (HomeSrc, Proyecto) Comando=""" mkdir bak 2> /dev/null; mv %s.5 %s.6 2> /dev/null; mv %s.4 %s.5 2> /dev/null; mv %s.3 %s.4 2> /dev/null; mv %s.2 %s.3 2> /dev/null; mv %s.1 %s.2 2> /dev/null; cp %s %s.1 2> /dev/null; """ % (FiBak,FiBak, FiBak,FiBak, FiBak,FiBak, FiBak,FiBak, FiBak,FiBak, Input_File_Name, FiBak) print Comando os.system(Comando) ################################# def Uso(CadErr): print """ %s Uso: %s [ [ ] ] 1) Proyecto: Nombre_del_proyecto (Input_File_Name=Nombre_del_proyecto.pov) 2) OutFiType: t) tga, c) tga (comprimido) n) png, p) ppm 3) Size: 0..12 0) 40x30 (4:3) =1.333 No backup 7) 640x480 (4:3) 1) 80x60 (4:3) No backup 8) 800x600 (4:3) 2) 100x75 (4:3) No backup 9) 960x540 (16:9) 3) 200x150 (4:3) 10) 1024x768 (4:3) 4) 266x200 (4:3) 11) 1280x720 (16:9) 5) 368x207 (16:9) =1.777 12) 1920x1080 (16:9) 6) 400x300 (4:3) 4) Quality: 1..11 """ % (CadErr, PovPy) sys.exit(-1) ##################################### MAIN ##################################### """ Pov.py buscará un fuente con el nombre del 'Proyecto' y la extensión .pov. Las resoluciones 200x150 o superiores crearan una copia de seguridad que será guardada en la carpeta bak mediante un sistema de rotación de versiones que conserva las últimas versiones de los fuentes usados, por si necesitamos reintentar con alguna version previa. Esta utilidad está pensada para minimizar el tecleo en la invocación de comandos del trazador Povray durante una sesión de pruebas, en la que habitualmente hay que modificar y probar varias veces. (prueba y error) Ofrece una metodología de trabajo. Cada proyecto Povray debe ubicarse en un directorio de trabajo independiente. Pov.py ha de usarse desde ese directorio de trabajo. Pov.py creará a cada invocación un fichero '.ini' adecuado en el directorio actual que será generado conforme a los parámetros especificados en la línea de comandos. En el caso de que se desée generar un fichero.ini con algunas directrices extra, bastará incluir en el directorio actual un fichero con el nombre del proyecto y la extensión '.ini_extra'. Esto puede ser util a la hora de intentar utilizar opciones no contempladas directamente en esta utilidad. (Esta funcionalidad no ha sido probada aún) Por ejemplo podría usarse para especificar: Pre_Scene_Command=s Set command before entire scene Pre_Frame_Command=s Set command before each frame Post_Scene_Command=s Set command after entire scene Post_Frame_Command=s Set command after each frame User_Abort_Command=s Set command when user aborts POV-Ray Fatal_Error_Command=s Set command when POV-Ray has fatal error Library_Path=path Output_File_Name=file Output_Alpha=bool (on/off) Pause_When_Done=(on/off) Bits_Per_Color=n """ PovPy=sys.argv[0] NumParm=len(sys.argv)-1 if NumParm !=4 and NumParm !=8 and NumParm!=10: Uso("Error en número de parámetros (%d not in [4,8,10])" % NumParm) Proyecto=sys.argv[1] HomeSrc=os.getcwd() PathProyect="%s/%s" % (HomeSrc, Proyecto) Input_File_Name="%s/%s.pov" % (HomeSrc, Proyecto) OutFileType=sys.argv[2] ## t,c,n,p (tga,tga,png,ppm) if OutFileType=='t' or OutFileType=='c': OutFiExtName='tga' elif OutFileType=='n': OutFiExtName='png' elif OutFileType=='p': OutFiExtName='ppm' else: Uso("Error: =%s not in (t,c,n,p)" % OutFileType) Output_File_Name="%s.%s" % (Proyecto, OutFiExtName) Output_File_Name_jpg="%s.jpg" % (Proyecto) Size=int(sys.argv[3]) Quality=int(sys.argv[4]) if Size not in range (0,12): # 0..12 Uso("Error: =%d not in (0..12)" % Size) if Quality not in range(1, 12): # 1..11 Uso("Error: =%d not in(1..11)" % Quality) ## Ya se hicieron todas las comprobaciones previas. ## sacar una copia de seguridad NewVersion() Tam={} Tam[0]=40,30 Tam[1]=80,60 Tam[2]=100,75 Tam[3]=200,150 Tam[4]=266,200 Tam[5]=368,207 Tam[6]=400,300 Tam[7]=640,480 Tam[8]=800,600 Tam[9]=960,540 Tam[10]=1024,768 Tam[11]=1280,720 Tam[12]=1920,1080 Width, Height = Tam[Size] LibPath='/usr/share/povray/include' # acomodar a su caso particular. ### Generación del contenido del fichero '.ini'. (parte1) Ini="""; ### (generado por pov.py) Declare=AspectRatio=%f Width=%d Height=%d Quality=%d Library_Path=%s Input_File_Name=%s.pov Output_File_Type=%s ; (t,c,n,p) Output_File_Name=%s """ % (float(Width)/float(Height),Width,Height,Quality, LibPath, PathProyect, OutFileType, Output_File_Name) ### Generación del contenido del fichero '.ini'. (parte2) Ini=Ini+"""; ### Pre_Scene_Command='rm -fr out_pov out_pov_jpg; mkdir out_pov out_pov_jpg' Post_Frame_Command='convert -quality 65 %o out_pov_jpg/%s.%n.jpg ; mv %o out_pov/%o' Post_Scene_Command='ffmpeg -f image2 -i out_pov_jpg/%s.%%d.jpg -sameq %s.mp4' Output_to_File=on verbose=on Bits_Per_Color=5 ; 5 bits (32768 colores); 8 bits (16 millones de colores) """ ### Generación del contenido del fichero '.ini'. (parte3) (Animación) if NumParm>4: # Animacion Initial_Frame=int(sys.argv[5]) Final_Frame=int(sys.argv[6]) Initial_Clock=int(sys.argv[7]) Final_Clock=int(sys.argv[8]) Ini=Ini+"""; ### Animacion Initial_Frame=%d Final_Frame=%d Initial_Clock=%d Final_Clock=%d """ % (Initial_Frame, Final_Frame, Initial_Clock, Final_Clock) ### Generación del contenido del fichero '.ini'.(parte3)(fragmento animación) if NumParm>8: # Animacion de un fragmento Subset_Start=int(sys.argv[9]) Subset_End=int(sys.argv[10]) Ini=Ini+"""; ### Fragmento animacion Subset_Start=%d Subset_End=%d""" % (Subset_Start, Subset_End) # Escribir el fichero '.ini' fi_ini=open("/tmp/%s.ini" % Proyecto, 'w') fi_ini.write(Ini) fi_ini.close() # Suplementar con los extras el fichero .ini Comando="cat %s.ini_extra /tmp/%s.ini > %s.ini 2> /dev/null" % (Proyecto, Proyecto, PathProyect) os.system(Comando) Comando="povray %s.ini" % PathProyect os.system(Comando) print Comando