2012-05-19 12 views
7

Soy nuevo en blender y python. Tengo un modelo de licuadora (.blend) que quiero representar por lotes como varias imágenes que proporcionan algunas propiedades para cada imagen.Script de Python con argumentos para la línea de comando Blender

me escribió un script en Python con esos parámetros, algo así como:

import bpy 

pi = 3.14159265 
fov = 50 

scene = bpy.data.scenes["Scene"] 

# Set render resolution 
scene.render.resolution_x = 480 
scene.render.resolution_y = 359 

# Set camera fov in degrees 
scene.camera.data.angle = fov*(pi/180.0) 

# Set camera rotation in euler angles 
scene.camera.rotation_mode = 'XYZ' 
scene.camera.rotation_euler[0] = 0.0*(pi/180.0) 
scene.camera.rotation_euler[1] = 0.0*(pi/180.0) 
scene.camera.rotation_euler[2] = -30.0*(pi/180.0) 

# Set camera translation 
scene.camera.location.x = 0.0 
scene.camera.location.y = 0.0 
scene.camera.location.z = 80.0 

Así lo funciono como

blender -b marker_a4.blend --python "marker_a4.py" -o //out -F JPEG -x 1 -f 1 

Entonces, por ejemplo, si trato de utilizar argumentos al script en Python

... 
import sys 
... 
fov = float(sys.argv[5]) 
... 

y ejecutarlo:

blender -b marker_a4.blend --python "marker_a4.py" 80.0 -o //out -F JPEG -x 1 -f 1 

Se hace el render pero recibo este mensaje al inicio.

read blend: /home/roho/workspace/encuadro/renders/marker/model/marker_a4.blend 
read blend: /home/roho/workspace/encuadro/renders/marker/model/80.0 
Unable to open "/home/roho/workspace/encuadro/renders/marker/model/80.0": No such file or directory. 
... 

¿Alguien me puede decir qué está causando esto? Creo que Blender también está analizando eso como modelo, pero no entiendo por qué. Más tarde intenté algo más sofisticado para el análisis de argumentos en python (argparse) pero no funcionó en absoluto. Así que estoy pensando que podría estar sucediendo algo extraño en este nivel.

Gracias!

+0

ver las mismas preguntas en el sitio StackExchange de Blender: http: //blender.stackexchange.com/questions/6817 – ideasman42

Respuesta

8

he encontrado la solución para lo que estaba buscando en primer lugar.

Como dijo Junuxx "No se pueden pasar argumentos de línea de comando directamente a python en esta situación ..." pero en realidad PUEDE pasar argumentos a python pero en otra situación.

Así que la manera de hacer lo que quiero es hacer Y GUARDAR directamente dentro de la secuencia de comandos Python

import sys 

fov = float(sys.argv[-1]) 
... 
# Set Scenes camera and output filename 
bpy.data.scenes["Scene"].render.file_format = 'PNG' 
bpy.data.scenes["Scene"].render.filepath = '//out' 

# Render Scene and store the scene 
bpy.ops.render.render(write_still=True) 

La opción --python (o -P) tiene que estar en el extremo y se puede especificar argumentos con - y solo cargue el modelo y ejecute el script.

> blender -b "demo.blend" -P script.py -- 50 

crédito a este enlace que encontré: http://www.blender.org/forum/viewtopic.php?t=19102&highlight=batch+render

+0

Aparece un error al ejecutar este código, porque la clase RenderSettings no tiene el campo file_format. Parece que ha sido desaprobado y eliminado. ¿Hay algún trabajo alrededor? – user502144

+0

Oh, he descubierto cómo hacer esto. file_format ahora se encuentra en ImageFormatSettings, por lo que debe ser 'bpy.data.scenes [" Scene "]. render.image_settings.file_format = 'PNG'' – user502144

+0

Ok! Lo siento, me perdí tu pregunta. Si omites esa línea, se guardará en PNG de manera predeterminada. Pero si necesita otro formato, ese debería ser el camino a seguir. – roho

4

No se pueden pasar argumentos de línea de comando directamente a python en esta situación, ya que se interpretan como argumentos para blender. Una forma de evitar esto es para establecer las variables de entorno y luego llamar a la licuadora/pitón, como esto (suponiendo que está en Windows - lo mismo es posible en otros sistemas operativos, pero con una sintaxis diferente)

set arg1='foo' & set arg2='bar' & python envvar.py 

Nota : ¡no hay espacios adyacentes a los signos iguales!

En el script en Python que llamé envvar.py, puede utilizar os.getenv() para acceder a estas variables

import os 
print 'arg1 = ', os.getenv('arg1') 
print 'arg2 = ', os.getenv('arg2') 

Salida:

arg1 = 'foo' 
arg2 = 'bar' 
+0

Actualmente estoy en Linux, pero también podría usarlo en una Mac. Esta es una buena solución y funciona, pero no estoy convencido por el enfoque dependiente del sistema operativo. También estaba pensando en usar un archivo auxiliar de texto. Encontré más información aquí (es para blender 2.49 pero creo que es útil) http://www.blender.org/documentation/249PythonDoc/API_related-module.html – roho

+0

Sí, leer de un archivo de texto también funcionaría, pero pensé fue más complicado que esto. – Junuxx

Cuestiones relacionadas