esta pregunta es sobre Blender, Python Scripting

Soy completamente nuevo en esto, así que discúlpeme por cualquier pregunta / comentario estúpido / novato.

Lo hice simple (código de 3 líneas) para que sea más fácil abordar el problema.

Lo que necesito es un código que agregue un nuevo mapa uv para cada objeto dentro de la función de bucle.

Pero este código, en cambio, agrega múltiples mapas UV nuevos a un solo objeto.

import bpy
for x in bpy.context.selected_objects:
    bpy.ops.mesh.uv_texture_add()

Que pasa estoy haciendo aqui ??

Gracias

1
othman alazzam 7 may. 2016 a las 14:40

3 respuestas

La mejor respuesta

El operador uv_texture_add es uno que solo funciona en el objeto activo actual. Puede cambiar el objeto activo configurando scene.objects.active

import bpy
for x in bpy.context.selected_objects:
    bpy.context.scene.objects.active = x
    bpy.ops.mesh.uv_texture_add()
0
sambler 8 may. 2016 a las 02:48

nota: No estoy muy familiarizada con la licuadora

Parece que las operaciones bpy.ops dependen del estado de bpy.context. El contexto también se puede anular por operación.

¿Asumo que uv_texture_add() solo funciona en un solo objeto a la vez?

Prueba algo como esto:

import bpy

for x in bpy.context.selected_objects:
    override = { "selected_objects": x }
    bpy.ops.mesh.uv_texture_add(override)

Eso debería ejecutar las operaciones como si solo se hubiera seleccionado un objeto a la vez.

Fuente:
https://www.blender.org/api/blender_python_api_2_63_17/bpy .ops.html # overriding-context

0
varesa 7 may. 2016 a las 13:59

Similar a lo que dijo Sambler, siempre uso:

for active in bpy.context.selected_objects:
    bpy.context.scene.objects.active = active
    ...

Estas dos líneas las uso más que ninguna otra cuando programo para Blender (excepto import bpy, por supuesto).

Creo que primero aprendí esto aquí si desea una buena introducción sobre cómo funciona esto:

https://cgcookiemarkets.com/2014/12/11/writing-first-blender-script/

En el artículo que usa:

# Create a list of all the selected objects
selected = bpy.context.selected_objects

# Iterate through all selected objects
for obj in selected:
    bpy.context.scene.objects.active = obj
    ...

Sus comentarios lo explican bastante bien, pero lo llevaré un paso más allá. Como sabes, Blender carece de edición de objetos múltiples incorporada, por lo que tienes objetos seleccionados y un objeto activo . El objeto activo es lo que puede y editará si intenta establecer sus valores desde python o la propia interfaz gráfica de usuario de Blender. Entonces, aunque lo escribimos de manera ligeramente diferente cada vez, el efecto es el mismo. Hacemos un bucle sobre todos los objetos seleccionados con for active in bpy.context.selected_objects, luego establecemos el objeto activo para que sea el próximo en el bucle que itera sobre todos los objetos que se seleccionan con bpy.context.scene.objects.active = active. Como resultado, todo lo que hacemos en el ciclo se realiza una vez para cada objeto en la selección y cualquier operación que hagamos en el objeto en cuestión se realiza en todos de los objetos . ¿Qué pasaría si solo usáramos la primera línea y pusiéramos nuestro código en el bucle for?

for active in bpy.context.selected_objects:
    ...

Cualquier cosa que hagamos en el ciclo se hace una vez para cada objeto en la selección pero cualquier operación que hagamos en el objeto en cuestión se hace solo en el objeto activo, pero tantas veces como haya objetos seleccionados . Es por eso que necesitamos establecer el objeto activo desde dentro del bucle.

1
JakeD 29 jul. 2016 a las 19:17